2016-03-23 12 views
6

Mam następującą funkcję Lambda skonfigurowanym w AWS lambda:Jak uzyskać nazwę scenie w funkcji AWS Lambda połączonego z API Brama

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); 
}; 

wszystko działa zgodnie z oczekiwaniami (I wstawić element DynamoDB każdego czas to nazywam).

Chciałbym, aby nazwa tabeli dynamo była zależna od etapu wdrożenia lambda.

Moja tabela będzie:

  • my_dynamo_table_staging na etapie staging
  • my_dynamo_table_prod na etapie prod

Jednak, jak mogę uzyskać nazwę obecnym etapie wewnątrz lambda?

Edit: My Lambda jest wywoływany przez HTTP za pośrednictwem punktu końcowego zdefiniowanego z API Brama

+0

** Aktualizacji **: AWS niedawno walcowane na nową funkcję o nazwie [Zmienne środowiskowe i bezserwerowy model aplikacji (SAM)] (https://aws.amazon.com/blogs/aws/new-for-aws-lambda-environment-variables-and-serverless-application-model/). Jest to wbudowany sposób dostarczania zmiennych środowiskowych do funkcji Lambda. ([dyskusja tutaj] (https://news.ycombinator.com/item?id=12999767)) –

Odpowiedz

6

udało mi to po znacznie błahy. Oto przewodnik:

Zakładam, że masz skonfigurowane bramki API i Lambda. Jeśli nie, here's a good guide. Potrzebujesz części-1 i części-2. Możesz pominąć koniec części drugiej, klikając nowo wprowadzony przycisk "Włącz CORS" w bramce interfejsu API

Przejdź do bramy interfejsu API.

kliknij tutaj:

enter image description here

kliknij tutaj:

enter image description here

Następnie rozwiń Body Mapping Templates wprowadź application/json jako typ zawartości, kliknij przycisk Add, a następnie wybrać szablon mapowania, kliknij Edytuj

enter image description here

i wklej następujący zawartość „mapowania szablonu”:

{ 
    "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" 
} 

następnie kliknąć przycisk „Instaluj API” (jest to ważne dla zmian w API bramy zaczął działać)

można przetestować zmieniając funkcję Lambda na:

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; 
    } 

// ... 
} 

Następnie wywołaj swój punkt końcowy.Powinieneś mieć odpowiedź HTTP 200, z następującym organizmie reakcji:

{"errorMessage":"Cannot find currentStage. stage is:development"} 

Ważna uwaga:
Jeśli masz Body Mapping Template że jest zbyt proste, jak to: {"stage" : "$context.stage"}, to zastąpi params w żądaniu. Dlatego klucze body i headers są obecne w Body Mapping Template. Jeśli tak nie jest, twoja Lambda nie ma do niego dostępu.

1

Dla tych, którzy korzystają z serverless framework jest już zaimplementowany i mogą uzyskać dostęp do event.stage bez żadnych dodatkowych konfiguracji.

Aby uzyskać więcej informacji, patrz this issue.

4

Jeśli zaznaczyłeś "Lambda Proxy Integration" w żądaniu integracji metod w bramce interfejsu API, powinieneś otrzymać stage z API Gateway, a także dowolne skonfigurowane .

Oto przykładem event obiektu z funkcji Lambda wywoływanego przez API bramy skonfigurowanym z „Lambda Integracji Proxy”:

{ 
"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 
} 
+0

Jak uzyskać dostęp do tego w Lambda (java) – DevilCode