記事の目的と対象読者
AWS APIゲートウェイは、AWSクラウドでAPIを構築およびデプロイするためのサービスです。本記事では、APIゲートウェイの基本概念とその利用方法を、初心者でもわかりやすく説明します。特に、Terraformを使用したインフラストラクチャーのコード化やPythonを用いたAPIの実装方法に焦点を当てます。
この記事は、AWSやAPIゲートウェイに関する基本的な知識があまりないエンジニア初心者の方、またはこれからAPIゲートウェイを使ってみたいと考えている開発者を対象としています。簡単なハンズオンを通じて、実際にAPIゲートウェイを使ったアプリケーションの開発プロセスを学ぶことができます。
AWS APIゲートウェイとは何か?
APIゲートウェイは一言で言うとAPIの入口と出口を管理するサービスです。開発者がAPIを簡単に作成・公開・保守・管理・監視できるようにするフルマネージドサービスです。開発者はバックエンドサービスへのトラフィック管理・認証・アクセス制御・モニタリングなどを簡単に行うことができます。
基本概念の紹介
APIエンドポイント
APIのエンドポイントは、外部のユーザーやシステムがAPIにアクセスするためのURLです。AWS APIゲートウェイでは、これらのエンドポイントを作成し、管理することができます。
リソースとメソッド
APIゲートウェイ内で、リソースはAPIの特定の部分(例えば、ユーザー情報や商品データなど)を指します。各リソースには、HTTPメソッド(GET、POST、PUT、DELETEなど)が関連付けられており、特定の操作を行うことができます。
統合タイプ
AWS APIゲートウェイでは、バックエンドサービス(例えば、Lambda関数、HTTPベースのバックエンドなど)へのリクエストの処理方法を定義するために、様々な統合タイプを提供しています。
APIゲートウェイの利点
スケーラビリティ
AWS APIゲートウェイは自動的にスケーリングし、大量のトラフィックを処理する能力を備えています。
セキュリティ
AWSの強力なセキュリティ機能を利用して、APIを保護することができます。これには、APIキー、IAMロール、Cognitoユーザープールなどの認証メカニズムが含まれます。
モニタリングとログ
AWS CloudWatchと統合することで、APIの使用状況、パフォーマンスメトリクス、ログデータを簡単に監視し分析することができます。
柔軟なデプロイオプション
ステージング環境やバージョン管理など、開発とデプロイメントのプロセスを効率的に管理できます。
TerraformによるAWS環境のセットアップ
このセクションでは、Terraformを使用してAWS APIゲートウェイとその関連リソースをセットアップする方法について説明します。Terraformは、インフラストラクチャーをコードとして管理するためのオープンソースツールです。インフラの設定を自動化し、一貫性と再現性を向上させることができます。
IaCについてはこちらで解説しています。
https://envader.plus/article/136
Terraformの基本
インフラストラクチャー・アズ・コード
Terraformを使用することで、インフラストラクチャーの設定をコードとして記述し、管理することができます。手動での環境設定の誤りを減らし、より効率的な開発プロセスを実現します。
Terraformやそのセットアップについてはこちらの記事で解説しています。
https://envader.plus/article/162
APIゲートウェイ用のリソースをTerraformで構築
リソースの定義
APIゲートウェイを構築するために必要なリソース(例えば、REST API、リソース、メソッドなど)をTerraformファイルに定義します。
デプロイメントプロセス
Terraformを使用してリソースを定義した後、terraform apply
コマンドを実行することで、AWSに対してこれらのリソースをデプロイします。
Pythonを使ったAPIの作成とデプロイ
ここでは、Pythonを使用してAPIのバックエンドロジックを作成し、AWS APIゲートウェイと統合する方法を説明します。Pythonは、柔軟性と簡潔な構文のため、APIの開発に広く使用されています。
PythonでのAPIロジックの記述
APIロジックの基本
PythonでAPIのバックエンドロジックを作成するには、通常、FlaskやDjangoなどのウェブフレームワークを使用します。これらのフレームワークを使用すると、リクエストを受け取り、適切なレスポンスを返すエンドポイントを簡単に設定できます。
例えば、GETメソッドの場合は、以下のコードでリソースの情報を取得するエンドポイントを作成できます。
from flask import request
def get_resource(name):
# リソースの情報取得
resource = get_resource_by_name(name)
# レスポンスを返す
return jsonify(resource)
@app.route("/resources/<name>", methods=["GET"])
def get_resource_endpoint(name):
return get_resource(name)
このコードでは、get_resource()
関数でリソースの情報を取得し、jsonify()
関数でJSON形式のレスポンスを返しています。
開発環境の準備
Python開発環境をセットアップし、必要なライブラリ(例えば flask または django)をインストールします。
具体的には、以下の手順を実行します。
- Pythonをインストールします。
- 仮想環境を作成します。
- 必要なライブラリをインストールします。
APIゲートウェイとの統合
Lambda関数の作成
APIロジックをAWS Lambda関数としてデプロイします。これによりAPIゲートウェイからのリクエストを処理できるようになります。
例えば、以下のコードで、上記のget_resource()
関数をLambda関数としてデプロイできます。
import json
def get_resource(event, context):
name = event["name"]
resource = get_resource_by_name(name)
return {"resource": resource}
lambda_handler = get_resource
このコードでは、event
オブジェクトにリクエストの情報が、context
オブジェクトにコンテキスト情報が含まれています。get_resource()
関数でリソースの情報を取得し、return
文でJSON形式のレスポンスを返しています。
APIゲートウェイとの統合
AWS APIゲートウェイを設定して、特定のエンドポイントをLambda関数に統合します。APIゲートウェイがリクエストを受け取った際に、それをLambda関数に転送し、処理させることができます。
具体的には、以下の手順を実行します。
- APIゲートウェイの定義ファイルを作成します。
- 定義ファイルで、Lambda関数を統合するエンドポイントを定義します。
- APIゲートウェイをデプロイします。
デプロイとテスト
デプロイプロセス
作成したLambda関数をAWSにデプロイし、APIゲートウェイと統合します。これには、AWS管理コンソールまたはAWS CLIを使用することができます。
APIのテスト
APIゲートウェイを通じてエンドポイントにリクエストを送信し、期待されるレスポンスが返ってくるかどうかをテストします。これには、Postmanやcurlなどのツールを使用できます。
セキュリティとベストプラクティス
AWS APIゲートウェイを使用する際、セキュリティは極めて重要です。このセクションでは、APIゲートウェイのセキュリティ強化と、最適な運用方法について説明します。
認証と認可
APIキー
APIキーは、APIの使用を制御し、非公開のAPIにアクセスするためのシンプルな方法です。APIキーを使用することで、特定のユーザーまたはサービスがAPIを使用できるように制限します。
IAMロールとポリシー
AWSのIAM(Identity and Access Management)を使用して、APIへのアクセスを管理することができます。特定のユーザーやサービスに対して、細かいアクセス権を設定することができます。
Cognitoユーザープール
AWS Cognitoはユーザー認証と認可を管理するサービスで、APIへのアクセスをセキュアに制御するために使用されます。
APIのセキュリティ対策
リクエストの検証
APIゲートウェイはリクエストの検証を行い、不正なリクエストや攻撃を防ぐことができます。これには、リクエストの形式やサイズの検証が含まれます。
クロスオリジンリソース共有(CORS)
CORSは、ウェブページが異なるオリジンのリソースにアクセスする際のセキュリティを提供します。APIゲートウェイでCORSを適切に設定することが重要です。
パフォーマンスとコストの最適化
キャッシング
APIゲートウェイのレスポンスキャッシングを使用すると、バックエンドシステムへの負荷を減らし、レスポンス時間を短縮できます。
スロットリング
APIの使用率を制御するために、リクエストレートの制限(スロットリング)を設定することができます。過度のトラフィックによるシステムの過負荷を防ぐことができます。
実際の例をハンズオンで学ぶ
このハンズオンでは、PythonとTerraformを使用して、シンプルなHTTP APIをAWS APIゲートウェイで作成し、Lambda関数を統合するプロセスを実演します。
1. TerraformでAPIゲートウェイのセットアップ
Terraform設定ファイル (api_gateway.tf
)
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_api_gateway_rest_api" "MyDemoAPI" {
name = "MyDemoAPI"
description = "This is my API for demonstration purposes"
}
resource "aws_api_gateway_resource" "MyDemoResource" {
rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id
parent_id = aws_api_gateway_rest_api.MyDemoAPI.root_resource_id
path_part = "mydemo"
}
resource "aws_api_gateway_method" "MyDemoMethod" {
rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id
resource_id = aws_api_gateway_resource.MyDemoResource.id
http_method = "GET"
authorization = "NONE"
}
resource "aws_api_gateway_integration" "LambdaIntegration" {
rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id
resource_id = aws_api_gateway_resource.MyDemoResource.id
http_method = aws_api_gateway_method.MyDemoMethod.http_method
integration_http_method = "POST"
type = "AWS_PROXY"
uri = aws_lambda_function.MyDemoLambda.invoke_arn
}
lambda.tf
Iamロール・ポリシーも指定していますが、適切なものに書き換えてください。
data "archive_file" "sample_function" {
type = "zip"
source_dir = "lambda/sample_function" # Lambda関数のコードが含まれるディレクトリ
output_path = "lambda/upload/sample_function.zip" # 出力されるZIPファイルのパス
}
resource "aws_lambda_function" "MyDemoLambda" {
function_name = "MyDemoLambda"
handler = "lambda_function.lambda_handler" # Pythonファイルと関数名を指定
runtime = "python3.10" # ランタイムを指定
# Lambda関数のコードを含むZIPファイルのパスを指定
filename = data.archive_file.sample_function.output_path # ZIPファイルのパス
# Lambda関数に必要なIAMロールのARNを指定
role = aws_iam_role.lambda_exec.arn
}
resource "aws_iam_role" "lambda_exec" {
name = "lambda_exec_role"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Action = "sts:AssumeRole",
Effect = "Allow",
Principal = {
Service = "lambda.amazonaws.com"
},
},
],
})
}
# 必要に応じて、IAMポリシーを追加してLambda関数の権限を拡張
resource "aws_iam_role_policy" "lambda_policy" {
name = "lambda_policy"
role = aws_iam_role.lambda_exec.id
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Action = [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
Effect = "Allow",
Resource = "arn:aws:logs:*:*:*"
},
],
})
}
2. PythonでLambda関数の作成
lambda/sample_function
配下にlambda_function.py
ファイルを作成してください。
Lambda関数 (lambda_function.py
)
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
3. デプロイとテスト
-
Terraformを使用してAPIゲートウェイとLambda関数をデプロイします。
terraform init terraform apply
-
Postmanやcurlを使用して、作成したAPIエンドポイントにリクエストを送信し、レスポンスを確認します。
curl https://<api-id>.execute-api.<region>.amazonaws.com/mydemo
まとめ
この記事では、AWS APIゲートウェイの基本から、ハンズオンまでを一通り学びました。
学んだことの要約は、次のとおりです。
- AWS APIゲートウェイの基本概念とその利点
- Terraformを使用してインフラストラクチャをコード化する方法
- Pythonを用いてAPIのバックエンドロジックを実装する方法
- APIゲートウェイのセキュリティ対策とベストプラクティス
- ハンズオンを通じたAPIの作成とデプロイ
API開発はエンジニアへの第一歩となりますので、ハンズオンで学んだことを活かし自分オリジナルのAPIを作成してみましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.06.17
【Terraformハンズオン】AWS CloudFront&ALB構成を実現しよう
この記事では、CloudFrontとは何かを解説し、IaC(Infrastructure as Code)を実現するためのツールであるTerraformを使ってCloudFrontを構築するまでのハンズオンを行います。
- AWS
- ハンズオン
- Terraform
2024.05.25
AWS Lambdaで未使用Elastic IP (EIP)を自動チェックして通知する方法
みなさん、AWSのコスト削減やっていますでしょうか?今回はうっかり見落としがちな、EIPの消し忘れを通知する仕組みをご紹介します。
- AWS
2024.05.03
負荷分散実践!TerraformでAWSのALB(Application Load Balancer)構築ハンズオン
この記事では、Terraformを利用して4つあるELBサービスのうち、ALB(Application Load Balancer)の構築方法を解説します。
- AWS
- ハンズオン