AWSLambdaで次のLambda関数を設定しています。
var AWS = require('aws-sdk');
var DOC = require('dynamodb-doc');
var dynamo = new DOC.DynamoDB();
exports.handler = function(event, context) {
var item = { id: 123,
foo: "bar"};
var cb = function(err, data) {
if(err) {
console.log(err);
context.fail('unable to update hit at this time' + err);
} else {
console.log(data);
context.done(null, data);
}
};
// This doesn't work. How do I get current stage ?
tableName = 'my_dynamo_table_' + stage;
dynamo.putItem({TableName:tableName, Item:item}, cb);
};
すべてが期待どおりに機能します(呼び出すたびにDynamoDBにアイテムを挿入します)。
ダイナモテーブルの名前は、ラムダがデプロイされるステージによって異なります。
私のテーブルは次のようになります。
my_dynamo_table_staging
ステージ用staging
my_dynamo_table_prod
ステージ用prod
ただし、ラムダ内の現在のステージの名前を取得するにはどうすればよいですか?
編集:私のLambdaは、APIGatewayで定義されたエンドポイントを介してHTTPによって呼び出されます
APIGatewayのメソッド統合リクエストで「LambdaProxyIntegration」をチェックした場合は、APIGatewayからstage
と、設定したstageVariable
を受け取る必要があります。
「LambdaProxyIntegration」で構成されたAPIGatewayによって呼び出されたLambda関数からのevent
オブジェクトの例を次に示します。
{
"resource": "/resourceName",
"path": "/resourceName",
"httpMethod": "POST",
"headers": {
"header1": "value1",
"header2": "value2"
},
"queryStringParameters": null,
"pathParameters": null,
"stageVariables": null,
"requestContext": {
"accountId": "123",
"resourceId": "abc",
"stage": "dev",
"requestId": "456",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"apiKey": null,
"sourceIp": "1.1.1.1",
"accessKey": null,
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": "agent",
"user": null
},
"resourcePath": "/resourceName",
"httpMethod": "POST",
"apiId": "abc123"
},
"body": "body here",
"isBase64Encoded": false
}
何度もいじった後、なんとかやりました。ウォークスルーは次のとおりです。
APIGatewayとLambdaが設定されていると仮定します。そうでない場合、 ここに良いガイドがあります 。パート1とパート2が必要です。 API Gatewayで新しく導入されたボタン「EnableCORS」をクリックすると、パート2の終わりをスキップできます。
APIゲートウェイに移動します。
ここをクリック:
ここをクリック:
次に、Body Mapping Templates
を展開し、コンテンツタイプとしてapplication/json
を入力し、[追加]ボタンをクリックして、マッピングテンプレートを選択し、[編集]をクリックします。
そして、「マッピングテンプレート」に次のコンテンツを貼り付けます。
{
"body" : $input.json('$'),
"headers": {
#foreach($param in $input.params().header.keySet())
"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end
#end
},
"stage" : "$context.stage"
}
次に、[Deploy API]ボタンをクリックします(これは、API Gatewayの変更を有効にするために重要です)
Lambda関数を次のように変更してテストできます。
var AWS = require('aws-sdk');
var DOC = require('dynamodb-doc');
var dynamo = new DOC.DynamoDB();
exports.handler = function(event, context) {
var currentStage = event['stage'];
if (true || !currentStage) { // Used for debugging
context.fail('Cannot find currentStage.' + ' stage is:'+currentStage);
return;
}
// ...
}
次に、エンドポイントを呼び出します。次の応答本文を含むHTTP200応答が必要です。
{"errorMessage":"Cannot find currentStage. stage is:development"}
重要な注意:
次のように単純すぎるBody Mapping Template
がある場合:{"stage" : "$context.stage"}
、これはリクエストのパラメータを上書きします。そのため、body
キーとheaders
キーがBody Mapping Template
に存在します。そうでない場合、Lambdaはそれにアクセスできません。
サーバーレスフレームワーク を使用している場合は、すでに実装されており、追加の構成なしでevent.stage
にアクセスできます。
詳細については、 この問題 を参照してください。
イベント変数から取得できます。イベントオブジェクトをログに記録して取得しました。
{ ...
"resource": "/test"
"stageVariables": {
"Alias": "beta"
}
}