当前位置:  开发笔记 > 编程语言 > 正文

CloudFormation,在DependsOn上应用条件

如何解决《CloudFormation,在DependsOn上应用条件》经验,为你挑选了1个好方法。

我需要做的任务是让CDN依赖于S3存储桶.但我们希望使用现有的存储桶而不是创建新的存储桶.

这是我正在尝试的示例代码:

"Parameters" : {
  "UseExistingBucket" : {
    "Description" : "Yes/No",
    "Default" : "yes",
    "Type" : "String",
    "AllowedValues" : [ "yes", "no" ]
  }
},
"Conditions" : {
  "CreateS3Resources" : {"Fn::Equals" : [{"Ref" : "UseExistingBucket"}, "no"]}
},
"Resources" : {
  "StaticBucket" : {
    "Type" : "AWS::S3::Bucket",
    "Condition" : "CreateS3Resources",
    "Properties" : {
      "BucketName" : { "Fn::Join": [ "-", [ "app",  { "Ref": "EnvType" }, "static" ] ] }
    },
    "DeletionPolicy": "Retain"
  },
  "MyStaticDistribution": {
    "Type": "AWS::CloudFront::Distribution",
    "Properties": {
      "DistributionConfig": {
        "Origins": [
          {
            "DomainName": {
              "Fn::If" : [
                "CreateS3Resources",
                { "Fn::Join": [ "-", [ "app",  { "Ref": "EnvType" }, "static" ] ] },
                {"Fn::GetAtt": [ "StaticBucket", "DomainName" ] }
              ]
            },
            "Id": "S3Origin",
          }
        ]
      }
    },
    "DependsOn": [{
      "Fn::If" : [
        "CreateS3Resources",
        { "Fn::Join": [ "-", [ "app",  { "Ref": "EnvType" }, "static" ] ] },
        ""
      ]
    }]
  }
}

如果需要,请向我建议任何更多细节(至少stackoverflow确实需要更多细节,但我没有指定任何:-P)



1> Usman Mutawa..:

您可以通过使用Fn:GetAtt条件包裹来完成此操作Fn:If.使用Fn:GetAtt意味着依赖关系,因此CloudFormation一旦到达该函数就会自动等待,就像使用DependsOn一样.

下面的代码片段通过有条件地检索尚未创建的嵌套堆栈的名称来显示这一点,但只有在条件UseNestedStack设置为true时才会这样做.如果UseNestedStack为false,它将不会等待,而是检索本地变量名称.

{
"Fn::If": ["UseNestedStack", {
    "Fn::GetAtt": ["NestedStack", "Outputs.Name"]
}, {
    "Ref": "LocalName"
}]

我怎么知道这个?(另一个例子)

遗憾的是没有官方文档正式声明这一点,但是AWS告诉我这样做,并且在他们的代码示例中,您可以看到,当订单有问题时,他们使用Fn:GetAtt.我已经尝试了很多次,每次都有效.在一个简单的堆栈上自己尝试一下.以下是我调整并自己使用的AWS lambda示例中的一些伪证明.如果在资源AMI信息之后创建AMI功能,AMI Info需要输出AMI功能,则下面的堆栈可能无法工作,因此AWS已使用Fn:GetAtt将它们链接在一起.要查看此滚动到底部并查看资源AMIInfo,您将看到它通过fn:Gett引用AMIFunction.CloudFormation看到了这一点,然后回到AMIFunction首先创建它.

"AMIInfoFunction": {
  "DependsOn":"SourceStack",
  "Type": "AWS::Lambda::Function",
  "Properties": {
    "Code": {
      "S3Bucket": { "Ref": "DeploymentBucket" },
      "S3Key": {"Fn::Join": [
        "",
        [
          {
            "Ref": "ApplicationName"
          },
          "/amilookup.zip"
        ]
      ]}
    },
    "Handler": "amilookup.handler",
    "Runtime": "nodejs",
    "Timeout": "30",
    "Role": { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] },
    "VpcConfig": {
      "SecurityGroupIds": [ {"Ref": "InstanceSecurityGroup"}],
      "SubnetIds": [ {"Ref":"PrivateSubnetA"},{"Ref":"PrivateSubnetB"} ]
    }
  }
},
"AMIInfo": {
  "Type": "Custom::AMIInfo",
  "Properties": {
    "ServiceToken": { "Fn::GetAtt" : ["AMIInfoFunction", "Arn"] },
    "StackName": { "Ref":"SourceStack" }
  }
}


@doeiqts好问题.不幸的是,我没有看到它的文档记录,但我确信这在AWS示例中的使用是正确的,事实上我已经看到它多次工作,并且AWS工程师指示我这样做.我在AWS中添加了一个lambda示例,它以这种方式延迟创建.但是,有些官方文件会更清洁.
推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有