ALIYUN::ROS::Sleep类型用于延迟其他资源的创建、删除、更新和回滚等操作。

语法

{
  "Type": "ALIYUN::ROS::Sleep",
  "Properties": {
    "DeleteDuration": Number,
    "UpdateRollbackDuration": Number,
    "UpdateDuration": Number,
    "CreateDuration": Number,
    "Triggers": Map
  }
}

属性

属性名称 类型 必须 允许更新 描述 约束
DeleteDuration Number 删除资源前等待的时长。 取值范围:0~1800。

单位:秒。

UpdateRollbackDuration Number 资源更新回滚前等待的时长。 仅当资源栈状态为回滚中且Triggers参数发生变化时触发。

取值范围:0~1800。

单位:秒。
UpdateDuration Number 资源更新前等待的时长。 仅当资源栈状态为更新中且Triggers参数发生变化时触发。

取值范围:0~1800。

单位:秒。
CreateDuration Number 创建资源前等待的时长。 取值范围:0~1800。

单位:秒。

Triggers Map 资源更新等待和更新回滚等待的触发器。 在资源栈更新或回滚时,只有更新了Triggers参数,才会触发UpdateDuration和UpdateRollbackDuration。

返回值

Fn::GetAtt

示例

本示例中定义的资源如下:

  • 一个专有网络实例(VPC)
  • 一个交换机(vSwitch)
  • 一个安全组(SecurityGroup)
  • 一个自定义延迟时间(Sleep)
  • 两个ECS实例(CenterServer和OtherServer)

本示例创建了VPC网络下的ECS实例,具体如下:

  • CenterServer中有自定义脚本需要部署Nginx服务,将CenterServer中的公钥发送到OtherServer,能够使CenterServer免密登录到OtherServer,OtherServer中的脚本会访问CenterServer中的服务。
  • 将CreateDuration指定为60秒,等待CenterServer内部应用部署完成,以便OtherServer成功访问CenterServer中的服务。
    说明 虽然CenterServer实例创建成功,但是内部的应用需要时间安装和启动,因此需要指定等待时间。
{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "ZoneId": {
      "Type": "String",
      "Label": "Availability Zone",
      "AssociationProperty": "ALIYUN::ECS::Instance::ZoneId",
      "Description": "VSwitch available Zone Id,"
    },
    "CreateDuration": {
      "Type": "Number",
      "Description": "The number of seconds to wait before resource creation.",
      "MinValue": 0,
      "MaxValue": 1800,
      "Default": 60
    },
    "InstanceType": {
      "Type": "String",
      "AssociationProperty": "ALIYUN::ECS::Instance::InstanceType",
      "Label": {
        "en": "Instance Type",
        "zh-cn": "实例类型"
      },
      "Description": "Fill in specifications that can be used under the VSwitch availability zone.",
      "AssociationPropertyMetadata": {
        "ZoneId": "${ZoneId}"
      }
    },
    "SystemDiskCategory": {
      "Type": "String",
      "AssociationProperty": "ALIYUN::ECS::Disk::SystemDiskCategory",
      "AssociationPropertyMetadata": {
        "ZoneId": "${ZoneId}",
        "InstanceType": "${InstanceType}"
      },
      "Label": "System Disk Category"
    },
    "InstancePassword": {
      "NoEcho": true,
      "Type": "String",
      "Description": "Server login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers.",
      "Label": "Instance Password",
      "MinLength": 8,
      "MaxLength": 30
    }
  },
  "Resources": {
    "VPC": {
      "Type": "ALIYUN::ECS::VPC",
      "Properties": {
        "CidrBlock": "10.0.0.0/16"
      }
    },
    "VSwitch": {
      "Type": "ALIYUN::ECS::VSwitch",
      "Properties": {
        "VpcId": {
          "Ref": "VPC"
        },
        "ZoneId": {
          "Ref": "ZoneId"
        },
        "CidrBlock": "10.0.1.0/24"
      }
    },
    "SecurityGroup": {
      "Type": "ALIYUN::ECS::SecurityGroup",
      "Properties": {
        "VpcId": {
          "Ref": "VPC"
        },
        "SecurityGroupIngress": [
          {
            "Priority": 1,
            "PortRange": "80/80",
            "NicType": "intranet",
            "SourceCidrIp": "0.0.0.0/0",
            "IpProtocol": "tcp"
          },
          {
            "Priority": 1,
            "PortRange": "22/22",
            "NicType": "intranet",
            "SourceCidrIp": "100.104.0.0/16",
            "IpProtocol": "tcp"
          }
        ]
      }
    },
    "WaitConditionHandle": {
      "Type": "ALIYUN::ROS::WaitConditionHandle"
    },
    "CenterServer": {
      "Type": "ALIYUN::ECS::InstanceGroup",
      "Properties": {
        "InstanceName": "ControlServer",
        "ImageId": "centos_7.9",
        "VpcId": {
          "Ref": "VPC"
        },
        "SecurityGroupId": {
          "Ref": "SecurityGroup"
        },
        "VSwitchId": {
          "Ref": "VSwitch"
        },
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "Password": {
          "Ref": "InstancePassword"
        },
        "MaxAmount": 1,
        "AllocatePublicIP": false,
        "SystemDiskSize": "40",
        "InstanceChargeType": "PostPaid",
        "SystemDiskCategory": {
          "Ref": "SystemDiskCategory"
        },
        "UserData": {
          "Fn::Replace": [
            {
              "ros-notify": {
                "Fn::GetAtt": [
                  "WaitConditionHandle",
                  "CurlCli"
                ]
              }
            },
            {
              "Fn::Join": [
                "\n",
                [
                  "#!/bin/sh",
                  "ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa",
                  "cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys",
                  "chmod 0600 ~/.ssh/authorized_keys",
                  "pub_key=`cat /root/.ssh/id_rsa.pub`",
                  "ros-notify -d \"{\\\"status\\\" : \\\"SUCCESS\\\",\\\"id\\\" : \\\"ssh_pub_key\\\", \\\"data\\\" : \\\"$pub_key\\\"}\" ",
                  "yum install -y nginx",
                  "mkdir -p /data/nginx",
                  "echo \"Hello World! This is service client ecs.\" > /data/nginx/index.html",
                  "echo 'server {' >> /etc/nginx/conf.d/server.conf ",
                  "echo 'listen 80;' >> /etc/nginx/conf.d/server.conf ",
                  "echo 'server_name _;' >> /etc/nginx/conf.d/server.conf ",
                  "echo 'index index.html;' >> /etc/nginx/conf.d/server.conf ",
                  "echo 'root /data/nginx;' >> /etc/nginx/conf.d/server.conf ",
                  "echo '}' >> /etc/nginx/conf.d/server.conf ",
                  "systemctl stop nginx",
                  "systemctl start nginx",
                  "systemctl enable nginx"
                ]
              ]
            }
          ]
        }
      }
    },
    "WaitCondition": {
      "Type": "ALIYUN::ROS::WaitCondition",
      "Properties": {
        "Count": 1,
        "Handle": {
          "Ref": "WaitConditionHandle"
        },
        "Timeout": 1800
      }
    },
    "Sleep": {
      "Type": "ALIYUN::ROS::Sleep",
      "DependsOn": "WaitCondition",
      "Properties": {
        "CreateDuration": {
          "Ref": "CreateDuration"
        }
      }
    },
    "OtherServer": {
      "Type": "ALIYUN::ECS::InstanceGroup",
      "DependsOn": "Sleep",
      "Properties": {
        "InstanceName": "OtherServer",
        "ImageId": "centos_7.9",
        "VpcId": {
          "Ref": "VPC"
        },
        "SecurityGroupId": {
          "Ref": "SecurityGroup"
        },
        "VSwitchId": {
          "Ref": "VSwitch"
        },
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "Password": {
          "Ref": "InstancePassword"
        },
        "MaxAmount": 1,
        "AllocatePublicIP": false,
        "SystemDiskSize": 40,
        "InstanceChargeType": "PostPaid",
        "SystemDiskCategory": {
          "Ref": "SystemDiskCategory"
        },
        "UserData": {
          "Fn::Join": [
            "",
            [
              "#!/bin/sh\n",
              "ssh_pub_key='",
              {
                "Fn::GetAtt": [
                  "WaitCondition",
                  "Data"
                ]
              },
              "'\n",
              "yum install -y jq\n",
              "pub_key=`echo \"$ssh_pub_key\" | jq '.ssh_pub_key' | xargs echo `\n",
              "echo \"$pub_key\" > /root/.ssh/authorized_keys\n",
              "chmod 600 /root/.ssh/authorized_keys\n",
              "curl ",
              {
                "Fn::Select": [
                  "0",
                  {
                    "Fn::GetAtt": [
                      "CenterServer",
                      "PrivateIps"
                    ]
                  }
                ]
              },
              ":80\n"
            ]
          ]
        }
      }
    }
  }
}