APIGatewayのLambda統合で引数を受け取るサンプルを紹介します。
引数の値によってLambdaの返却値を動的にします。
以下が今回作成するAPIの概略図です。
固定値を返すAPIを作成
まずは固定値を返すAPIを作成します。
以下の記事を参照ください。
APIGatewayの設定
固定値を返すAPIを作成したら、動的値を返却できるように変更を加えていきます。
メソッドを選択し、「メソッドリクエスト」を選択します。
「クエリ文字列の追加」からクエリパラメタ「param」を追加します。
この設定によってAPIGatewayでクエリパラメタを受け取ることができます。
次に「統合リクエスト」を選択します。
「Lambdaプロキシ統合の使用」にチェックを入れます。
これにより、APIGatewayで受け取ったパラメータをLambdaに渡すことができます。
これでAPIGatewayでパラメ―タを受け取る設定が完了しました。
Lambda関数の作成
次にパラメータを受けて動的な返却値を返すLambdaを作成します。
APIGatewayから渡されたパラメータは以下のような形式でLambdaに渡されます。
{ 'resource': '/', 'path': '/', 'httpMethod': 'GET', 'headers': None, 'multiValueHeaders': None, 'queryStringParameters': {'param': '1'}, 'multiValueQueryStringParameters': {'param': ['1']}, 'pathParameters': None, 'stageVariables': None, 'requestContext': { 'resourceId': 'xxxxxxxxxxx', 'resourcePath': '/', 'httpMethod': 'GET', 'extendedRequestId': 'MDc-2HgEtjMFiCQ=', 'requestTime': '05/May/2020:10:37:44 +0000', 'path': '/', 'accountId': 'xxxxxxxxxxxxxxxxxxxxx', 'protocol': 'HTTP/1.1', 'stage': 'test-invoke-stage', 'domainPrefix': 'testPrefix', 'requestTimeEpoch': 1588675064508, 'requestId': 'xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx', 'identity': { 'cognitoIdentityPoolId': None, 'cognitoIdentityId': None, 'apiKey': 'test-invoke-api-key', 'principalOrgId': None, 'cognitoAuthenticationType': None, 'userArn': 'arn:aws:iam::xxxxxxxxxxxxxxxx:user/xxxxx', 'apiKeyId': 'test-invoke-api-key-id', 'userAgent': 'aws-internal/3 aws-sdk-java/1.11.749 Linux/4.9.184-0.1.ac.235.83.329.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.242-b08 java/1.8.0_242 vendor/Oracle_Corporation', 'accountId': 'xxxxxxxxxxxxx', 'caller': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'sourceIp': 'test-invoke-source-ip', 'accessKey': 'xxxxxxxxxxxxxxxxxxxx', 'cognitoAuthenticationProvider': None, 'user': 'xxxxxxxxxxxxxxxxxxxxxxx' }, 'domainName': 'testPrefix.testDomainName', 'apiId': 'xxxxxxxxxxxxxxxx' }, 'body': None, 'isBase64Encoded': False }
この中に「queryStringParameters」という値があります。
この中にAPIGatewayが受け取ったパラメータが格納されています。
'queryStringParameters': {'param': '1'},
Lambdaでこの値を取得するには以下のように処理を記述すればよいです。
import json
def lambda_handler(event, context):
# ペイロードからクエリパラメタを取得
body = 'param is ' + event['queryStringParameters']['param']
res = {
"statusCode" : 200,
"headers" : {"Access-Control-Allow-Origin" : '*'},
"body" : body
}
return res
Lambdaを作成したら「新しいバージョンの発行」をしておきましょう。
APIGatewayにLambdaを設定する
最後に作成したLambdaをAPIGatewayに統合します。
既にAPIを作成してしまっている場合は、Lambdaを変更することはできないので、新たにAPIメソッドを作成する必要があります。
Lambdaを設定したらデプロイを実行し、外部ネットワークから呼び出せるようにしましょう。
ブラウザから以下のURLにアクセスすることで、動的なレスポンスが返ってくることがわかります。
// APIにパラメータ付きリクエスト https://[YOUR_API_URL]?param=[value] // 動的な値が返ってくる param is [value]