mcpField
A
api-gateway

api-gateway

github.com/itsmostafaクラウド・DevOps1.2k141 回インストール4 日前に更新
リポジトリ

api-gateway について

AWS API GatewayでAPIを作成・運用するための実用的なリファレンススキルです。HTTP、REST、WebSocket API、バックエンド連携、認可、デプロイ、障害対応を扱います。

主な機能

  1. 01HTTP、REST、WebSocket API
  2. 02バックエンド連携パターン
  3. 03CORSとJWT認可
  4. 04APIデプロイコマンド
  5. 05エラーとタイムアウトの診断

活用シーン

  1. 01Lambda連携のHTTP API作成
  2. 02CORSまたはJWT認可の設定
  3. 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-apiAPI を作成
aws apigatewayv2 get-apisAPI の一覧を取得
aws apigatewayv2 create-routeルートを作成
aws apigatewayv2 create-integration統合を作成
aws apigatewayv2 create-stageステージを作成
aws apigatewayv2 create-authorizer認可機能を作成
REST API(apigateway)
コマンド説明
aws apigateway create-rest-apiAPI を作成
aws apigateway get-rest-apisAPI の一覧を取得
aws apigateway create-resourceリソースを作成
aws apigateway put-methodメソッドを作成
aws apigateway put-integration統合を作成
aws apigateway create-deploymentAPI をデプロイ

ベストプラクティス

パフォーマンス
  • シンプルなユースケースには 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 メソッドが存在することを確認します
  • レスポンス内のヘッダーを確認します
  • オリジンが許可されたオリジンと一致することを確認します

参考資料

コメント