aws apigatewayv2コマンドでHTTP APIを設計する方法|Lambda統合・Cognitoオーソライザー・スロットリングの実践構成

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)AWS(Amazon Linux) > aws apigatewayv2コマンドでHTTP APIを設計する方法|Lambda統合・Cognitoオーソライザー・スロットリングの実践構成
「Lambda関数は書けるが、インターネットからどうやって呼び出せばいいか分からない」
「EC2を常時起動してAPIサーバーを置くのはコストがかかりすぎる」

AWS LambdaはHTTPリクエストを直接受け付ける機能を持っていません。そのため「玄関口」となるAPI Gatewayが必要です。API GatewayはHTTPSリクエストを受け取ってLambdaに渡し、レスポンスをクライアントへ返すフルマネージドのAPIゲートウェイサービスです。EC2不要・常時起動不要で、リクエストがない間はコストが発生しません。

この記事では、HTTP API(V2)をaws apigatewayv2コマンドで構築する実践手順を解説します。REST APIとHTTP APIの選び方、Lambdaプロキシ統合のコードパターン、Cognitoオーソライザーによる認証設計、スロットリングとログ設定まで、Amazon Linux 2023(EC2またはCloudShell)で動作確認しながら解説します。

この記事のポイント

・HTTP API(V2)はREST APIより70%安く、aws apigatewayv2コマンドで一気に構築できる
・Lambdaプロキシ統合ではstatusCode+bodyを返す形式を守ることが最重要
・CognitoオーソライザーでJWT認証をLambda不要で設定できる
・スロットリングとアクセスログは本番公開前に必ず設定する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

API GatewayがなぜLambdaに必要か

Lambda関数は「イベント駆動」で動作します。S3アップロード・DynamoDB変更・CloudWatchスケジュールなど、さまざまなイベントで起動できますが、インターネットのHTTPリクエストを直接受け付ける機能はLambda自体には備わっていません

API Gatewayはその「玄関口」として機能します。

API Gateway:HTTPSエンドポイントの提供・認証・スロットリング・ログ管理を担当
Lambda:ビジネスロジックの実行(EC2不要・常時起動不要)

リクエストがない間はAPI GatewayもLambdaもコストがかかりません。月間100万リクエスト未満ならAWS無料枠(12ヶ月)でまかなえます。EC2を常時起動してNginx+アプリサーバーを置く従来型と比べると、運用コストの差は明確です。

REST APIとHTTP APIの違いと選び方

API Gatewayには3種類あります。REST API(V1)、HTTP API(V2)、WebSocket APIです。新規開発ではまずREST APIかHTTP APIかを選ぶ判断が必要です。

1. REST API(V1):フル機能・高コスト

2013年から提供されている元祖API Gatewayです。

料金:東京リージョンで100万リクエストあたり約4.25USD
特徴:APIキー発行と使用量プラン、リクエスト検証、モデルスキーマ定義、細かなキャッシュ設定が可能
向いているケース:既存システムとの統合が多く段階的リリース管理が必要な場合、APIキーによる外部パートナー向け公開が必要な場合

2. HTTP API(V2):軽量・低コスト・推奨

2019年に登場した新世代です。REST APIの機能を絞り込む代わりに、コストを大幅に下げています。

料金:東京リージョンで100万リクエストあたり約1.29USD(REST APIの約70%安)
特徴:JWTオーソライザー(Cognito含む)をネイティブサポート、レイテンシが低い、CORS設定が簡単
向いているケース:新規のモバイルアプリ・SPA向けAPI、Lambda関数を公開するだけのシンプルな構成

3. 選び方の判断基準

比較項目 REST API(V1) HTTP API(V2)
料金(100万req) 約4.25USD 約1.29USD
Lambda統合方式 プロキシ / カスタム プロキシのみ
JWT認証 Lambdaオーソライザーが必要 ネイティブサポート
CORS設定 手動設定が必要 作成時にオプション指定可
APIキー発行 サポート 非サポート
新規開発ではHTTP APIをデフォルトに選ぶのがAWS推奨です。REST API固有の機能(APIキー発行・使用量プラン・細かなリクエスト変換)が必要な場合だけREST APIを選びます。

aws apigatewayv2コマンドでHTTP APIを構築する

1. Lambdaプロキシ統合のコードパターンを理解する

HTTP APIとLambdaの統合は「プロキシ統合」のみです。HTTPリクエスト全体がeventオブジェクトとしてLambdaに渡され、Lambda側でレスポンスを組み立てます。statusCodeとbodyを必ず返すことが最重要ルールです。

# HTTP API(V2)向けLambdaハンドラー(Python 3.12) import json def lambda_handler(event, context): # パスとメソッドを取得 path = event.get('rawPath', '/') method = event.get('requestContext', {}).get('http', {}).get('method', 'GET') # クエリパラメータを取得(未指定時は空dict) params = event.get('queryStringParameters') or {} # リクエストボディを取得(POST/PUT時) body = event.get('body', '') # statusCode + body が必須(これがないと502 Bad Gatewayになる) return { "statusCode": 200, "headers": {"Content-Type": "application/json"}, "body": json.dumps({"message": "Hello from Lambda", "path": path}) }

2. HTTP APIをCLIで一気に構築する

以下の手順でHTTP API作成からデプロイまでを通しで実行します。Amazon Linux 2023のCloudShellまたはEC2(IAMロール付き)で動作確認しています。

# ステップ1: Lambda関数をデプロイ zip function.zip lambda_function.py aws lambda create-function \ --function-name my-api-handler \ --runtime python3.12 \ --role arn:aws:iam::123456789012:role/lambda-basic-role \ --handler lambda_function.lambda_handler \ --zip-file fileb://function.zip # ステップ2: HTTP APIを作成(CORS設定込み) aws apigatewayv2 create-api \ --name my-http-api \ --protocol-type HTTP \ --cors-configuration \ AllowOrigins='["https://example.com"]',AllowMethods='["GET","POST"]',AllowHeaders='["Content-Type","Authorization"]' # 出力例: # { # "ApiId": "abc12345", # "ApiEndpoint": "https://abc12345.execute-api.ap-northeast-1.amazonaws.com", # ... # } # ステップ3: Lambda統合を作成 aws apigatewayv2 create-integration \ --api-id abc12345 \ --integration-type AWS_PROXY \ --integration-uri arn:aws:lambda:ap-northeast-1:123456789012:function:my-api-handler \ --payload-format-version 2.0 # IntegrationId を控える: "IntegrationId": "xyz78901" # ステップ4: ルートを作成(GET /items にマッピング) aws apigatewayv2 create-route \ --api-id abc12345 \ --route-key "GET /items" \ --target "integrations/xyz78901" # ステップ5: $defaultステージを作成してauto-deploy有効化 aws apigatewayv2 create-stage \ --api-id abc12345 \ --stage-name '$default' \ --auto-deploy # ステップ6: Lambdaの呼び出し権限をAPI Gatewayに付与 aws lambda add-permission \ --function-name my-api-handler \ --statement-id allow-api-gateway \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:ap-northeast-1:123456789012:abc12345/*"

デプロイ後、ApiEndpointのURLにcurlでリクエストを送信して動作確認します。

# 動作確認 curl https://abc12345.execute-api.ap-northeast-1.amazonaws.com/items # レスポンス例 {"message": "Hello from Lambda", "path": "/items"}

3. ステージとデプロイの設計

本番運用では環境(dev/stg/prod)をステージで分けます。

$defaultステージ:auto-deployを使うとルートやLambda統合の変更が即時反映される。開発中や検証環境に向いている
手動ステージ(prod/staging):明示的にデプロイを実行しないと変更が反映されない。ステージング確認→本番リリースのフローに向いている

AWSでのLinuxサーバー構築全体の流れを把握したい方は、AWS(Amazon Linux)入門ガイドも合わせて参照してください。

認証・認可の設計パターン3選

外部に公開するAPIには認証が必須です。API Gatewayは3種類の認証方式をサポートしています。

1. JWTオーソライザー(Cognito連携・新規開発の推奨)

HTTP APIではCognitoユーザープールが発行するJWTトークンを、API Gateway側でネイティブに検証できます。Lambdaを追加で書く必要がなく、設定のみで認証が完結します。

# Cognitoユーザープールを確認 aws cognito-idp list-user-pools --max-results 10 \ --query 'UserPools[*].[Id,Name]' --output table # JWTオーソライザーを作成(Cognito連携) aws apigatewayv2 create-authorizer \ --api-id abc12345 \ --name cognito-jwt-auth \ --authorizer-type JWT \ --identity-source '$request.header.Authorization' \ --jwt-configuration \ Audience=your-app-client-id,Issuer=https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_XXXXXXXXX # 出力から AuthorizerId を控える: "AuthorizerId": "auth9012" # ルートにオーソライザーを適用 aws apigatewayv2 update-route \ --api-id abc12345 \ --route-id route-id \ --authorization-type JWT \ --authorizer-id auth9012

クライアントはリクエストヘッダーに Authorization: Bearer {Cognitoのアクセストークン} を含めて送信します。トークンが無効または期限切れの場合は401 Unauthorizedが返ります。

2. IAM認証(AWSサービス間・管理者用途)

他のAWSサービス(EC2・ECS・Lambda)やAWS CLIからAPIを呼び出す場合はIAM認証が適しています。SigV4署名によってAWSアカウント内のIAMロールで認証します。

向いているケース:マイクロサービス間の内部API、管理者専用エンドポイント
注意点:クライアント側にAWS SDKまたはSigV4署名の実装が必要。ブラウザからの直接呼び出しには向かない

3. Lambdaオーソライザー(カスタム認証ロジック)

APIキーや独自トークン・Basic認証など、JWTとIAM認証以外が必要な場合に使います。リクエストヘッダーのトークンを受け取り、許可または拒否のIAMポリシーを返すLambda関数を別途作成します。

向いているケース:既存の認証基盤(社内LDAPや独自JWT)とのブリッジが必要な場合
注意点:Lambdaオーソライザー自体がリクエストのたびに起動するため、レスポンスタイムに影響する。キャッシュ設定(TTL)で緩和できる

API設計の「なぜそうするか」が分かると、AWSが一段上に見える

API GatewayとLambdaのつなぎ方は調べれば出てきます。でも「REST APIとHTTP APIをなぜ使い分けるのか」「Cognitoとの統合でどこが詰まりやすいか」を自信を持って説明できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、AWSを含む現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

スロットリングとアクセスログの設計

API Gatewayはデフォルトでスロットリング制限があります。アカウント全体のデフォルト上限は10,000リクエスト/秒(バースト5,000)です。それを超えると429 Too Many Requestsが返ります。本番運用では、特定のAPIに対して上限を明示的に設定し、アクセスログを有効化しておくことが重要です。

# CloudWatch Logsのロググループを作成 aws logs create-log-group \ --log-group-name /aws/apigateway/my-http-api # スロットリングとアクセスログを同時に設定 aws apigatewayv2 update-stage \ --api-id abc12345 \ --stage-name '$default' \ --default-route-settings \ ThrottlingBurstLimit=200,ThrottlingRateLimit=100 \ --access-log-settings \ DestinationArn=arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/apigateway/my-http-api # 現在のスロットリング設定を確認 aws apigatewayv2 get-stage \ --api-id abc12345 \ --stage-name '$default' \ --query 'DefaultRouteSettings' # アクセスログを確認 aws logs filter-log-events \ --log-group-name /aws/apigateway/my-http-api \ --limit 20 \ --query 'events[*].message'

アクセスログにはリクエスト元IP・パス・ステータスコード・レスポンス時間が記録されます。エラー率が上昇した際の原因調査に不可欠な設定です。ログフォーマットは $context.identity.sourceIp $context.httpMethod $context.routeKey $context.status などのコンテキスト変数で細かく制御できます。

API Gatewayの高可用性設計

API Gatewayはリージョン内でマルチAZ構成を内部で自動的に維持するフルマネージドサービスです。利用者がマルチAZ設定を意識する必要はありません。1つのAZで障害が発生しても、他のAZのAPI Gatewayインスタンスが自動的にリクエストを処理します。

Lambda関数も同様にAWS側でマルチAZ冗長化が管理されています。ただし、以下の2点は設計で考慮が必要です。

コールドスタートの管理:Lambdaがしばらく未使用だと、次のリクエスト時にコンテナ起動で数百ms~数秒の遅延が発生する。本番ではProvisioned Concurrencyで常時ウォームアップする
エンドポイントタイプの選択:「リージョナル」(同一リージョンからの利用・デフォルト)と「エッジ最適化」(CloudFront経由でグローバル配信)の2種類がある。グローバルに公開するAPIにはエッジ最適化が低レイテンシになる

マルチリージョン冗長を考慮する場合は、Route 53のフェイルオーバールーティングと組み合わせ、複数リージョンにAPI Gatewayをデプロイする構成が基本です。AWS環境でのLinuxサーバー構築・運用をさらに深く学びたい方は、AWS(Amazon Linux)の基礎から実践まで解説した入門ガイドもあわせて参照してください。

トラブルシュート|よくあるエラーと対処法

1. 「502 Bad Gateway」が返る

Lambda関数のレスポンス形式が正しくない場合に発生します。statusCodeとbodyが含まれているか確認してください。

# Lambda関数のログでエラー詳細を確認 aws logs filter-log-events \ --log-group-name /aws/lambda/my-api-handler \ --filter-pattern ERROR \ --limit 10 \ --query 'events[*].message' # NG: statusCodeなしのレスポンスは502になる return {"message": "OK"} # OK: statusCodeとbodyが必須 return { "statusCode": 200, "body": json.dumps({"message": "OK"}) }

2. 「403 Forbidden」でAPI呼び出しができない

Lambdaの呼び出し権限がAPI Gatewayに付与されていない場合です。aws lambda get-policyで確認し、権限がない場合はadd-permissionで付与します。

# Lambda関数の権限ポリシーを確認 aws lambda get-policy \ --function-name my-api-handler \ --query 'Policy' --output text | python3 -m json.tool # 権限がない場合は追加 aws lambda add-permission \ --function-name my-api-handler \ --statement-id allow-apigw-invoke \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com

3. 「401 Unauthorized」でJWT認証が通らない

Cognitoオーソライザーの設定ミスかトークン期限切れが原因です。

・JWTオーソライザーのIssuer URLがCognitoユーザープールのエンドポイント(https://cognito-idp.リージョン.amazonaws.com/プールID)と完全一致しているか確認する
・Audienceがアプリクライアントのclient-idと一致しているか確認する
・リクエストヘッダーがAuthorization: Bearer {トークン}の形式になっているか確認する
・トークン自体の有効期限をaws cognito-idpコマンドかjwt.ioで確認する

本記事のまとめ

aws apigatewayv2コマンドでHTTP APIを設計する際のポイントをまとめます。
やりたいこと コマンド
HTTP APIを作成する aws apigatewayv2 create-api --name api-name --protocol-type HTTP
Lambda統合を作成する aws apigatewayv2 create-integration --api-id ID --integration-type AWS_PROXY --integration-uri 関数ARN --payload-format-version 2.0
ルートを作成する aws apigatewayv2 create-route --api-id ID --route-key "GET /items" --target integrations/統合ID
JWTオーソライザーを設定する aws apigatewayv2 create-authorizer --api-id ID --authorizer-type JWT --jwt-configuration Audience=クライアントID,Issuer=CognitoURL
スロットリングとログを設定する aws apigatewayv2 update-stage --api-id ID --stage-name '$default' --default-route-settings ThrottlingRateLimit=100
Lambda呼び出し権限を付与する aws lambda add-permission --function-name 関数名 --action lambda:InvokeFunction --principal apigateway.amazonaws.com
HTTP APIはREST APIより70%安く、JWTオーソライザーをネイティブサポートしているため、新規開発のAPIにはHTTP APIが最初の選択肢になります。Lambdaプロキシ統合でstatusCodeとbodyを正しく返し、Cognitoオーソライザーで認証を設定し、スロットリングとアクセスログを本番公開前に必ず有効化する。この3点を押さえることで、費用対効果の高いサーバーレスAPIが完成します。

AWSをコマンドラインで操れる力は、現場で突出した存在になれる

API Gatewayの設定はコンソールでも触れますが、CLIとIaCで再現性のある構成を組める力が現場では差を生みます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、AWSを含む現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。