2017-05-18 107 views
0

我一直在尝试使用lambda支持的自定义resources.Iam试图用Custom Resource触发Lambda函数。在创建堆栈时,自定义资源挂在CREATE_IN_PROGRESS上,但Iam能够获得电子邮件,并且在尝试删除堆栈时,它还会在DELETE_IN_PROGRESS上进行扫描。创建堆栈CREATE_IN_PROGRESS

现在我有五个堆栈挂在DELETE_IN_PROGRESS上。自定义资源在哪里创建?

 "SendEmailNotification" : { 
     "Type": "AWS::Lambda::Function", 
     "Properties": { 
      "Handler": "index.handler", 
      "Role": { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] }, 
      "Code": { 
       "ZipFile": { "Fn::Join": ["", [ 
        "var aws = require('aws-sdk');\n", 
        "var response = require('cfn-response');", 
        "var ses = new aws.SES({\n", 
        "region:'us-east-1'\n", 
        "});\n", 
        "exports.handler = function(event, context) {\n", 
        "console.log('Incoming: ', event);\n", 
        "var eParams = {\n", 
        "Destination: {\n" , 
        {"Fn::Join" : ["",["ToAddresses: ['",{ "Ref" : "EmailId" },"']\n"]]}, 
        "},\n", 
        "Message: {\n", 
        "Body: {\n", 
        "Text: {\n", 
        {"Fn::Join" : ["",["Data: '", { "Fn::ImportValue" : "DNSName" },"'\n"]]}, 
        "}\n", 
        "},\n", 
        "Subject: {\n", 
        "Data: 'Route53 Hosted Zone'\n", 
        "}\n", 
        "},\n", 
        {"Fn::Join" : ["",["Source: '",{ "Ref" : "EmailId" },"'\n"]]}, 
        "};\n", 
        "console.log('SENDING EMAIL');\n", 
        "var email = ses.sendEmail(eParams, function(err, data){\n", 
        "if(err) console.log(err);\n", 
        "else {\n", 
        "console.log('EMAIL SENT');\n", 
        "console.log(data);\n", 
        "console.log('EMAIL: ', email);\n", 
        "context.succeed(event);\n", 
        "response.send(event, context, response.SUCCESS);\n", 
        "}\n", 
        "});\n", 
        "};" 
       ]]} 
      }, 
      "Runtime": "nodejs6.10" 
     } 
    }, 
    "TestResource": { 
     "Type": "Custom::TestResource", 
     "Properties": { 
      "ServiceToken": { "Fn::GetAtt" : ["SendEmailNotification","Arn"] } 
     } 
    } 

回答

0

您的模板挂起,因为lambda没有正确执行回调到cloudformation的回调。如果发生错误,您首先不会发送回调,但除此之外,您首先用“context.succeed(event);”终止Lambda;“然后调用“response.send(event,context,response.SUCCESS);”。

对于正确的实现,你只需要调用response.send函数。在该函数中,callback.succeed将被调用。

您可以使用本网站上的示例作为参考。 aws lambda for cloudformation