どうすれば、Amazon API Gateway で作成されたAPI からのメッセージに含まれるカスタムヘッダーを処理する Lambda 関数を作成できますか?

デフォルトでは、Amazon API ゲートウェイ で作成された API からのリクエスト本体のみが、AWS Lambda 関数に取り込まれます。ここでは、 curl ユーティリティで、API Gateway にメッセージを送信する方法を説明します。メッセージを受け取った API Gateway では、ボディ マッピング テンプレートにより、メッセージに追加されたカスタムヘッダーが取り出されます。次に更新されたメッセージが API から Lambda 関数に送られ、この関数でヘッダーは処理されます。最後に、元のメッセージの1つ以上のヘッダー値が API から curl に返されます。

次の手順で、Amazon API Gateway の API から Lambda 関数にカスタムヘッダーを渡すことができます。

Lambda 関数の作成

注意事項

次の例では、AWS Lambda とAmazon API Gateway のアクセス許可は設定済みであると仮定しています。この設定については、「 AWS Lambda に対する認証とアクセスコントロール」、「IAM アクセス権限により API へのアクセスを制御する」をご参照ください。この例では、AmazonAPIGatewayInvokeFullAccess と AmazonAPIGatewayPushToCloudWatchLogs という2つの管理ポリシーを適用してテスト Role を作成する必要があります。

1.    「AWS Lambda console」を開き、[Functions] をクリックします。

2.    [Create a Lambda function] をクリックします。

3.    [Configure function] オプションをオンにします。

4.    [Name] 、[Description] 、[Runtime] に適切な内容を入力します。この例では、「CustomHeaders」の内容を使用しています。この部分は、Node.js 4.3ランタイムによって異なります。

5.    次の Lambda 関数のコードを入力し、[Edit code inline]がオンになっていることを確認します。Edit code inlineは、[Code entry type] オプションで選択します。

exports.handler = (event, context) => {

context.done(null, "This message header was processed by Amazon " +event.headers["header1"]);

};

6.    [Lambda function handler and role] 内で、 [Choose an existing role ] を [Role] から選択し、[Existing role] で以前作成したテストロールの名前をクリックします。このページの残りのオプションはすべてデフォルト値のままになります。[Next] をクリックします。

7.    [Create Function] を選択して、 [Publish] オプションを[Actions] メニューから選びます。

API Gateway API の作成

1.    API Gateway console を開き、[APIs] を選択し、[Create API] をクリックして、[Create new API ] ページを開きます。このページの [New API ] オプションがオンになっていることを確認します。「SendtoLambda 」の名前と短い説明を記述します。

2.    [Create API (API を作成)] を選択します。

3.    API へリソースの追加ナビゲーションペイン の [Resources ] を選択し、 [Actions ] メニューから [Create Resource ] をクリックして、[New Child Resource ] ページを開きます。[HeadersResource] を [Resource Name] で入力し、その後 [Create Resource] をクリックします。

4.    API Gatewayコンソールで [headersresource] を選択します。[Actions ] ドロップダウンメニューから、[Create Method ] を選択し、開かれたドロップダウンボックスの [POST] をクリックします。[POST ] メソッドの右側のチェックマークをオンにし、[ /headersresource - POST - Setup] ページを開きます。

5.    このページで [Integration type ] が [Lambda Function] に設定されていることを確認し、適切な Lambda Region をクリックして名前「CustomHeaders」を入力します。[Save] をクリックして、[Add Permission to Lambda Function ] を開き、[OK] をクリックします。

6.    [POST] メソッドを[Resources] ペインでクリックして、[method’s execution details] 画面を開きます。[/headersresource - POST - Method Execution section] リンクの [Integration Request ] をクリックします。

7.    [Integration Request] オプションでは、ディフォルト設定をそのまま残し、[Body Mapping Templates] を開きます。[Request body passthrough] では、["When there are no templates defined (recommended)"] オプションを選択し、 [Add mapping template] をクリックして、[Content-Type] ページを開きます。「application/json」を[Content-type] に入力し、チェックマークをオンにします。

8.    コード入力セクションに次のコードを記述します。このコードは、メッセージヘッダーをループして、それぞれのヘッダーを応答メッセージのボディ部に追加します。

{

    "method": "$context.httpMethod",

    "body" : $input.json('$'),

    "headers": {

        #foreach($param in $input.params().header.keySet())

        "$param": "$util.escapeJavaScript($input.params().header.get($param))"

        #if($foreach.hasNext),#end

        #end

    }

}

9.    [Save ] をクリックして、API の POST メソッドを更新します。

10.    [Actions ] メニューから、[Deploy API] を選択して、 (「prod」、「test」、「beta」といった) ステージ名を入力します。API をデプロイすると [Stage Editor] ページか再び開きます。

11.    ステージエディタのページで、POST メソッドをオンにし、ステージエディタ最上部の [Invoke URL:] の隣に表示されているURLを書き留めます。このURLにアクセスすることで、メソッドが呼び出されます。

12.    API Gateway にメッセージを送るために、curl ユーティリティを使用します。次の例では、Lambda 関数が参照した「header1 」ヘッダーの値が返されます。

curl ユーティリティコマンドば以下のようになります。「curl -H "Content-Type: application/json" -H "header1: API Gateway and AWS Lambda" -X POST -d "{\"API_body\": \"This is the body\"}"」。

13.    コンソールに次の出力が表示されます。

「This message header was processed by Amazon API Gateway and AWS Lambda」

注意事項: Windows に curl をインストールする必要がある場合は、「Git for Windows」をダウンロードしてください。この中には「GNU bash shell」と 「curl」、「tail」、「cat」、「grep」、「gzip」、「Perl」などの Linux ツールが含まれています。

もう1つの有用なテストツールである 「PostMan」 は、Chrome や Mac のアプリとして無料で利用できます。

まとめ

この例の概要を以下にまとめます。

1.    API Gateway リソースの POST メソッドにメッセージが送信されます。このメッセージは Lambda 関数用のヘッダーが追加された統合リクエストとして設定されています。

2.    統合要求は、ボディ マッピング テンプレートを使用してメッセージヘッダーをメッセージ本体にコピーします。

3.    API Gateway リソースは、更新された応答を Lambda 関数に送信します。

4.    Lambda 関数は元のメッセージのヘッダーを呼び出し元に返します。

Amazon API Gateway, AWS Lambda, body mapping template, Node.js, integration, custom headers, function, resource, stage, deploy, request body


このページは役に立ちましたか? はい | いいえ

AWS サポートナリッジセンターに戻る

サポートが必要ですか?AWS サポートセンターをご覧ください。

公開日: 2016 年 10 月 06 日