Skip to content

Instantly share code, notes, and snippets.

@og24715
Created August 3, 2017 05:45
Show Gist options
  • Save og24715/2c776900d7850dbc8e0f41b17af9651f to your computer and use it in GitHub Desktop.
Save og24715/2c776900d7850dbc8e0f41b17af9651f to your computer and use it in GitHub Desktop.

APIGateway から Lambda を非同期で呼び出す

Lambda を作成する

今回は test_func という名前で、2000ms まってからリクエスト本文を返すだけの Lambda を作成した。

image

'use strict';
console.log('Loading hello world function');

exports.handler = function(event, context, callback) {
    const statusCode = 200;
    const response = {
      statusCode,
      headers: {
        contentType: 'application/json',
      },
      body: JSON.stringify(event),
    };

    const verySlowFunc = () => console.log('omatase');
    setTimeout(verySlowFunc, 2000);
    callback(null, response);
};

Lambda に適切なロールを設定する

Lambda が他のAWSサービスにアクセする場合ここで適切なポリシー(権限のグループ?)を付与する。 今回は特別な操作をしないのでポリシーテンプレートを何も選択せず、test_func_roleという名前でロールを作成した。

image

するとIAMにてロールが作成されていることが確認できる。

image

Lambda をテストする

コンソールで保存した後、テストをする。 所要時間が2000ms以上になっていることが確認できる。

Lambda を呼び出す APIGateway を作成する

LambdaAsyncという名前で作成した。

image

メソッドのセットアップをする

ひとまずANYメソッドを作成する。 統合タイプはLambda関数。LambdaリージョンとLambda関数は上で作成したLambda関数に合わせて設定する。

image

保存しようとすると「Lambda 関数に権限を追加する」というプロンプトが出るのでOKを押す。 すると適切なロールが適用される。

メソッドのテストをする

POSTメソッドを選択して適当なリクエスト本文をいれテストすると、2000ms後にレスポンスが返ってくるので正しくLambda関数を呼び出せていることが分かる。

image

正しくLambdaを実行できていることがわかったので次からこれを非同期化する。

X-Amz-Invocation-Type ヘッダーを追加してLambdaを非同期実行できるようにする

Lambdaを呼び出す際にX-Amz-Invocation-Type; Eventヘッダーを追加することで非同期呼び出しになる。

Lambda 関数の非同期呼び出しをサポートするには、X-Amz-Invocation-Type:Event ヘッダーを統合リクエストに明示的に追加する必要があります。

AWS Lambda 関数の API GatewayAPI を作成する - Amazon API Gateway

ANYメソッドの統合リクエストを見るとヘッダーを触れる場所がないことが分かる。

image

ダメ元でメソッドリクエストのリクエストヘッダーにX-Amz-Invocation-Typeを追加する。

image

テストするとEventを指定しているのにもかかわらずきっちり2000ms掛かっていることがわかる。

なぜなのか

Lambda Function オプションは、AWS Service 統合タイプの特殊なケースであり、デフォルト設定を使用して統合のセットアップを簡素化します。たとえば、前者では、Lambda 関数を呼び出すために必要なリソースベースのアクセス許可がコンソールによって自動的に追加されます。後者では、より詳細に制御できますが、適切なアクセス許可を含む IAM ロールを作成して指定するなど、統合の設定に伴う責任が増えます。

AWS Lambda 関数の API GatewayAPI を作成する - Amazon API Gateway

つまり統合タイプLambda関数はAWSサービスの簡略化されたエイリアス(?)で、詳細な設定をしたい場合はAWSサービスを選択してねということ。

統合タイプをAWSサービスにする

統合リクエストから統合タイプをAWSサービスにすると

  • AWSリージョン
  • AWSサービス
  • AWSサブドメイン
  • HTTPメソッド
  • アクションの種類
  • アクション
  • 実行ロール
  • コンテンツの処理

の項目が新しく表示される。

image

アクションの種類>パス上書きの使用を選択すると、アクションの項目がパス上書き(省略可能)に変わるので/2015-03-31/functions/<FunctionArn>/invocationsと入力する。 <FunctionArn>はLambda関数の右上に表示されるARNを入力する

image

APIGateway がLambdawo呼び出せるようにロールを設定する

IAMのメニューからロールを選択し、新しいロールを作成するを選択する。 ロールの作成画面に移るので、ロールタイプの選択をする。 今回はAPIGatewayのロールを作成するのでAmazon API Gatewayを選択する

image

ポリシーのアタッチは何も選択せず次のステップボタンをクリックする。 確認画面が出るのでロール名を入力してロールの作成をする。 今回はAPIGatewayInvokeLambdaFuncという名前でロールを作成した。 ロールの一覧が表示されロールが作成されたことが分かる。

image

このままではLambda関数を呼び出せないので上で作成sたロールにポリシーを追加する。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment