2016-03-29 21 views
0

Lambda işlevinden döndürülen bir değeri kullanmaya çalışıyorum. CloudFormation özel kaynakları; Ancak, denediğimde CloudFormation Özel kaynağı bekleme durumunda kalacaktır.AWS CloudFormation özel lambda işlevi oluşturulduğunda sıkışmış

CloudFormation komut aşağıdaki Lambda Düğümü ben çalışıyorum kodu ve

exports.handler = function(event, context) { 
    var date = new Date(); 
    var current_hour = date.getHours(); 
    console.log("START :: " + current_hour); 

    console.log("END :: " + current_hour); 
    data = { 
     "val1" : "val1", 
     "val2" : "val2" 
    }; 

    result = { 
     "Status" : "SUCCESS", 
     "Reason" : "Success Reason", 
     "PhysicalResourceId" : "LambdaCustomDelayFunction", 
     "StackId" : event.StackId, 
     "RequestId" : event.RequestId, 
     "LogicalResourceId" : event.LogicalResourceId, 
     "Data" : data 
    }; 
    console.log('---Event---'); 
    console.log(event); 
    console.log('---Context---'); 
    console.log(context); 
    console.log('---Result---'); 
    console.log(result); 

    context.done(null, result); 
}; 

, ben

"DelayFunction" : { 
     "Type" : "Custom::Delayer", 
     "Properties" : { 
     "ServiceToken" : "arn:aws:lambda:us-east-1-123456778:function:delayfunction" 
     } 
     }, 
"MySG": { 
     "Type": "AWS::EC2::SecurityGroup", 
     "Properties": { 
     "GroupDescription": " Server SG 1", 
     "VpcId": { 
      "Ref": "VPC" 
     }, 
     "SecurityGroupIngress": [ 
      { 
      "IpProtocol": "-1", 
      "CidrIp": "10.0.0.0/16" 
      } 
     ], 
     "SecurityGroupEgress": [ 
      { 
      "IpProtocol": "-1", 
      "CidrIp": "0.0.0.0/0" 
      } 
     ], 
     "Tags": [ 
      { 
      "Key": "Name", 
      "Value": "SG 1" 
      }, 
      {"Key":"Lambda", "Value":{ "Fn::GetAtt" : ["DelayFunction", "val1"]}} <------ Trying to retrieve the value 
     ] 
     } 
    } 

cevap

2

Doğru yoldasınız, ancak CloudFormation API'si, result nesnesini, JSON kodlu bir gövde olarak istek olayında sağlanan önceden imzalanmış ResponseURL numaralı öğeye PUT yapmanızı gerektirir. Custom Resources belgelerine bakınız:

  1. özel kaynak sağlayıcı AWS CloudFormation isteği işler ve BAŞARI ilişkin bir yanıt verir ya da önceden imzalanan URL'ye BAŞARISIZ. [...] AWS CloudFormation, önceden işaretlenmiş URL konumunda bir yanıt bekler ve dinler. [...]
  2. BAŞARI yanıtı alındıktan sonra AWS CloudFormation yığın işlemiyle devam eder. FAILURE veya yanıt alınmazsa, işlem başarısız olur.

    var responseBody = JSON.stringify(result); 
    var https = require("https"); 
    var url = require("url"); 
    
    var parsedUrl = url.parse(event.ResponseURL); 
    var options = { 
        hostname: parsedUrl.hostname, 
        port: 443, 
        path: parsedUrl.path, 
        method: "PUT", 
        headers: { 
         "content-type": "", 
         "content-length": responseBody.length 
        } 
    }; 
    
    var request = https.request(options, function(response) { 
        console.log("Status code: " + response.statusCode); 
        console.log("Status message: " + response.statusMessage); 
        context.done(); 
    }); 
    
    request.on("error", function(error) { 
        console.log("send(..) failed executing https.request(..): " + error); 
        context.done(); 
    }); 
    
    request.write(responseBody); 
    request.end(); 
    

    bir de bu yanıtı mantığı uygulayan cfn-response modülünün, içeriğinden AWS Lambda Function Code bakınız:

  3. sizin örnekte

, böyle bir şey ile Lambda fonksiyonunda context.done(null, result); hattı yerini kendi kendine yeten işlev. Bununla birlikte, cfn-response modülüne yalnızca ZipFile parametresinin bir AWS::Lambda::Function kaynağına (ve en fazla 4096 karakterle sınırlandırılmış) Javascript kodu sağladığında doğrudan referans alınabileceğini unutmayın. Lambda işlevinizi CloudFormation uygulamasının örneğinize yüklediğinizden, yukarıdaki kodu doğrudan mevcut işlevinize eklemeniz daha kolay olacaktır.

+0

Bir lambda içinde cfn yanıtı hakkındaki yorumlarınız kafa karıştırıcı. Modeli lambda koduma göre ekleyebilir. Kopyalama ve yapıştırmadaki nokta nedir? – stevepkr84

+0

Örnek kodda, 'ServiceToken' özelliği varolan bir ARN'ye işaret eder (' arn: aws: lambda: * '); bu, Lambda işlevinin bir' AWS :: Lambda: Function' kaynak aracılığıyla değil, ancak diğer bazı araçlar. "Cfn-response" modülü sadece CloudFormation kaynağının "ZipFile" özelliğini kullanırken sağlanır (CloudFormation kaynak uygulamasının bir parçasıdır). Modül otomatik olarak mevcut olmadığı için, cfn-response.js modülü kaynak kodunu zip dosyasına ekleyerek ya da mevcut işleve doğrudan girerek kendisini sağlaması gerekir. – wjordan

0

Tüm Kuralların görebileceğiniz lambda ile çalışmak için çalışıyorum aşağıdaki sinyal tamamlama için bağlam yöntemlerini çağırır, ancak CloudFormation ile özellikle iletişim kurmanız gerekir (cfn-sinyali akin)

Lütfen cfn-response bölümüne bakın: Benim işlevlerden http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html

Temel örnek:

var response = require('cfn-response'); 
cloudwatchevents.putTargets(putTargetsParams, function (err, data) { 
        if (err) { 
         console.log(err, err.stack); // an error occurred 
         response.send(event, context, response.FAILED, err.stack); 
        } 
        else { 
         console.log(data);   // successful response 
         response.send(event, context, response.SUCCESS); 
        } 
       }); 

Dahili olarak response.send() sizin için bağlam yöntemlerini çağırır.