資源編排InstanceClone實現詳解

祝犁發表於2016-07-08

對於一臺阿里雲的ECS例項來說,主要由下面的幾組屬性組成:

  • 例項規格

    • 例項規格為對應著CPU和記憶體,是否為IO優化的例項,如果為IO優化例項則磁碟型別需要為cloud_efficiency高效雲盤, cloud_ssd ssd雲盤。
  • 網路配置

    • 經典網路,同時包含出網頻寬的設定。
    • 專有網路,需要包括vpc配置和vswitch的配置資訊,
  • 磁碟配置,分為系統盤和資料盤。每個磁碟對應下面的屬性

    • 映象資訊,僅僅對系統盤有效,將需要從某個映象建立,可以是系統映象也可以是自定義映象。目前阿里雲的系統盤大小為40GB到500GB。可以按需指定。
    • 快照資訊,僅僅對資料盤有效,如果一塊盤從一個快照建立,則指定的磁碟size必須大於等於snapshot的size。
    • 磁碟種類,常見的包括cloud雲盤, cloud_efficiency高效雲盤, cloud_ssd ssd雲盤
    • 磁碟描述資訊
    • 磁碟名稱
    • 掛載點
    • 對於資料盤,是否隨例項刪除
    • 磁碟大小
  • 安全組設定,一臺虛擬機器建立的時候必須至少屬於一個安全組。在建立之後可以最多屬於5個安全組。
  • 例項的基本資訊包括名稱、描述、Tag標籤設定
  • UserData屬性

    • 支援UserData的例項才有這個屬性。

資源編排在克隆資源的時候,預設情況下會克隆上面的所有屬性。有以下說明:

  • 資源編排預設使用的映象是建立源映象的映象ID,不是給源資源建立了新的映象並且使用映象。
  • 資源編排預設建立的資料盤也是源例項生成的時候使用的資料盤(空白或者某個快照,例如快照是2016-06-06建立的,在2016-07-07Clone的時候,仍然是當時的快照)。
  • 在執行克隆的過程中,會先一個源Instance的第一個安全組來建立ECS例項,當機器建立出來並設定為Running狀態的時候,如果源例項中含有多個安全組,將會把新生成的Instance加入到其它的安全中。

之所以不是全部的克隆主要的原因是建立快照的時間可能會非常長,導致整個堆疊建立失敗。

為了方便擴充套件擴充套件在Clone的時候您也可以自己指定如下屬性做定製。

  • SecurityGroupId 安全組,如果指定則僅僅使用者一個安全組。不會在clone源例項上已有的安全組。
  • ImageId 映象Id,您可以通過在控制檯建立自定義映象來完成。這樣Clone的時候可以使用心得Image
  • 例項的基本資訊包括名稱、描述、Tag標籤設定。包括InstanceName、Description。
  • 例項所在的可用區 ZoneId
  • 使用自定義的資料盤資訊類似建立Ecs例項。DiskMappings如下,建立一塊100GB的型別為cloud的資料盤,使用快照s-1234567890
        "DiskMappings": [
            {"Size": 100, "Category": "cloud", "SnapshotId": "s-1234567890"}
        ]

下面是一套使用克隆的模板, clone的時候自定義了映象id和使用了額外的兩塊資料盤,一塊從快照建立,一塊空白盤:

{
  "ROSTemplateFormatVersion" : "2015-09-01",
  "Resources" : {
    "WebServer": {
      "Type": "ALIYUN::ECS::InstanceGroupClone",
      "Properties": {
        "SourceInstanceId": "i-your_instance",
        "Password": "YourPassword1234",
        "MinAmount": 1,
        "MaxAmount": 1,
        "ImageId": "centos7u2_64_40G_cloudinit_20160520.raw",
        "DiskMappings": [
            {"Size": 100, "Category": "cloud", "SnapshotId": "s-123456789"},
            {"Size": 100, "Category": "cloud", "Description": "Another 100 GB Disk"}
        ]
      }
    }
  },
  "Outputs": {
    "InstanceId": {
         "Value" : {"Fn::GetAtt": ["WebServer","InstanceIds"]}
    },
    "PublicIp": {
         "Value" : {"Fn::GetAtt": ["WebServer","PublicIps"]}
    }
  }
}


相關文章