API Gateway×LambdaでREST API構築入門

AWS

はじめに

本記事では、API GatewayとAWS Lambdaを組み合わせて、サーバーレスAPIを構築する方法をステップバイステップで解説します。

本記事で作る構成の概要

以下のような構成を作成します

  • ユーザーが https://...にアクセス
  • API Gateway が HTTP リクエストを受け取る
  • リクエストは Lambda 関数に転送される
  • Lambda 関数が処理し、レスポンスを返す
  • レスポンスは API Gateway 経由でユーザーに返される

この構成は、フロントエンドやモバイルアプリのバックエンドとしても活用でき、サーバー管理不要でスケーラブルなAPI基盤となります。

想定読者

  • AWSを使ってWeb APIを構築したいエンジニア
  • LambdaやAPI Gatewayの使い方を実践的に学びたい方

プログラミング初心者でも、Pythonの基本が分かっていれば問題ありません。

使用サービス一覧

サービス用途
API GatewayHTTPリクエストの受け口
AWS Lambdaリクエストに応じたロジックの実行
IAMLambdaとAPI Gatewayに必要な権限管理

構成図(アーキテクチャ図)

本記事で構築する環境は、API GatewayAWS Lambdaを中心としたシンプルなサーバーレス構成です。

リクエストフロー

  1. クライアントが API Gateway のエンドポイントに リクエストを送信
  2. API Gateway がリクエストを受け取り、Lambda 関数をトリガー
  3. Lambda 関数が処理を実行し、レスポンスを生成
  4. レスポンスが API Gateway 経由でクライアントに返却される

この流れによって、サーバーレスかつスケーラブルなAPIエンドポイントを提供することが可能です。

必要リソースの関係性

以下のリソースが連携して動作します

リソース役割
API Gatewayクライアントからのリクエストの受付
Lambda 関数リクエスト処理ロジックを実行
IAM ロールLambda が正しく実行されるための権限設定

Lambda 関数の作成

関数の作成方法(はじめに選ぶオプション)

今回は1から作成します。

オプション説明
一から作成Hello World のコードから始める最もシンプルな方法。テンプレなし。
設計図の使用事前に用意されたテンプレートを使って、SNS通知・S3連携などのユースケースに対応
コンテナイメージDockerで作成したコンテナをLambdaにデプロイ。Node.jsやPython以外も使用可。

基本的な情報

今回の設定内容は下記です。詳しい内容はこの後の項目に記載します。基本的な Lambda アクセス権限で新しいロールを作成

項目推奨設定
関数名my-api-function
ランタイムPython 3.12
アーキテクチャx86_64
実行ロール基本的なLambdaロールを新規作成
その他関数URL:オフ、VPC:未設定、タグ:未設定

関数名

  • 関数の一意な名前(例:my-api-function
  • 半角英数字、ハイフン(-)、アンダースコア(_)のみ使用可能
  • 長さ:1~64文字

ランタイム情報

  • 使用する言語を選択します(例:Python 3.12, Node.js 18.x など)
  • Webコンソールでは、Python / Node.js / Rubyのみエディタ対応
  • その他の言語(Java, Go など)も zipアップロードやSAM経由で利用可能

アーキテクチャ情報

オプション説明目安
x86_64通常の64ビットCPU。互換性が高い。迷ったらこれ
arm64Graviton2ベースのCPU。低コスト・高性能(最大20%安い)ARM対応ライブラリを使える人向け

アクセス権限(実行ロール)

Lambda関数が他のAWSリソースにアクセスするためのIAMロールを指定します。

設定項目説明
基本的な Lambda アクセス権限で新しいロールを作成CloudWatch Logs にログを書き込む最小限の権限ロールが自動作成されます。初心者向け。
既存のロールを使用するすでにIAMで作ったロールを使う。複数の関数で同じロールを共有したいときに便利。
AWS ポリシーテンプレートから新しいロールを作成権限テンプレを選んでロールを自動作成。S3アクセス付き、VPCアクセス付きなどが選べる。

CloudWatch Logs へ出力するための権限はデフォルトロールで十分です。

その他の構成(オプション)

機能説明
コード署名コードに署名を施し、信頼されたソースからの変更であることを保証(セキュリティ強化向け)
KMSによる暗号化Lambdaコードを暗号化する際にカスタムKMSキーを使う設定。より厳密なセキュリティ管理が必要なときのみ。
関数URLの有効化Lambda単体でHTTP(S)エンドポイントを持てる機能。API Gateway不要で簡単なAPIを作れる。
タグの設定key=value 形式のメタ情報。課金管理・リソース分類に使われます。
VPCへの接続LambdaをVPC内のリソース(RDSなど)と連携させるときに設定。VPC・サブネット・セキュリティグループが必要。

サンプルコード作成~デプロイ

今回は初期値関数を利用します。
更新してdeployしたい場合、lambda_function.pyを更新して、Deployボタンを押下します。

def lambda_handler(event, context):
    return {
        "statusCode": 200,
        "body": "Hello from Lambda"
    }

APIGatewayの構築

APIの作成

APIGatewayにアクセスして、APIを作成をクリックします。

API種類の選択

今回はRestAPIを選択します。

種類に関しては下記があります。

タイプ主な用途特徴対応バックエンドCORS/OAuth2使用例
HTTP API通常のWeb API軽量・高速・安価Lambda、HTTPOIDC/OAuth2・CORSをネイティブサポートスマホアプリのAPI、SPAのバックエンド
REST API高度なAPI制御が必要高機能・細かく制御可・やや高コストLambda、HTTP、AWSサービス自分で設定(手動)外部開発者に公開するAPI、APIキー管理が必要なサービス
REST API(プライベート)VPC内限定APIREST APIと同等だが、外部アクセス不可Lambda、HTTP、AWSサービス手動社内業務システム、非公開バックエンド
WebSocket APIリアルタイム通信が必要双方向通信、接続維持型Lambda、HTTP、AWSサービス(そもそもRESTではない)チャット、通知、リアルタイムダッシュボード

API の詳細

REST API を新規作成する方法を選ぶセクションです。
選択肢は下記がありますが、今回は新しいAPIを選択します。

オプション説明
新しい API一から新しい REST API を作成します(通常はこれを選択)。
既存の API のクローンを作成すでに存在する API をコピーして新しく作成します(設定を再利用したい場合に便利)。
API をインポートOpenAPI 仕様(YAMLまたはJSON形式のAPI定義ファイル)からAPI構成を取り込みます。
サンプル APIAWS が提供するサンプル API(例:ペットストアAPI)を使ってAPI Gatewayの動作を試すことができます。

API 名

  • このREST APIの任意の名前を入力します(例:my-sample-api)。
  • 管理画面やCLIでこの名前を使って識別できます。

説明(オプション)

  • APIの目的や機能などの説明を入力できます。
  • ドキュメント代わりに書いておくと便利ですが、空でも問題ありません。

API エンドポイントタイプ

API Gatewayのエンドポイントがどのようにアクセスされるかを決定します。
今回はリージョンを選択します。

種類説明使用例
リージョンAPIは現在のAWSリージョン(例:東京 ap-northeast-1)に作成され、そこからリクエストを処理します。社内ツール、地理的に近いユーザー向け
エッジ最適化AWS CloudFront経由でリクエストを最寄りのリージョンに中継。グローバル配信向けで、低レイテンシが実現できます。世界中のユーザーに提供するサービス
プライベートAPIはVPC内部のみで使用され、外部からアクセスできません。社内限定システムやセキュアな業務API

通常の公開APIなら「リージョン」または「エッジ最適化」、VPC内用途なら「プライベート」を選びます。

IP アドレスのタイプ

API Gateway エンドポイントがサポートする IP アドレスの種類を選びます。
今回はIPv4を選択します。

オプション説明
IPv4標準の IPv4 アドレスでアクセス(一般的な選択)
デュアルスタックIPv4 + IPv6 両対応(IPv6対応が必要な場合に選択)

メソッドを作成

メソッド作成をクリックします。

今回の作成内容

項目設定例
メソッドタイプGET
統合タイプLambda 関数
Lambda プロキシ統合有効
認可なし
リクエストバリデーターなし
APIキーなし
タイムアウトデフォルト(29000)

メソッドタイプ

  • APIで使用する HTTPメソッドの種類 を選びます。
メソッド用途例
GETデータ取得(例:記事一覧の取得)
POSTデータ登録・送信(例:新規ユーザー作成)
PUTデータの上書き更新
DELETEデータ削除
PATCHデータの一部を更新

統合タイプ(Integration Type)

API Gateway からリクエストをどこへ送るか、バックエンドの種別を選びます。

統合タイプ説明
Lambda 関数AWS Lambda にリクエストを転送(一般的)
HTTP外部APIや自社サーバーと接続
Mock実際の処理なしで、API Gatewayが固定のレスポンスを返す
AWS のサービスS3やSNSなどのAWSサービスに直接アクセス
VPC リンクVPC内のPrivateなHTTPエンドポイントに接続(例:社内のFargate)

Lambda プロキシ統合

  • 有効にすることで、Lambdaにリクエスト全体(event)をJSON形式で渡せるようになります。
  • 有効化しない場合、パラメータを個別マッピングしなければならず面倒です。

Lambda 関数の指定

  • 統合タイプが「Lambda 関数」のときに指定する。
  • 名前またはARNで指定。
  • 他アカウントのLambda関数もARN指定で利用可能。

リージョン(例:ap-northeast-1)

  • Lambda 関数が配置されている AWSリージョン を指定。

統合のタイムアウト

  • LambdaやHTTPバックエンドが応答するまで最大待つ時間(ミリ秒)
  • デフォルトは最大29,000ミリ秒(=29秒)。
  • 処理が遅い場合は値を上げると良いが、Lambdaの最大実行時間(15分)を超えないように注意

認可(Authorization)

APIにアクセスするユーザーの制限方法を指定。

種類内容
なし認証なしで誰でも呼べる(テスト用・公開API)
IAMIAM認証(SigV4署名)を使う
Cognito ユーザープールCognitoを使ってユーザー認証
Lambda オーソライザーLambdaで独自の認証処理を実装

リクエストバリデーター

APIリクエストの検証レベルを設定。

種類説明
なしバリデーションしない
パラメータの検証クエリ・ヘッダー・パスパラメータだけ検証
本文とパラメータの検証リクエスト本文(JSON)も含めて検証

APIキーの必須チェック

  • オンにすると、APIキーを持っていないユーザーはアクセス不可になります。
  • 管理者向けAPIや有料APIに使う。

オペレーション名(任意)

  • メソッドにわかりやすい名前をつけて管理(ドキュメント用)。

例:createUser, getUserById など

URL クエリ文字列パラメータ

  • /api/items?limit=10 のようなクエリパラメータをAPI仕様として明示的に定義。
  • バリデーションやマッピングに使用。

HTTP リクエストヘッダー

  • 必須ヘッダー(例:Authorization, X-Custom-Header)を定義。

リクエスト本文(Model)

  • JSONなどのリクエストボディ構造をスキーマとして定義できます。
  • 定義することでバリデーションやOpenAPIエクスポートが明確になります。

デプロイ

リソース画面でAPIをデプロイをクリック

ステージから新しいステージを選択

ステージ名など内容は任意で記載

デプロイをクリックするとデプロイされます。

動作確認

ステージ画面でurlを確認できます。
そのurlをcurlコマンドを叩くと、Hello from Lambdaが出力されたら成功です。

Screenshot
curl {url}
# → Hello from Lambda

まとめ

本記事では、API GatewayとAWS Lambdaを組み合わせたサーバーレスAPIの構築方法を解説しました。

業務ではインフラはコード化することが一般的なので、今度はコード化とCI/CD構築を解説できたらと思います。

コメント

タイトルとURLをコピーしました