2016-03-23 13 views
6

Tôi đã chức năng Lambda sau cấu hình trong AWS Lambda:Làm thế nào để có được tên của sân khấu trong một chức năng AWS Lambda liên quan đến API Gateway

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

Mọi thứ hoạt động như mong đợi (tôi chèn một mục trong DynamoDB mỗi thời gian tôi gọi nó).

Tôi muốn tên bảng máy phát điện phụ thuộc vào giai đoạn mà lambda được triển khai.

bảng của tôi sẽ là:

  • my_dynamo_table_staging cho giai đoạn staging
  • my_dynamo_table_prod cho giai đoạn prod

Tuy nhiên, làm thế nào để tôi có được tên của giai đoạn hiện tại bên trong lambda?

Sửa: My Lambda được gọi bởi HTTP thông qua một thiết bị đầu cuối được xác định với API Gateway

+0

** Update **: AWS gần đây tung ra một tính năng mới gọi là [Environment Variables và Mô hình ứng dụng không có máy chủ (SAM)] (https://aws.amazon.com/blogs/aws/new-for-aws-lambda-environment-variables-and-serverless-application-model/). Nó là một cách tích hợp để cung cấp các biến môi trường cho các hàm Lambda của bạn. ([thảo luận tại đây] (https://news.ycombinator.com/item?id=12999767)) –

Trả lời

6

tôi quản lý nó sau khi nhiều không quan trọng. Dưới đây là hướng dẫn:

Tôi giả định rằng bạn đã định cấu hình API cổng và Lambda. Nếu không, here's a good guide. Bạn cần part-1 và part-2. Bạn có thể bỏ qua phần cuối của phần 2 bằng cách nhấp vào nút vừa được giới thiệu "Bật CORS" trong Cổng API

Đi tới Cổng API.

Bấm vào đây:

enter image description here

Bấm vào đây:

enter image description here

Sau đó mở rộng Body Mapping Templates, nhập application/json như kiểu nội dung, nhấp vào nút add, sau đó chọn mẫu lập bản đồ, nhấp vào chỉnh sửa

enter image description here

Và dán nội dung sau đây trong "Mapping Template":

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

Sau đó nhấp vào nút "Triển khai API" (điều này là rất quan trọng cho những thay đổi trong API Gateway có hiệu lực)

Bạn có thể kiểm tra bằng cách thay đổi chức năng Lambda thành điều này:

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

// ... 
} 

Sau đó gọi điểm cuối của bạn.Bạn nên có một phản ứng HTTP 200, với cơ thể phản ứng sau:

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

Lưu ý quan trọng:
Nếu bạn có một Body Mapping Template đó là quá đơn giản, như thế này: {"stage" : "$context.stage"}, điều này sẽ ghi đè lên params trong yêu cầu. Đó là lý do tại sao các phím bodyheaders có trong Body Mapping Template. Nếu không, Lambda của bạn không truy cập được.

1

Đối với những người sử dụng serverless framework, nó đã được triển khai và họ có thể truy cập vào event.stage mà không cần bất kỳ cấu hình bổ sung nào.

Xem this issue để biết thêm thông tin.

4

Nếu bạn đã chọn "Tích hợp proxy Lambda" trong Yêu cầu tích hợp phương pháp trên Cổng API, bạn sẽ nhận được stage từ Cổng API, cũng như bất kỳ stageVariable nào bạn đã định cấu hình.

Dưới đây là một ví dụ về một đối tượng event từ một hàm Lambda gọi bởi API Gateway cấu hình với "Lambda Proxy Integration":

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

Làm thế nào để bạn truy cập vào trong Lambda (java) – DevilCode

Các vấn đề liên quan