2016-03-23 9 views
6

एक एडब्ल्यूएस लैम्ब्डा समारोह में मंच मैं एडब्ल्यूएस लैम्ब्डा में निम्नलिखित लैम्ब्डा समारोह कॉन्फ़िगर किए गए नाम पाने के लिए:कैसे एपीआई से जुड़ा हुआ गेटवे

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

के लिए हालांकि, मैं कैसे लैम्ब्डा के अंदर वर्तमान चरण के नाम मिलता है?

संपादित: मेरी लैम्ब्डा मैं इसे बहुत बाद नगण्य कामयाब रहे कि समाप्ति बिंदु एपीआई गेटवे

+0

** अद्यतन **: एडब्ल्यूएस हाल ही में एक नई सुविधा शुरू की [पर्यावरण चर

यहाँ एक लैम्ब्डा समारोह एपीआई गेटवे द्वारा लाया से एक event वस्तु "लैम्ब्डा प्रॉक्सी एकता" के साथ विन्यस्त का एक उदाहरण है और सर्वरलेस एप्लिकेशन मॉडल (एसएएम)] (https://aws.amazon.com/blogs/aws/new-for-aws-lambda-environment-variables-and-serverless-plication-model/)। यह आपके लैम्ब्डा कार्यों में पर्यावरण चर की आपूर्ति करने का एक अंतर्निहित तरीका है। ([यहां चर्चा] (https://news.ycombinator.com/item?id=12999767)) –

उत्तर

6

के साथ परिभाषित के माध्यम से HTTP द्वारा लाया जाता है। यहां एक walkthrough है:

मुझे लगता है कि आपके पास एपीआई गेटवे और लैम्ब्डा कॉन्फ़िगर किया गया है। यदि नहीं, here's a good guide। आपको भाग -1 और भाग -2 की आवश्यकता है। आप एपीआई गेटवे

एपीआई गेटवे पर जाएं, नए पेश किए गए बटन "सीओआरएस सक्षम करें" पर क्लिक करके भाग -2 के अंत को छोड़कर भाग -2 के अंत को छोड़ सकते हैं।

लिए यहां क्लिक करें:

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

फिर बटन "तैनात एपीआई" पर क्लिक करें

परीक्षण कर सकते हैं (इस एपीआई गेटवे में परिवर्तनों को प्रभावी करने के लिए महत्वपूर्ण है) लैम्ब्डा फ़ंक्शन को इस पर बदलकर:

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

// ... 
} 

फिर अपना एंडपॉइंट कॉल करें।

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

महत्वपूर्ण नोट::
आप एक Body Mapping Template कि बहुत आसान है, इस तरह है: {"stage" : "$context.stage"}, इस स्थान पर आ जाएगी आप निम्न प्रतिक्रिया शरीर के साथ, एक HTTP 200 प्रत्युत्तर होना चाहिए अनुरोध में पैराम। यही कारण है कि body और headers कुंजी Body Mapping Template में मौजूद हैं। यदि वे नहीं हैं, तो आपके लैम्ब्डा तक इसका उपयोग नहीं है।

1

serverless framework का उपयोग करने वाले लोगों के लिए यह पहले ही लागू हो चुका है और वे बिना किसी अतिरिक्त कॉन्फ़िगरेशन के event.stage तक पहुंच सकते हैं।

अधिक जानकारी के लिए this issue देखें।

4

यदि आपने एपीआई गेटवे पर अपने विधि एकीकरण अनुरोध में "लैम्ब्डा प्रॉक्सी एकीकरण" की जांच की है, तो आपको एपीआई गेटवे से stage, साथ ही साथ stageVariable कॉन्फ़िगर किया जाना चाहिए।

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

आप Lambda (जावा) के भीतर कैसे पहुंचते हैं – DevilCode

संबंधित मुद्दे