今回は test_func
という名前で、2000ms まってからリクエスト本文を返すだけの Lambda を作成した。
'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 が他のAWSサービスにアクセする場合ここで適切なポリシー(権限のグループ?)を付与する。
今回は特別な操作をしないのでポリシーテンプレートを何も選択せず、test_func_role
という名前でロールを作成した。
するとIAMにてロールが作成されていることが確認できる。
コンソールで保存した後、テストをする。 所要時間が2000ms以上になっていることが確認できる。
LambdaAsync
という名前で作成した。
ひとまずANYメソッドを作成する。 統合タイプはLambda関数。LambdaリージョンとLambda関数は上で作成したLambda関数に合わせて設定する。
保存しようとすると「Lambda 関数に権限を追加する」というプロンプトが出るのでOKを押す。 すると適切なロールが適用される。
POSTメソッドを選択して適当なリクエスト本文をいれテストすると、2000ms後にレスポンスが返ってくるので正しくLambda関数を呼び出せていることが分かる。
正しくLambdaを実行できていることがわかったので次からこれを非同期化する。
Lambdaを呼び出す際にX-Amz-Invocation-Type; Event
ヘッダーを追加することで非同期呼び出しになる。
Lambda 関数の非同期呼び出しをサポートするには、X-Amz-Invocation-Type:Event ヘッダーを統合リクエストに明示的に追加する必要があります。
AWS Lambda 関数の API GatewayAPI を作成する - Amazon API Gateway
ANYメソッドの統合リクエストを見るとヘッダーを触れる場所がないことが分かる。
ダメ元でメソッドリクエストのリクエストヘッダーにX-Amz-Invocation-Type
を追加する。
テストするとEvent
を指定しているのにもかかわらずきっちり2000ms掛かっていることがわかる。
Lambda Function オプションは、AWS Service 統合タイプの特殊なケースであり、デフォルト設定を使用して統合のセットアップを簡素化します。たとえば、前者では、Lambda 関数を呼び出すために必要なリソースベースのアクセス許可がコンソールによって自動的に追加されます。後者では、より詳細に制御できますが、適切なアクセス許可を含む IAM ロールを作成して指定するなど、統合の設定に伴う責任が増えます。
AWS Lambda 関数の API GatewayAPI を作成する - Amazon API Gateway
つまり統合タイプ
のLambda関数
はAWSサービスの簡略化されたエイリアス(?)で、詳細な設定をしたい場合はAWSサービスを選択してねということ。
統合リクエストから統合タイプをAWSサービスにすると
- AWSリージョン
- AWSサービス
- AWSサブドメイン
- HTTPメソッド
- アクションの種類
- アクション
- 実行ロール
- コンテンツの処理
の項目が新しく表示される。
アクションの種類>パス上書きの使用を選択すると、アクションの項目がパス上書き(省略可能)に変わるので/2015-03-31/functions/<FunctionArn>/invocations
と入力する。
<FunctionArn>
はLambda関数の右上に表示されるARNを入力する
IAMのメニューからロールを選択し、新しいロールを作成するを選択する。 ロールの作成画面に移るので、ロールタイプの選択をする。 今回はAPIGatewayのロールを作成するのでAmazon API Gatewayを選択する
ポリシーのアタッチは何も選択せず次のステップボタンをクリックする。 確認画面が出るのでロール名を入力してロールの作成をする。 今回はAPIGatewayInvokeLambdaFuncという名前でロールを作成した。 ロールの一覧が表示されロールが作成されたことが分かる。
このままではLambda関数を呼び出せないので上で作成sたロールにポリシーを追加する。