AWS Cloudformation 如何使用条件资源作为其他资源的 DependsOn

问题描述

我正在尝试使用 IAMInstanceprofile 的可选值创建 EC2 实例。 当 createiam 为 False 时,我希望 ec2stack 在没有 iam 的情况下创建,当它为 True 时,它​​应该等待 iamstack 并使用它的值。

     "Parameters": {
        "createiam" : {
            "Type" : "String","Default" : "False"
        }
     },"Conditions" : {
           "Create_iam" : {"Fn::Equals" : [{"Ref" : "createiam"},"True"]}
       },"Resources" : {
        "iamstack" : {
            "Type" : "AWS::CloudFormation::Stack","Condition": "Create_iam"
        },"ec2stack": {
            "Type" : "AWS::CloudFormation::Stack","DependsOn" : "iamstack"
         }
      }

在为 crateiam 使用选项 False 运行堆栈时,出现错误提示未找到 iamstack 资源。有没有办法为 Dependson 值添加条件?

解决方法

有没有办法为 Dependson 值添加条件? -> 是的,有。

在此示例 (https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html) 中,它起作用了。

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Description: Environment type.
    Default: test
    Type: String
    AllowedValues:
      - prod
      - test
    ConstraintDescription: must specify prod or test.
Conditions:
  CreateProdResources: !Equals 
    - !Ref EnvType
    - prod
Resources:
  EC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: ami-05b891753d41ff88f #ami-0ff8a91507f77f867
  MountPoint:
    Type: 'AWS::EC2::VolumeAttachment'
    Condition: CreateProdResources
    Properties:
      InstanceId: !Ref EC2Instance
      VolumeId: !Ref NewVolume
      Device: /dev/sdh
  NewVolume:
    Type: 'AWS::EC2::Volume'
    Condition: CreateProdResources
    Properties:
      Size: 11
      AvailabilityZone: !GetAtt
        - EC2Instance
        - AvailabilityZone
  Bucket:
    Type: 'AWS::S3::Bucket'
    Condition: CreateProdResources
    DependsOn: MountPoint

就您而言,您需要分享您的完整代码。

,

我可以使用 WaitConditionHandle 来实现这一点。

在此处找到参考资料。

  1. Stack overflow question
  2. Blog link with explination

现在的代码流程:


"Parameters": {
        "createiam" : {
            "Type" : "String","Default" : "False"
        }
     },"Conditions" : {
           "Create_iam" : {"Fn::Equals" : [{"Ref" : "createiam"},"True"]}
       },"Resources" : {
    "IAMWaithandle": {
        "Condition": "Create_iam","DependsOn": "iamstack","Type": "AWS::CloudFormation::WaitConditionHandle"
    },"WaitHandle": {
        "Type": "AWS::CloudFormation::WaitConditionHandle"
    },"IAMWaitcondiftion": {
        "Type": "AWS::CloudFormation::WaitCondition","Properties": {
            "Handle": {
                "Fn::If": [
                    "Create_iam",{
                        "Ref": "IAMWaithandle"
                    },{
                        "Ref": "WaitHandle"
                    }
                ]
            },"Timeout": "1","Count": 0
        }
    },"iamstack" : {
        "Type" : "AWS::CloudFormation::Stack","Condition": "Create_iam"
    },"ec2stack": {
        "Type" : "AWS::CloudFormation::Stack","DependsOn" : "IAMWaitcondiftion"
     }
    }