📝

API Gateway REST API で Lambda プロキシ統合を使用するチュートリアルを AWS CLI でやってみた

2025/01/05に公開

チュートリアル: Lambda プロキシ統合を使用して REST API を作成する - Amazon API Gateway
上記チュートリアルを AWS CLI でをやってみました。
AWS CLI の実行環境は CloudShell です。

AWS CLI での API Gateway 関連のコマンドについては以下のドキュメントを参照しました。
チュートリアル: AWS SDK または AWS CLI を使用して REST API を作成する - Amazon API Gateway

事前準備

  • IAM ロールの作成
  • Lambda 関数コードの zip ファイル作成
  • zip ファイルを CloudShell へアップロード
コード
export const handler = function(event, context, callback) {
    console.log('Received event:', JSON.stringify(event, null, 2));
    var res ={
        "statusCode": 200,
        "headers": {
            "Content-Type": "*/*"
        }
    };
    var greeter = 'World';
    if (event.greeter && event.greeter!=="") {
        greeter =  event.greeter;
    } else if (event.body && event.body !== "") {
        var body = JSON.parse(event.body);
        if (body.greeter && body.greeter !== "") {
            greeter = body.greeter;
        }
    } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") {
        greeter = event.queryStringParameters.greeter;
    } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") {
        greeter = event.multiValueHeaders.greeter.join(" and ");
    } else if (event.headers && event.headers.greeter && event.headers.greeter != "") {
        greeter = event.headers.greeter;
    } 
    
    res.body = "Hello, " + greeter + "!";
    callback(null, res);
};

Lambda 関数の作成

$ aws lambda create-function \
--function-name GetStartedLambdaProxyIntegration \
--zip-file fileb://index.zip \
--role <事前作成した IAM ロール ARN> \
--handler index.handler \
--runtime nodejs22.x
レスポンス
{
    "FunctionName": "GetStartedLambdaProxyIntegration",
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:0123456789012:function:GetStartedLambdaProxyIntegration",
    "Runtime": "nodejs22.x",
    "Role": "<事前作成した IAM ロール ARN>",
    "Handler": "index.handler",
    "CodeSize": 534,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2025-01-04T03:36:27.455+0000",
    "CodeSha256": "x/RgLFdUuEtkTEDhEhvXbHAKZezwBrae9kYzTEovioY=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "3f6c3e14-9c33-4f10-b149-bd25a5289a28",
    "State": "Pending",
    "StateReason": "The function is being created.",
    "StateReasonCode": "Creating",
    "PackageType": "Zip",
    "Architectures": [
        "x86_64"
    ],
    "EphemeralStorage": {
        "Size": 512
    },
    "SnapStart": {
        "ApplyOn": "None",
        "OptimizationStatus": "Off"
    },
    "RuntimeVersionConfig": {
        "RuntimeVersionArn": "arn:aws:lambda:ap-northeast-1::runtime:f494bf5385768c1a5f722eae90b6dd3d343c96ba7ec22b34f5c819e3e8511722"
    },
    "LoggingConfig": {
        "LogFormat": "Text",
        "LogGroup": "/aws/lambda/GetStartedLambdaProxyIntegration"
    }
}

API の作成

  1. REST API を作成します。
$ aws apigateway create-rest-api \
--name LambdaProxyAPI \
--endpoint-configuration types=REGIONAL
レスポンス
{
    "id": "bbtpa0uvk1",
    "name": "LambdaProxyAPI",
    "createdDate": "2025-01-04T03:48:46+00:00",
    "apiKeySource": "HEADER",
    "endpointConfiguration": {
        "types": [
            "REGIONAL"
        ]
    },
    "disableExecuteApiEndpoint": false,
    "rootResourceId": "bdh8gtji61"
}
  1. リソースを作成します。
$ aws apigateway create-resource \
--rest-api-id bbtpa0uvk1 \
--parent-id bdh8gtji61 \
--path-part helloworld
レスポンス
{
    "id": "k692qw",
    "parentId": "bdh8gtji61",
    "pathPart": "helloworld",
    "path": "/helloworld"
}
  1. メソッドを作成します。
$ aws apigateway put-method \
--rest-api-id bbtpa0uvk1 \
--resource-id k692qw \
--http-method ANY \
--authorization-type "NONE"
レスポンス
{
    "httpMethod": "ANY",
    "authorizationType": "NONE",
    "apiKeyRequired": false
}
  1. メソッドレスポンスを作成します。
$ aws apigateway put-method-response \
--rest-api-id bbtpa0uvk1 \
--resource-id k692qw \
--http-method ANY \
--status-code 200
レスポンス
{
    "statusCode": "200"
}
  1. Lambda 統合を設定します。
$ aws apigateway put-integration \
--rest-api-id bbtpa0uvk1 \
--resource-id k692qw \
--http-method ANY \
--type AWS_PROXY \
--integration-http-method POST \
--uri 'arn:aws:apigateway:ap-northeast-1:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-northeast-1:0123456789012:function:GetStartedLambdaProxyIntegration/invocations'
レスポンス
{
    "type": "AWS_PROXY",
    "httpMethod": "POST",
    "uri": "arn:aws:apigateway:ap-northeast-1:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-northeast-1:0123456789012:function:GetStartedLambdaProxyIntegration/invocations",
    "passthroughBehavior": "WHEN_NO_MATCH",
    "timeoutInMillis": 29000,
    "cacheNamespace": "k692qw",
    "cacheKeyParameters": []
}
  1. API をデプロイします。
$ aws apigateway create-deployment \
--rest-api-id bbtpa0uvk1 \
--stage-name test
レスポンス
{
    "id": "tf6s5e",
    "createdDate": "2025-01-04T11:00:11+00:00"
}

Lambda トリガー追加

コンソール上から Lambda プロキシ統合を設定した場合は自動的に Lambda のリソースベースが作成され、トリガーに API Gateway が設定されます。
一方、AWS CLI で API を作成した場合には Lambda のリソースベースポリシーが自動的に作成されないため、明示的に作成する必要があります。

$ aws lambda add-permission \
--function-name GetStartedLambdaProxyIntegration \
--statement-id from-apigw \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com \
--source-arn arn:aws:execute-api:ap-northeast-1:0123456789012:nvso4b5vz9/*/*/helloworld
レスポンス
{
    "Statement": "{\"Sid\":\"from-apigw\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:0123456789012:function:GetStartedLambdaProxyIntegration\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:ap-northeast-1:0123456789012:nvso4b5vz9/*/*/helloworld\"}}}"
}

テスト

curl コマンド実行環境が Windows なのでドキュメントを参考に以下のコマンドでテストします。

curl -X POST "https://bbtpa0uvk1.execute-api.ap-northeast-1.amazonaws.com/test/helloworld" -H "content-type: application/json" -d "{ \"greeter\": \"John\" }"

Hello, John!

問題なくレスポンスを取得できたので設定完了です。

まとめ

今回は「Lambda プロキシ統合を使用して REST API を作成する」のチュートリアルを AWS CLI でやってみました。
どなたかの参考になれば幸いです。

参考資料

Discussion