Lapis Lazuli

technical blog for web developer

【AWS】APIGatewayとlambdaをプロキシ統合で連携する

APIGatewayからlambdaを統合するときに、プロキシ統合でバックエンドに渡す方法があります。
確か去年あたりに新しくできた方法で、これのおかげでかなり楽にマッピングができるようになりました。
今回、業務でAPIGatewayを使用したのでその事を書いていきます。

プロキシ統合とは

従来、APIGatewayからlambdaを呼び出すにはパラメータのマッピング設定を行わないといけませんでした。
GETで来た場合のマッピングテンプレートを設定して、それをどのパラメータに渡すかを定義して実行していました。
ですがこのやり方だと毎回やらないといけないですし、なによりその管理が面倒です。
RESTAPIとして利用する場合、CRUDの処理ができればいいので、パラメータの形式はほぼ一定だと思います。
プロキシ統合を行うと、その辺りを全部やってくれる形になります。

やりかた

APIを作成した後の統合リクエストの項目を選択します。
f:id:cres-tech:20201003111048p:plain

設定はこれだけで終わりです。統合リクエストの項目がLAMBDA_PROXYになっていればOKです。

f:id:cres-tech:20201003111154p:plain

lambda側のパラメータ

lambdaでパラメータを受け取るときは、全てeventに入ってくるので、これを参照すれば大丈夫です。
ドキュメントにも書かれていますが、下記のような形式になります。

{
    "resource": "Resource path",
    "path": "Path parameter",
    "httpMethod": "Incoming request's method name"
    "headers": {String containing incoming request headers}
    "multiValueHeaders": {List of strings containing incoming request headers}
    "queryStringParameters": {query string parameters }
    "multiValueQueryStringParameters": {List of query string parameters}
    "pathParameters":  {path parameters}
    "stageVariables": {Applicable stage variables}
    "requestContext": {Request context, including authorizer-returned key-value pairs}
    "body": "A JSON string of the request payload."
    "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encoded"
}

docs.aws.amazon.com

このうち、GETのパラメータはqueryStringParametersに入ってくるので、ここを参照すればOKです。

Pythonの場合
event.get('queryStringParameters').get('key')

POSTの場合はbodyなので、パースなりなんなりすれば大丈夫かと。

param = event.get('body')
param['key']

こんな感じで簡単にlambda内で使用できます。その他のパラメータもrequestContextなどに入ってきていて、特にstage名で処理を分ける場合は使えると思います。私はdevとprdのステージによって処理を分ける感じで使いました。