📝
API Gateway REST API で Lambda プロキシ統合を使用するチュートリアルを AWS CLI でやってみた
チュートリアル: 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 の作成
- 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"
}
- リソースを作成します。
$ aws apigateway create-resource \
--rest-api-id bbtpa0uvk1 \
--parent-id bdh8gtji61 \
--path-part helloworld
レスポンス
{
"id": "k692qw",
"parentId": "bdh8gtji61",
"pathPart": "helloworld",
"path": "/helloworld"
}
- メソッドを作成します。
$ aws apigateway put-method \
--rest-api-id bbtpa0uvk1 \
--resource-id k692qw \
--http-method ANY \
--authorization-type "NONE"
レスポンス
{
"httpMethod": "ANY",
"authorizationType": "NONE",
"apiKeyRequired": false
}
- メソッドレスポンスを作成します。
$ aws apigateway put-method-response \
--rest-api-id bbtpa0uvk1 \
--resource-id k692qw \
--http-method ANY \
--status-code 200
レスポンス
{
"statusCode": "200"
}
- 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": []
}
- 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 でやってみました。
どなたかの参考になれば幸いです。
参考資料
- チュートリアル: Lambda プロキシ統合を使用して REST API を作成する - Amazon API Gateway
- チュートリアル: AWS SDK または AWS CLI を使用して REST API を作成する - Amazon API Gateway
- create-function — AWS CLI 2.22.28 Command Reference
- create-rest-api — AWS CLI 2.22.28 Command Reference
- create-resource — AWS CLI 2.22.28 Command Reference
- put-method — AWS CLI 2.22.28 Command Reference
- put-method-response — AWS CLI 2.22.28 Command Reference
- put-integration — AWS CLI 2.22.28 Command Reference
- add-permission — AWS CLI 2.22.28 Command Reference
Discussion