api-gateway について
AWS API GatewayでAPIを作成・運用するための実用的なリファレンススキルです。HTTP、REST、WebSocket API、バックエンド連携、認可、デプロイ、障害対応を扱います。
主な機能
- 01HTTP、REST、WebSocket API
- 02バックエンド連携パターン
- 03CORSとJWT認可
- 04APIデプロイコマンド
- 05エラーとタイムアウトの診断
活用シーン
- 01Lambda連携のHTTP API作成
- 02CORSまたはJWT認可の設定
- 03ゲートウェイエラーの調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ itsmostafa/ aws-agent-skills --skill api-gatewayインストール後、Claude Code で/api-gatewayを入力して読み込まれたか確認します。
同梱ファイルintegration-patterns.md
詳細
AWS API Gateway
Amazon API Gateway は、あらゆる規模の API を作成、公開、保護するためのフルマネージドサービスです。REST API、HTTP API、WebSocket API に対応しています。
目次
コアコンセプト
API の種類
| 種類 | 説明 | ユースケース |
|---|---|---|
| HTTP API | 低レイテンシで低コスト | シンプルな API、Lambda プロキシ |
| REST API | 多機能で、より細かな制御が可能 | 複雑な API、変換 |
| WebSocket API | 双方向通信 | リアルタイムアプリ、チャット |
主なコンポーネント
- リソース:URL パス(/users、/orders/{id})
- メソッド:HTTP 動詞(GET、POST、PUT、DELETE)
- 統合:バックエンド接続(Lambda、HTTP、AWS サービス)
- ステージ:デプロイ環境(dev、prod)
統合の種類
| 種類 | 説明 |
|---|---|
| Lambda プロキシ | Lambda へのパススルー(推奨) |
| Lambda カスタム | リクエスト/レスポンスを変換 |
| HTTP プロキシ | HTTP エンドポイントへのパススルー |
| AWS サービス | AWS サービスとの直接統合 |
| モック | 静的レスポンスを返す |
一般的なパターン
Lambda を使った HTTP API の作成
AWS CLI:
# Create HTTP API
aws apigatewayv2 create-api \
--name my-api \
--protocol-type HTTP \
--target arn:aws:lambda:us-east-1:123456789012:function:MyFunction
# Get API endpoint
aws apigatewayv2 get-api --api-id abc123 --query 'ApiEndpoint'
SAM テンプレート:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
MyApi:
Type: AWS::Serverless::HttpApi
Properties:
StageName: prod
MyFunction:
Type: AWS::Serverless::Function
Properties:
Handler: app.handler
Runtime: python3.12
Events:
ApiEvent:
Type: HttpApi
Properties:
ApiId: !Ref MyApi
Path: /items
Method: GET
Lambda プロキシを使った REST API の作成
# Create REST API
aws apigateway create-rest-api \
--name my-rest-api \
--endpoint-configuration types=REGIONAL
API_ID=abc123
# Get root resource ID
ROOT_ID=$(aws apigateway get-resources --rest-api-id $API_ID --query 'items[0].id' --output text)
# Create resource
aws apigateway create-resource \
--rest-api-id $API_ID \
--parent-id $ROOT_ID \
--path-part items
RESOURCE_ID=xyz789
# Create method
aws apigateway put-method \
--rest-api-id $API_ID \
--resource-id $RESOURCE_ID \
--http-method GET \
--authorization-type NONE
# Create Lambda integration
aws apigateway put-integration \
--rest-api-id $API_ID \
--resource-id $RESOURCE_ID \
--http-method GET \
--type AWS_PROXY \
--integration-http-method POST \
--uri arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:MyFunction/invocations
# Deploy to stage
aws apigateway create-deployment \
--rest-api-id $API_ID \
--stage-name prod
API Gateway 用 Lambda ハンドラー
import json
def handler(event, context):
# HTTP API event
http_method = event.get('requestContext', {}).get('http', {}).get('method')
path = event.get('rawPath', '')
query_params = event.get('queryStringParameters', {})
body = event.get('body', '')
if body and event.get('isBase64Encoded'):
import base64
body = base64.b64decode(body).decode('utf-8')
# Process request
response_body = {'message': 'Success', 'path': path}
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps(response_body)
}
CORS の設定
HTTP API:
aws apigatewayv2 update-api \
--api-id abc123 \
--cors-configuration '{
"AllowOrigins": ["https://example.com"],
"AllowMethods": ["GET", "POST", "PUT", "DELETE"],
"AllowHeaders": ["Content-Type", "Authorization"],
"MaxAge": 86400
}'
REST API:
# Enable CORS on resource
aws apigateway put-method \
--rest-api-id $API_ID \
--resource-id $RESOURCE_ID \
--http-method OPTIONS \
--authorization-type NONE
aws apigateway put-integration \
--rest-api-id $API_ID \
--resource-id $RESOURCE_ID \
--http-method OPTIONS \
--type MOCK \
--request-templates '{"application/json": "{\"statusCode\": 200}"}'
aws apigateway put-method-response \
--rest-api-id $API_ID \
--resource-id $RESOURCE_ID \
--http-method OPTIONS \
--status-code 200 \
--response-parameters '{
"method.response.header.Access-Control-Allow-Headers": true,
"method.response.header.Access-Control-Allow-Methods": true,
"method.response.header.Access-Control-Allow-Origin": true
}'
aws apigateway put-integration-response \
--rest-api-id $API_ID \
--resource-id $RESOURCE_ID \
--http-method OPTIONS \
--status-code 200 \
--response-parameters '{
"method.response.header.Access-Control-Allow-Headers": "'\''Content-Type,Authorization'\''",
"method.response.header.Access-Control-Allow-Methods": "'\''GET,POST,PUT,DELETE,OPTIONS'\''",
"method.response.header.Access-Control-Allow-Origin": "'\''*'\''"
}'
JWT 認可(HTTP API)
aws apigatewayv2 create-authorizer \
--api-id abc123 \
--name jwt-authorizer \
--authorizer-type JWT \
--identity-source '$request.header.Authorization' \
--jwt-configuration '{
"Issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_abc123",
"Audience": ["client-id"]
}'
CLI リファレンス
HTTP API(apigatewayv2)
| コマンド | 説明 |
|---|---|
aws apigatewayv2 create-api | API を作成 |
aws apigatewayv2 get-apis | API の一覧を取得 |
aws apigatewayv2 create-route | ルートを作成 |
aws apigatewayv2 create-integration | 統合を作成 |
aws apigatewayv2 create-stage | ステージを作成 |
aws apigatewayv2 create-authorizer | 認可機能を作成 |
REST API(apigateway)
| コマンド | 説明 |
|---|---|
aws apigateway create-rest-api | API を作成 |
aws apigateway get-rest-apis | API の一覧を取得 |
aws apigateway create-resource | リソースを作成 |
aws apigateway put-method | メソッドを作成 |
aws apigateway put-integration | 統合を作成 |
aws apigateway create-deployment | API をデプロイ |
ベストプラクティス
パフォーマンス
- シンプルなユースケースには HTTP API を使用します(70%低コストで、レイテンシも低減)
- REST API では キャッシュを有効にします
- グローバルな配信が必要でない限り、リージョンエンドポイントを使用します
- リストエンドポイントには ページネーションを実装します
セキュリティ
- すべてのエンドポイントで 認可を使用します
- REST API では WAF を有効にします
- レート制限には API キーを使用します(認証には使用しません)
- アクセスログを有効にします
- HTTPS のみを使用します
信頼性
- バックエンドを保護するために スロットリングを設定します
- タイムアウトを適切に設定します
- 更新には カナリアデプロイを使用します
- CloudWatch で監視します
トラブルシューティング
403 Forbidden
原因:
- 認可の設定がない
- API キーが無効
- WAF によるブロック
- リソースポリシーによる拒否
デバッグ:
# Check API key
aws apigateway get-api-key --api-key abc123 --include-value
# Check authorizer
aws apigatewayv2 get-authorizer --api-id abc123 --authorizer-id xyz789
502 Bad Gateway
原因:
- Lambda エラー
- 統合のタイムアウト
- レスポンス形式が無効
Lambda のレスポンス形式:
# Correct format
return {
'statusCode': 200,
'headers': {'Content-Type': 'application/json'},
'body': json.dumps({'message': 'success'})
}
# Wrong - missing statusCode
return {'message': 'success'}
504 Gateway Timeout
原因:
- バックエンドのタイムアウト(REST API の場合、Lambda は最大 29 秒)
- 統合のタイムアウトが短すぎる
解決策:
- Lambda のタイムアウトを延長します
- 長時間の処理には非同期処理を使用します
- 統合のタイムアウトを延長します(REST は最大 29 秒、HTTP は最大 30 秒)
CORS エラー
デバッグ:
- OPTIONS メソッドが存在することを確認します
- レスポンス内のヘッダーを確認します
- オリジンが許可されたオリジンと一致することを確認します
参考資料
コメント
Markdown 対応