前面简单的学习了一下 Help scripts,他主要使用场景在于EC2和Auto Scaling里面安装配置各种服务和程序,然后我们通过creationpolicy 来获取cfn-signal脚本发送的信号。类似的,如果我们需要控制其他资源之间的优先顺序,我们一般使用dependson 和 waitcondition 来实现。 dependson本身可以实现创建的顺序,但是他并不管成功与否。waitcondition的使用可以暂时停止整个stack的创建,直到获取了成功的信号才会继续

他的官方文档在这里
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-waitcondition.html

那么如何使用呢?下面是一个总结:

  1. wait condition本身就是一个resource,而不是像creationpolicy 只是一个resource的属性。
  2. 我们可以通过timeout来设置超时时间,最长可以是12个小时
  3. 我们通过dependson 属性来指定依赖关系,比如我可以指定在成功创建RDS之后,才能创建EC2来访问数据库
  4. Wait Handler 会创建一个 presigned URL,这个URL用来接收信号。因为他本身就是resource,我们可以通过内置函数获取到这个URL,甚至手动通过http 的POST 的方法发送信号
  5. wait condition的结果无非三种,获取所有的成功信号;超时;获取到失败的信号

下面直接通过一个例子来说明

AWSTemplateFormatVersion: '2010-09-09'
Mappings:
  RegionMap:
    us-east-1:
      AMI: ami-0ff8a91507f77f867
    us-west-1:
      AMI: ami-0bdb828fd58c52235
    eu-west-1:
      AMI: ami-047bb4163c506cd98
    ap-northeast-1:
      AMI: ami-06cd52961ce9f0d85
    ap-southeast-1:
      AMI: ami-08569b978cc4dfa10
Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      UserData:
        Fn::Base64: !Ref myWaitHandle
      ImageId:
        Fn::FindInMap:
        - RegionMap
        - Ref: AWS::Region
        - AMI
  myWaitHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
    Properties: {}
  myWaitCondition:
    Type: AWS::CloudFormation::WaitCondition
    DependsOn: Ec2Instance
    Properties:
      Handle: !Ref myWaitHandle
      Timeout: '4500'
Outputs:
  ApplicationData:
    Value: !GetAtt myWaitCondition.Data
    Description: The data passed back as part of signalling the WaitCondition.

执行效果

AWS Cloudformation - WaitCondition

AWS Cloudformation - WaitCondition

AWS Cloudformation - WaitCondition