全部產品
Search
文件中心

:ALIYUN::ROS::WaitConditionHandle

更新時間:Feb 05, 2024

ALIYUN::ROS::WaitConditionHandle用於接收訊號,與ALIYUN::ROS::WaitCondition配合使用以控制資源棧的執行流程。建立ECS執行個體時,在自訂資料執行過程中發送訊號。

文法

{
  "Type": "ALIYUN::ROS::WaitConditionHandle",
  "Properties": {
    "Mode": String,
    "Count": Integer
  }
}

屬性

屬性名稱

類型

必須

允許更新

描述

約束

Mode

String

控制舊訊號在資源更新前如何刪除。

取值:

  • Increment:所有舊訊號將在資源更新前被刪除。

    說明

    更新過程中ALIYUN::ROS::WaitCondition等待的訊號數量 = ALIYUN::ROS::WaitCondition的Count屬性的取值。

  • Full(預設值):如果Count屬性生效,在資源更新前會對舊訊號進行刪除,否則不刪除。

    說明

    更新過程中ALIYUN::ROS::WaitCondition等待的訊號數量 = ALIYUN::ROS::WaitCondition的Count屬性取值 - 刪除操作後剩餘的舊訊號的數量。

Count

Integer

Mode取值為Full時,ID為整數且大於Count的舊訊號在資源更新前會被刪除。

預設值為-1。

當滿足以下2個條件時,該屬性生效:

  • Mode取值為Full。

  • Count≥0。

如果該屬性生效,則ID>Count的舊訊號將在更新前刪除。如果存在非整數ID的舊訊號,則資源更新失敗。

說明

在需要通過更新資源棧進行彈性擴容或縮容的情境下,推薦設定該值,並與ALIYUN::ROS::WaitCondition的Count屬性取值相同。

傳回值

Fn::GetAtt

  • CurlCli:該資源產生的curl命令。通過該命令發送自訂資料執行的結果或者狀態到Resource Orchestration Service服務。

  • WindowsCurlCli:為Windows提供curl CLI命令首碼,可用於發送處理完成或失敗的訊號。由於Windows不支援curl命令,您需要先安裝curl.exe並將其添加到PATH中。您可以通過添加-d "{\"status\": \" SUCCESS \"}表示成功、添加-d "{\"status\": \" FAILURE \"}表示失敗。

  • PowerShellCurlCli:為PowerShell提供curl CLI命令首碼,可用於發送處理完成或失敗的訊號。由於此cmdlet是在PowerShell 3.0中引入的,所以要確保PowerShell的版本滿足此約束,PowerShell的版本可以通過$PSVersionTable.PSVersion顯示。您可以通過添加-Body '{"status": " SUCCESS "}表示成功、添加-Body '{"status": " FAILURE "}表示失敗。

  • Headers:HTTP POST要求標頭,可用於在程式中發送處理完成或失敗的訊號。

  • URL:HTTP POST請求地址,可用於在程式中發送處理完成或失敗的訊號。

說明
  • CurlCli、WindowsCurlCli、PowerShellCurlCli的請求體中均可通過設定ID欄位(字串)明確指定訊號ID。

    例如:-d "{\"status\": \" SUCCESS \", \"id\": \"test\"}

    相同ID的訊號會被當作同一訊號,後面收到的訊號會覆蓋前面收到的。

    如果沒有指定ID,ROS會使用整數作為訊號ID,這個整數=已有訊號的數量+1。

  • CurlCli、WindowsCurlCli、PowerShellCurlCli的請求體中均可通過設定reason欄位(字串)設定訊號成功或失敗原因,這個原因會出現在ROS資源棧事件(訊號通知類型)當中。

    例如:-d "{\"status\": \" SUCCESS \", \"reason\": \"nginx is installed successfully.\"}"

    指定了reason欄位之後,這個請求的內容就會出現在資源棧事件(訊號通知類型)當中。

  • CurlCli、WindowsCurlCli、PowerShellCurlCli的請求體中均可通過設定了data欄位(字串)設定訊號關聯的資料,這個資料可以通過ALIYUN::ROS::WaitCondition的輸出屬性Data、ErrorData、JoinedErrorData擷取。

    例如:-d "{\"id\" : \"ssh_pub_key\", \"data\" : \"$pub_key\"}"

  • 通過status欄位可以指定訊號類型,包括SUCCESSFAILUREWARNING。訊號類型與資源操作結果的關係如下:(優先順序從高到低)

    • 如果收到FAILURE訊號,則資源操作失敗。

    • 如果在設定時間內,收到的訊號數量未滿足要求,則資源操作逾時失敗。

    • 如果收到的訊號數量滿足了要求,且所有訊號均為WARNING,則資源操作失敗。

    • 其他情況下,資源操作成功。

樣本

  • YAML格式

    ROSTemplateFormatVersion: '2015-09-01'
    Parameters:
      InstanceId:
        Type: String
        AssociationProperty: ALIYUN::ECS::Instance::InstanceId
    Resources:
      InstallNginx:
        Type: 'ALIYUN::ECS::RunCommand'
        Properties:
          Type: RunShellScript
          CommandContent:
            Fn::Sub: |
                #!/bin/sh
                yum install -y nginx
                systemctl restart nginx
                if [[ $? -eq 0 ]];
                then
                ${InstallNginxWaitConditionHandle.CurlCli} --data-binary "{\"status\": \"SUCCESS\", \"data\": \"Nginx is installed successfully.\"}"
                else
                ${InstallNginxWaitConditionHandle.CurlCli} --data-binary "{\"status\": \"FAILURE\", \"reason\": \"Failed to install and start nginx.\"}"
                fi
          Name: InstallNginxScript
          InstanceIds:
            - Ref:
                InstanceId
          Timeout: 60
      InstallNginxWaitConditionHandle:
        Type: 'ALIYUN::ROS::WaitConditionHandle'
      InstallNginxWaitCondition:
        Type: 'ALIYUN::ROS::WaitCondition'
        Properties:
          Handle:
            Ref: InstallNginxWaitConditionHandle
          Timeout: 60
    Outputs:
      InstallNginxData:
        Description: Received the data sent by the first ecs, JSON serialized dict containing
          data associated with wait condition signals sent to the handle.
        Value:
          Fn::GetAtt:
          - InstallNginxWaitCondition
          - Data
  • JSON格式

    {
      "ROSTemplateFormatVersion": "2015-09-01",
      "Parameters": {
        "InstanceId": {
          "Type": "String",
          "AssociationProperty": "ALIYUN::ECS::Instance::InstanceId"
        }
      },
      "Resources": {
        "InstallNginx": {
          "Type": "ALIYUN::ECS::RunCommand",
          "Properties": {
            "Type": "RunShellScript",
            "CommandContent": {
              "Fn::Sub": "#!/bin/sh\nyum install -y nginx\nsystemctl restart nginx\nif [[ $? -eq 0 ]];\nthen\n${InstallNginxWaitConditionHandle.CurlCli} --data-binary \"{\\\"status\\\": \\\"SUCCESS\\\", \\\"data\\\": \\\"Nginx is installed successfully.\\\"}\"\nelse\n${InstallNginxWaitConditionHandle.CurlCli} --data-binary \"{\\\"status\\\": \\\"FAILURE\\\", \\\"reason\\\": \\\"Failed to install and start nginx.\\\"}\"\nfi\n"
            },
            "Name": "InstallNginxScript",
            "InstanceIds": [
              {
                "Ref": "InstanceId"
              }
            ],
            "Timeout": 60
          }
        },
        "InstallNginxWaitConditionHandle": {
          "Type": "ALIYUN::ROS::WaitConditionHandle"
        },
        "InstallNginxWaitCondition": {
          "Type": "ALIYUN::ROS::WaitCondition",
          "Properties": {
            "Handle": {
              "Ref": "InstallNginxWaitConditionHandle"
            },
            "Timeout": 60
          }
        }
      },
      "Outputs": {
        "InstallNginxData": {
          "Description": "Received the data sent by the first ecs, JSON serialized dict containing data associated with wait condition signals sent to the handle.",
          "Value": {
            "Fn::GetAtt": [
              "InstallNginxWaitCondition",
              "Data"
            ]
          }
        }
      }
    }

更多樣本,請參見JSON樣本YAML樣本