Help us understand the problem. What is going on with this article?

API Gateway から Lambda にパラメータを渡す

10月で入社して半年が経ちました、streampackチームのminsuです。
いきなり寒くなってきて秋を感じますね、春に東京に引っ越してきた私はまだ冬服を揃えてないのでもう少し緩やかに気温が変化して欲しかったです。

今回の記事は先日API Gateway + Lambdaを触ることがあったため、自分用にまとめたものです。
/{foo}/{bar}のようなパスパラメータやGET,POSTパラメータを渡そうとしたところ、
マッピングテンプレートを設定する方法もありますがLambdaプロキシ統合を使うとよしなに設定してくれて楽でした。

Lambda 関数の作成

Lambda関数を作成します。
関数名はparams-testとしました。
アクセス権限は用途に沿って設定してください。
スクリーンショット 2019-10-17 17.45.15.png

API Gateway 作成

APIの作成から API を作成します、API名はURLに反映されません。
スクリーンショット 2019-10-17 17.49.41.png

リソース作成

パスパラメータを設定するにはリソースの作成するときにリソースパス{}で括ります。
スクリーンショット 2019-10-17 17.53.08.png

メソッド作成

メソッドの作成>GETを選択し、メソッドのセットアップを行います。
Lambda関数に先ほど作成した params-testを入力します。
前述のLambda プロキシ統合の使用に チェックを入れることでリクエスト情報が Lambda の handler関数の event で参照できるようになります。
スクリーンショット 2019-10-17 18.00.57.png
メソッド作成後も統合リクエストから編集可能です。

API のデプロイ

アクションからAPIのデプロイを行います。
ここのステージ名はURLに反映されます。
https://xxx.execute-api.ap-northeast-1.amazonaws.com/ステージ名
スクリーンショット 2019-10-18 11.46.43.png

Lambda でテストをしたい場合は イベントテンプレート Amazon API Gateway AWS Proxyを選択してpathParametersを編集するといいです。

Lambdaへリクエストデータの引き渡し

API Gateway へパラメータを付けてGETリクエストを行うと Lambda の event は以下のフォーマットで情報を受け取ります。

$ curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/xxx/foofoo/barbar?hoge=hogege&fuga=fugaga

{
    "resource": "/xxx/{foo}/{bar}",
    "path": "/xxx/foofoo/barbar",
    "httpMethod": "GET",
    "headers": {...},
    "multiValueHeaders": {...},
    "queryStringParameters": {
        "fuga": "fugaga",
        "hoge": "hogege"
    },
    "multiValueQueryStringParameters": {...},
    "pathParameters": {
        "bar": "barbar",
        "foo": "foofoo"
    },
    "stageVariables": null,
    "requestContext": {...},
    "body": null,
    "isBase64Encoded": false
}

pathParametersにパスパラメータが、
queryStringParametersにGETパラメータが含まれて Lambda に渡されています。
これがPOSTリクエストの場合はbodyにPOSTパラメーターが渡されます。

Lambda関数の言語に沿って
node.js では event.pathParameters.foo;
python では event['pathParameters']['foo']
ruby では event['pathParameters']['foo']
のようにパラメータを取得できます。

Lambda側でテストを行う場合はイベントテンプレートAmazon API Gateway AWS Proxyを使用すると一通りフォーマットが揃っています。
API Gateway側でテストを行う場合はメソッドの実行画面からテストが行えます。

Lambda への入力フォーマット
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format

API Gatewayへのレスポンスデータ

Lambda プロキシ統合を設定すると Lambda から API Gateway へのレスポンスデータも以下のフォーマットに沿って渡されます。

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": "..."
}

以下のように headers Access-Control-Allow-Origin を追加することでCORSを有効にできるなど工夫が必要なようです。

exports.handler = async (event) => {
    const hoge = event.queryStringParameters.hoge;
    const body = {
        "hoge": hoge,
    };
    const response = {
        statusCode: 200,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify(body),
    };
    return response;
};

API Gateway へのレスポンスフォーマット
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format

感想

API Gateway と Lambdaをチェックボックス一つで連携できるのは便利でした。
決まったフォーマットがあるのは覚えておかなければですね。
「API Gateway から Lambda にパラメータを渡す」というテーマでしたが、実際に利用する場合はLambdaからのレスポンスも理解が必要ですね、今後の課題です。

参考

Lambdaプロキシ統合
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
マッピングテンプレート
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-getting-started-with-rest-apis.html

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした