CloudFormation Update支持“参考另一个堆栈中的资源”

时间:2016-04-08 08:09:44

标签: amazon-web-services amazon-cloudformation aws-lambda

我正在使用Walkthrough: Refer to Resources in Another Stack中的示例来引用另一个堆栈中的资源(我认为它非常有用,应该是一个开箱即用的功能)。但是,该示例似乎不适用于更新,即如果将新输出添加到引用的堆栈中。

有趣的是,lambda函数甚至根据日志和指标都没有被调用,因此它似乎不是可以在代码中修复的问题。我确实认为代码应根据Replacing a Custom Resource During an Update在更新时使用不同的PhysicalResourceId

注意:这是来自unanswered AWS Forum thread

的交叉发布

1 个答案:

答案 0 :(得分:2)

事实证明,如果其中一个属性发生更改,CloudFormation仅会更新自定义资源。一旦发生这种情况,自定义资源应该发出信号表明它已发生变所以

取代:

response.send(event, context, response.SUCCESS, responseData);

var crypto = require('crypto');
var hash = crypto.createHash('md5').update(JSON.stringify(responseData)).digest('hex');
response.send(event, context, response.SUCCESS, responseData, hash);

这将导致更新期间发生以下事件:

15:08:16 UTC+0200  UPDATE_COMPLETE     Custom::NetworkInfo  NetworkInfo 
15:08:15 UTC+0200  UPDATE_IN_PROGRESS  Custom::NetworkInfo  NetworkInfo  Requested update required the provider to create a new physical resource
15:08:08 UTC+0200  UPDATE_IN_PROGRESS  Custom::NetworkInfo  NetworkInfo

这仍然需要改变属性。我想出的最好的方法是将伪随机参数传递给自定义资源:

{
  "Parameters": {
    "Random": {
      "Description": "Random value to force stack-outputs update",
      "Type": "String"
    }
  },
  "Resources": {
    "NetworkInfo": {
      "Type": "Custom::NetworkInfo",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt" : ["LookupStackOutputs", "Arn"] },
        "Random": { "Ref": "Random" },
        "StackName": { "Ref": "NetworkStackName" }
      }
    }
  }
}

lambda函数忽略了未知参数(即Random)。