5

मेरे पास जावा में लिखा गया एडब्ल्यूएस लैम्ब्डा फ़ंक्शन है जो मैं एडब्ल्यूएस क्लाउडफॉर्मेशन फ़ंक्शन के जवाब के हिस्से के रूप में उपयोग करना चाहता हूं। अमेज़ॅन क्लाउडफॉर्मेशन कस्टम संसाधन बनाने के तरीके पर two detailed examples प्रदान करता है जो Node.js में लिखे गए एडब्ल्यूएस लैम्ब्डा फ़ंक्शन के आधार पर अपना मान देता है, हालांकि मुझे लैम्ब्डा उदाहरणों को जावा में अनुवाद करने में कठिनाई हो रही है। हम अपने एडब्ल्यूएस जावा फ़ंक्शन को कैसे सेट अप कर सकते हैं ताकि यह क्लाउडफॉर्मेशन से लैम्ब्डा फ़ंक्शन के पैरामीटर के रूप में पास किए गए पूर्व-हस्ताक्षरित S3 यूआरएल के मान को पढ़ सके और प्रतीक्षा क्लाउडफॉर्मेशन टेम्पलेट पर हमारी वांछित प्रतिक्रिया वापस भेज सके?जावा में लिखे गए एडब्ल्यूएस लैम्ब्डा फ़ंक्शन का उपयोग करके क्लाउडफॉर्मेशन कस्टम संसाधनों का उपयोग और जवाब कैसे प्राप्त करते हैं?

उत्तर

6

एडब्ल्यूएस के साथ आगे और आगे बातचीत के बाद, यहां कुछ कोड नमूने हैं जिन्हें मैंने बनाया है।

सबसे पहले, यह सोचते हैं आप leverage the predefined interfaces for creating Handlers करना चाहते हैं, तो आप RequestsHandler को लागू करने और इसलिए तरह HandleRequest पद्धतियां निर्धारित कर सकते हैं:

public class MyCloudFormationResponder implements RequestHandler<Map<String, Object>, Object>{ 
    public Object handleRequest(Map<String,Object> input, Context context) { 
     ... 
    } 
} 

Map<String, Object> मूल्यों की एक मानचित्र लैम्ब्डा समारोह के लिए अपने CloudFormation संसाधन से भेजे गए है । एक उदाहरण सीएफ संसाधन:

"MyCustomResource": { 
    "Type" : "Custom::String", 
    "Version" : "1.0", 
    "Properties": { 
    "ServiceToken": "arn:aws:lambda:us-east-1:xxxxxxx:function:MyCloudFormationResponderLambdaFunction", 
    "param1": "my value1", 
    "param2": ["t1.micro", "m1.small", "m1.large"] 
    } 
} 

यहाँ से बाहर बात करने के लिए, परे क्या एडब्ल्यूएस दस्तावेज में NodeJS उदाहरण से समझाया गया है

हैं

String responseURL = (String)input.get("ResponseURL"); 
    context.getLogger().log("ResponseURLInput: " + responseURL); 
    context.getLogger().log("StackId Input: " + input.get("StackId")); 
    context.getLogger().log("RequestId Input: " + input.get("RequestId")); 
    context.getLogger().log("LogicalResourceId Context: " + input.get("LogicalResourceId")); 
    context.getLogger().log("Physical Context: " + context.getLogStreamName()); 
    @SuppressWarnings("unchecked") 
    Map<String,Object> resourceProps = (Map<String,Object>)input.get("ResourceProperties"); 
    context.getLogger().log("param 1: " + resourceProps.get("param1")); 
    @SuppressWarnings("unchecked") 
    List<String> myList = (ArrayList<String>)resourceProps.get("param2"); 
    for(String s : myList){ 
     context.getLogger().log(s); 
    } 

महत्वपूर्ण बातें निम्न कोड के साथ विश्लेषण किया जा सकता

  • (String)input.get("ResponseURL") प्री-हस्ताक्षरित एस 3 यूआरएल है जिसे आपको जवाब देने की आवश्यकता है (बाद में इस पर अधिक)
  • (Map<String,Object>)input.get("ResourceProperties") आपके क्लाउडफॉर्मेशन कस्टम संसाधन "गुण" का मानचित्र आपके सीएफ टेम्पलेट से लैम्ब्डा फ़ंक्शन में पास कर देता है। मैं हालांकि कई अन्य आदेश वापस CloudFormation टेम्पलेट कस्टम संसाधन इन्स्टेन्शियशन के लिए प्रतिक्रिया करने में संभव

हैं, वस्तु प्रकार है कि वापस किया जा सकता के दो उदाहरण के रूप में एक स्ट्रिंग और ArrayList प्रदान की है, आप एक HTTP PUT कॉल बैक पर अमल करने की जरूरत है ResponseURL को पहले उल्लेख किया गया है और चर के cloudFormationJsonResponse में निम्न में से अधिकांश फ़ील्ड शामिल हैं। नीचे मैंने किया है इस

try { 
     URL url = new URL(responseURL); 
     HttpURLConnection connection=(HttpURLConnection)url.openConnection(); 
     connection.setDoOutput(true); 
     connection.setRequestMethod("PUT"); 
     OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); 
     JSONObject cloudFormationJsonResponse = new JSONObject(); 
     try { 
      cloudFormationJsonResponse.put("Status", "SUCCESS"); 
      cloudFormationJsonResponse.put("PhysicalResourceId", context.getLogStreamName()); 
      cloudFormationJsonResponse.put("StackId", input.get("StackId")); 
      cloudFormationJsonResponse.put("RequestId", input.get("RequestId")); 
      cloudFormationJsonResponse.put("LogicalResourceId", input.get("LogicalResourceId")); 
      cloudFormationJsonResponse.put("Data", new JSONObject().put("CFAttributeRefName", "some String value useful in your CloudFormation template")); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     out.write(cloudFormationJsonResponse.toString()); 
     out.close(); 
     int responseCode = connection.getResponseCode(); 
     context.getLogger().log("Response Code: " + responseCode); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
विशेष ध्यान दें

नोड "डेटा" का संदर्भ एक अतिरिक्त com.amazonaws.util.json.JSONObject जिसमें मैं कोई गुण है कि मेरे CloudFormation टेम्पलेट में आवश्यक हैं शामिल हैं जो ऊपर है। इस मामले में, यह { "Fn::GetAtt": [ "MyCustomResource", "CFAttributeRefName" ] }

अंत की तरह कुछ के साथ सीएफ टेम्पलेट में पुनः प्राप्त किया जा जाएगा, तो आप बस return null के बाद से कुछ भी नहीं है इस समारोह से लौटा दिया जाएगा के रूप में यह HTTPUrlConnection है कि वास्तव में सीएफ कॉल का जवाब है कर सकते हैं।

+0

आप बाल्टी के रूप में मैं प्रतिक्रिया कस्टम संसाधन से वापस पढ़ने जब मैं यह बाल्टी के लिए भेजा के साथ एक समस्या है जहां प्रतिक्रिया भेज दिया जाता है के लिए कोई भी अनुमतियां देते हैं? मेरा लैम्ब्डा डेटा को सही तरीके से भेज रहा है और फिर क्लाउडफॉर्मेशन लटकता है क्योंकि ऐसा लगता है कि इसे कभी अधिसूचित नहीं किया जाता है। –

+0

Awkwardly respondURL का अनुरोध एक त्रुटि के साथ विफल रहता है जिसे मैं समझ नहीं सकता: आपके द्वारा प्रदत्त अनुरोध हस्ताक्षर आपके द्वारा प्रदान किए गए हस्ताक्षर से मेल नहीं खाता है। अपनी कुंजी और हस्ताक्षर विधि की जांच करें। क्या आपको इसका सामना करना पड़ा है और क्या आप जानते हैं कि इसका वास्तव में क्या अर्थ है? –

0

नील,

मैं वास्तव में यहां आपके महान दस्तावेज़ों की सराहना करता हूं। मैं कुछ चीजें जोड़ूंगा जो मुझे उपयोगी मिली:

input.get ("RequestType") - यह "बनाएं", "हटाएं" आदि के रूप में वापस आता है। यह निर्धारित करने के लिए आप इस मान का उपयोग कर सकते हैं कि क्या करना है ढेर बनाया गया है, हटाया गया है, आदि ..

जहां तक ​​सुरक्षा है, मैंने लैम्ब्डा फ़ंक्शन अपलोड किए हैं और वीपीसी, सबनेट्स और सुरक्षा समूह (डिफ़ॉल्ट) को मैन्युअल रूप से सेट किया है, इसलिए मैं इसे कई क्लाउडॉर्मन स्क्रिप्ट के साथ पुन: उपयोग कर सकता हूं। ऐसा लगता है कि ठीक काम कर रहा है।

मैंने एक लैम्ब्डा फ़ंक्शन बनाया जिसे सीएफ स्क्रिप्ट द्वारा बुलाया जाता है और एक व्यक्ति मैन्युअल रूप से विफल होने पर मैन्युअल रूप से चला सकता है।

यह उत्कृष्ट ग्रेडल aws प्लगइन जावा लैम्ब्डा कार्यों को एडब्ल्यूएस में अपलोड करना आसान बनाता है।

Gradle AWS Plugin

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