2016-03-23 15 views
6

Ho la seguente funzione Lambda configurata in AWS Lambda:Come ottenere il nome dello stadio in una funzione AWS Lambda legata al gateway API

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

Tutto funziona come previsto (I inserire un elemento in DynamoDB ogni ora lo chiamo).

Desidero che il nome della tabella dinamo dipenda dallo stadio in cui viene distribuita la lambda.

Il mio tavolo sarebbe:

  • my_dynamo_table_staging per la fase staging
  • my_dynamo_table_prod per la fase prod

Tuttavia, come faccio ad ottenere il nome della fase corrente all'interno del lambda?

Edit: Il mio Lambda viene invocato da HTTP tramite un endpoint definito con gateway API

+0

** Aggiornamento **: AWS ha recentemente lanciato una nuova funzionalità denominata [Variabili d'ambiente e Serverless Application Model (SAM)] (https://aws.amazon.com/blogs/aws/new-for-aws-lambda-environment-variables-and-serverless-application-model/). È un modo integrato per fornire variabili di ambiente alle funzioni Lambda. ([discussione qui] (https://news.ycombinator.com/item?id=12999767)) –

risposta

6

sono riuscito dopo molto armeggiare. Ecco una soluzione:

Suppongo che tu abbia configurato Gateway API e Lambda. In caso contrario, here's a good guide. Hai bisogno di parte 1 e parte 2. È possibile saltare la fine di parte-2 facendo clic sul pulsante appena introdotto "Abilita CORS" nel gateway API

Passare al gateway API.

Clicca qui:

enter image description here

Clicca qui:

enter image description here

quindi espandere Body Mapping Templates, immettere application/json come tipo di contenuto, fare clic sul pulsante Aggiungi, quindi selezionare modello di mappatura, fare clic su Modifica

enter image description here

e incolla il seguente contenuto in "Template Mapping":

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

Quindi fare clic sul pulsante "Deploy API" (questo è importante per i cambiamenti nel gateway API abbiano effetto)

È possibile verificare cambiando la funzione Lambda a questo:

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

// ... 
} 

Quindi chiamare il proprio endpoint.Si dovrebbe avere una risposta HTTP 200, con il seguente corpo della risposta:

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

Nota importante:
Se si dispone di un Body Mapping Template che è troppo semplice, in questo modo: {"stage" : "$context.stage"}, questo sovrascriverà la parametri nella richiesta. Ecco perché le chiavi body e headers sono presenti nello Body Mapping Template. Se non lo sono, il tuo Lambda non ha accesso ad esso.

1

Per coloro che utilizzano il serverless framework è già implementato e possono accedere a event.stage senza alcuna configurazione aggiuntiva.

Vedere this issue per ulteriori informazioni.

4

Se è stata selezionata l'opzione "Integrazione proxy Lambda" nella richiesta di integrazione del metodo sul gateway API, è necessario ricevere stage dal gateway API e qualsiasi stageVariable configurato.

Ecco un esempio di un oggetto event da una funzione lambda invocata da gateway API configurato con "Integrazione Proxy Lambda":

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

Come si accede a questo all'interno di Lambda (java) – DevilCode

Problemi correlati