web-dev-qa-db-ja.com

APIGatewayにリンクされたAWSLambda関数でステージの名前を取得する方法

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によって呼び出されます

15

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
}
12
JS1010111

何度もいじった後、なんとかやりました。ウォークスルーは次のとおりです。

APIGatewayとLambdaが設定されていると仮定します。そうでない場合、 ここに良いガイドがあります 。パート1とパート2が必要です。 API Gatewayで新しく導入されたボタン「EnableCORS」をクリックすると、パート2の終わりをスキップできます。

APIゲートウェイに移動します。

ここをクリック:

enter image description here

ここをクリック:

enter image description here

次に、Body Mapping Templatesを展開し、コンテンツタイプとしてapplication/jsonを入力し、[追加]ボタンをクリックして、マッピングテンプレートを選択し、[編集]をクリックします。

enter image description here

そして、「マッピングテンプレート」に次のコンテンツを貼り付けます。

{
  "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はそれにアクセスできません。

7

サーバーレスフレームワーク を使用している場合は、すでに実装されており、追加の構成なしでevent.stageにアクセスできます。

詳細については、 この問題 を参照してください。

1
yishaiz

イベント変数から取得できます。イベントオブジェクトをログに記録して取得しました。

{  ...
    "resource": "/test"
    "stageVariables": {
        "Alias": "beta"
    }
}
0
Divyansh Singh