全部產品
Search
文件中心

Elastic Compute Service:使用自訂資料進行執行個體初始化

更新時間:Oct 29, 2024

如您希望在建立ECS執行個體時完成系統配置或運行特定業務指令碼,例如預裝Nginx、Docker等軟體或修改主機名稱等,可以通過設定自訂資料參數來實現。

自訂資料介紹

執行個體自訂資料是指使用者上傳給執行個體的指令碼、指令或設定檔等資料,可用來完成執行個體初始化或其他配置,例如,在執行個體初次開機時,自動運行服務啟動指令碼、安裝軟體、列印日誌等。自訂資料支援在執行個體初次開機時自動運行,部分自訂資料格式還支援在Linux執行個體每次啟動時都運行。詳細說明,請參見自訂資料格式及運行頻率

使用限制

  • 執行個體的網路類型必須為Virtual Private Cloud。

  • 執行個體必須使用公用鏡像或基於公用鏡像建立的自訂鏡像,且作業系統需為以下類型之一:

    • Alibaba Cloud Linux、CentOS、CentOS Stream、Ubuntu、SUSE Linux Enterprise Server、Red Hat Enterprise Linux、OpenSUSE、Debian、AlmaLinux、Rocky Linux、Fedora

    • Windows Server 2008 R2及更高版本

  • 已停售的執行個體規格中,僅I/O最佳化執行個體支援執行個體自訂資料功能,非I/O最佳化執行個體不支援該功能。更多資訊,請參見已停售的執行個體規格

建立執行個體時使用自訂資料

1. 準備自訂資料

初始化工具在執行個體初始化過程中,通過讀取使用者提供的自訂資料以完成自訂配置。Linux執行個體和Windows執行個體使用不同的初始化工具。此外,同一初始化工具支援多種自訂資料格式。有關資料格式及其運行頻率的詳細說明,請參見以下內容。

自訂資料格式及運行頻率

Linux執行個體

Linux執行個體使用cloud-init組件實現執行個體初始化動作。根據執行個體是否初次開機,執行不同的配置內容(一些使用較早版本鏡像的執行個體也採用Upstart Job進行初始化工作)。

cloud-init工具支援的自訂資料類型包括可直接配置執行個體的User-DataCloud Config格式,同時還支援其他使用者資料格式,最常見的為include檔案和Gzip壓縮內容。除cloud-init初始化工具外,一些使用較早版本鏡像的執行個體也採用Upstart Job進行初始化工作。

說明
  • 自訂資料格式的詳細說明,可參見cloud-init文檔User-Data Formats

  • 如果您的User-Data指令碼、Cloud Config資料或Include檔案內容的大小超過32 KB,資料類型建議選擇Gzip壓縮內容

  • 如果任務需要在執行個體每次啟動時都執行,資料類型建議選擇Cloud Config資料Upstart Job

User-Data指令碼

  • 簡介

    User-Data指令碼傳入Linux執行個體後直接作為Shell指令碼執行,且僅在執行個體初次開機時運行一次。

  • 運行頻率

    • 啟動執行個體:僅在執行個體初次開機時運行一次,重啟執行個體不會再自動運行。

    • 更換作業系統:自動運行。

    • 重新初始化系統硬碟:自動運行。

    重要

    以下情況不會自動運行指令碼:

    • 如果更換作業系統使用的是自訂鏡像且來源於原執行個體,更換作業系統時會判斷執行個體不是初次啟動,因此不會自動運行指令碼。

    • 如果建立使用的是自訂鏡像,則建立執行個體時系統硬碟就有資料,初始化系統硬碟時會判斷執行個體不是初次開機,因此不會自動運行指令碼。

  • 格式

    首行均以#!開頭。

  • User-Data指令碼樣本

    • 運行自訂指令碼

      #!/bin/sh
      echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt

      樣本User-Data指令碼的效果是在執行個體初次開機時,向userdata_test.txt檔案寫入系統時間。

    • 自訂執行個體軟體源、DNS解析配置及時間同步服務

      在建立執行個體時,您可以通過User-Data指令碼自訂執行個體的軟體源、DNS解析配置及時間同步服務。以下樣本以CentOS Stream 9為例,實際使用中請根據您的作業系統進行相應配置替換。

      重要

      系統會在執行個體啟動時自動設定預設的yum源、NTP服務和DNS服務,您可以使用執行個體自訂資料更改預設的yum源、NTP服務和DNS服務,但請注意:

      • 如果您自訂了yum源,阿里雲官方不再提供yum源相關支援。

      • 如果您自訂了NTP服務,阿里雲官方不再提供相關時間同步服務。

      #!/bin/sh
      # Modify DNS
      echo "nameserve 114.114.114.114" | tee /etc/resolv.conf
      # Modify yum repo and update
      cp /etc/yum.repos.d/centos.repo /etc/yum.repos.d/centos.repo.bak
      cp /etc/yum.repos.d/centos-addons.repo /etc/yum.repos.d/centos-addons.repo.bak
      sed -i "s@http://mirrors.cloud.aliyuncs.com/centos-stream/@https://mirror.stream.centos.org/@g" /etc/yum.repos.d/centos.repo
      sed -i "s@http://mirrors.cloud.aliyuncs.com/centos-stream/@https://mirror.stream.centos.org/@g" /etc/yum.repos.d/centos-addons.repo
      yum update -y
      # Modify NTP Server
      echo "server ntp1.aliyun.com" | tee /etc/ntp.conf
      systemctl restart ntpd.service
      說明

      其中114.114.114.114為DNS伺服器位址、https://mirror.stream.centos.org為CentOS Stream的yum倉庫地址、server ntp1.aliyun.com為阿里雲的NTP伺服器位址,請您根據實際環境替換。

      您也可以使用Cloud Config資料更改yum源,但是不夠靈活,不能適配阿里雲已對部分yum源進行預配置的情況,建議使用User-Data指令碼。

    • 自訂管理員帳號

      Linux執行個體預設使用root使用者作為管理員,您可以使用執行個體自訂資料使用其他使用者作為管理員。

      #!/bin/sh
      useradd test-user
      echo "test-user   ALL=(ALL)        NOPASSWD:ALL" | tee -a /etc/sudoers
      mkdir /home/test-user/.ssh
      touch /home/test-user/.ssh/authorized_keys
      echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCRnnUveAis****" | tee -a /home/test-user/.ssh/authorized_keys
      說明

      請使用您的公開金鑰替換樣本中的公開金鑰ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCRnnUveAis****

說明

當User-Data執行遇到問題時,可以通過雲助手公用命令ACS-ECS-UserData-Check-for-linux.sh來擷取失敗相關的錯誤記錄檔。如果返回有錯誤資訊表示指令碼執行有問題,如果沒有返回錯誤資訊表示執行沒有報錯,需要排查其他方面。關於雲助手公用命令的更多資訊,請參見查看和執行公用命令

Cloud Config資料

  • 簡介

    在Cloud-init中,定義了一系列的功能模組,來完成部分需要執行的任務和配置,例如安裝軟體包、設定網路等。執行哪些模組及具體的執行邏輯,由Cloud Config資料決定,可從vendordata、自訂資料、核心參數中擷取。在建立ECS執行個體時,使用者可自訂Cloud Config資料,指定需要執行的模組和任務,並作為自訂資料提供給執行個體。執行個體啟動時,cloud-init會讀取並解析Cloud Config資料,並按照設定檔中的指示運行對應模組並執行配置任務,自動設定和部署ECS執行個體。

  • 運行頻率

    • 啟動執行個體:Cloud Config資料中的任務是否會被執行,取決於這些任務對應模組的頻率設定。各模組的說明,請參見Modules

      • 頻率為once-per-instance:僅在執行個體初次開機時運行。例如配置的是Apt、Set Passwords等模組,運行頻率為once-per-instance,重啟執行個體時不會運行。

      • 頻率為always:執行個體每次啟動都運行。例如配置的是Bootcmd、Update Etc Hosts等模組,運行頻率為always,執行個體每次啟動都運行。

    • 更換作業系統:自動運行。

    • 重新初始化系統硬碟:自動運行。

      重要

      以下情況不會自動運行指令碼:

      • 如果更換作業系統使用的是自訂鏡像且來源於原執行個體,更換作業系統時會判斷執行個體不是初次啟動,因此不會自動運行指令碼。

      • 如果建立使用的是自訂鏡像,則建立執行個體時系統硬碟就有資料,初始化系統硬碟時會判斷執行個體不是初次開機,因此不會自動運行指令碼。

  • 格式

    • 首行為#cloud-config,且起始位置不能有空格。

    • 必須遵循YAML文法編寫內容。

  • Cloud Config資料樣本

    • 自訂執行個體軟體源

      自訂資料地區輸入以下內容,以配置自訂執行個體軟體源。樣本中使用Ubuntu鏡像建立執行個體,如果您使用其他鏡像,請替換為對應模組的配置內容。

      #cloud-config
      apt:
        preserve_sources_list: false
        disable_suites:
          - $RELEASE-updates
          - backports
          - $RELEASE
          - mysuite
        primary:
          - arches:
              - amd64
              - i386
              - default
            uri: http://us.archive.ubuntu.com/ubuntu
    • 配置自動安裝nginx服務

      自訂資料地區輸入如下內容,以配置執行個體自動安裝nginx服務。

      #cloud-config
      packages: 
       - nginx 
      runcmd: 
       - systemctl start nginx.service
    • 配置自訂主機名稱

      自訂資料地區輸入如下內容,以自訂設定主機名稱。

      #cloud-config
      hostname: my-instance
      fqdn: my-instance.localdomain
    • 配置自動運行自訂指令碼

      自訂資料地區輸入如下內容,以配置執行個體每次啟動時自動運行shell指令碼。

      #cloud-config
      bootcmd:
      - echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt

Include檔案

  • 簡介

    通過Include檔案指向一個或多個User-Data指令碼或Cloud Config資料的連結,多個連結按行分隔。執行個體啟動時,cloud-init會逐個解析並讀取連結裡的內容。如果在讀取某一個連結的內容時出錯,則停止讀取剩餘的連結。

    說明

    您可以通過阿里雲Object Storage Service,上傳User-Data指令碼或Cloud Config資料、擷取連結、設定連結有效期間等。具體操作,請參見OSS控制台快速入門

  • 運行頻率

    • 啟動執行個體:執行頻率由連結裡的內容決定。例如,連結的內容為User-Data指令碼,則僅在執行個體初次開機時運行一次;指令碼類型連結的內容為Cloud Config資料,則遵循Cloud Config資料的運行頻率。

    • 更換作業系統:自動運行。

    • 重新初始化系統硬碟:自動運行。

      重要

      以下情況不會自動運行指令碼:

      • 如果更換作業系統使用的是自訂鏡像且來源於原執行個體,更換作業系統時會判斷執行個體不是初次啟動,因此不會自動運行指令碼。

      • 如果建立使用的是自訂鏡像,則建立執行個體時系統硬碟就有資料,初始化系統硬碟時會判斷執行個體不是初次開機,因此不會自動運行指令碼。

  • 格式

    首行為#include,且起始位置不能有空格。

  • Include檔案樣本

    #include
    https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.sh

    樣本Include檔案包含一個指令碼連結,該指令碼為User-Data指令碼,則僅在執行個體初次開機時運行一次。

    說明

    如果您採用Include檔案或Gzip壓縮內容的方式,需要使用儲存服務上傳指令碼、擷取指令碼連結、設定連結有效期間等操作,推薦您使用阿里雲Object Storage Service。具體操作,請參見OSS控制台快速入門

Gzip壓縮內容

  • 簡介

    如果您的User-Data指令碼、Cloud Config資料或Include檔案內容的大小超過32 KB,可以採用Gzip壓縮內容(.gz格式)並做成連結,然後以Include檔案的形式輸入。cloud-init會自動解壓Gzip壓縮內容,運行解壓後內容的效果和直接傳入後運行沒有區別。

    說明

    您可以通過阿里雲Object Storage Service,上傳User-Data指令碼或Cloud Config資料、擷取連結、設定連結有效期間等。具體操作,請參見OSS控制台快速入門

  • 運行頻率

    • 啟動執行個體:由指令碼類型和模組類型決定。例如,Gzip壓縮內容連結的指令碼類型為User-Data指令碼,則僅在執行個體初次開機時運行一次。

    • 更換作業系統:自動運行。

    • 重新初始化系統硬碟:自動運行。

      重要

      以下情況不會自動運行指令碼:

      • 如果更換作業系統使用的是自訂鏡像且來源於原執行個體,更換作業系統時會判斷執行個體不是初次啟動,因此不會自動運行指令碼。

      • 如果建立使用的是自訂鏡像,則建立執行個體時系統硬碟就有資料,初始化系統硬碟時會判斷執行個體不是初次開機,因此不會自動運行指令碼。

  • 格式

    首行為#include,且起始位置不能有空格。

  • Gzip壓縮內容樣本

    #include
    https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.gz

    樣本Gzip壓縮內容表示Include檔案包含一個Gzip壓縮內容連結,cloud-init讀取該Gzip壓縮內容後會自動解壓並運行,該Gzip壓縮內容由User-Data指令碼壓縮得到,所以僅在執行個體初次開機時運行一次。

Upstart Job

說明

如需使用Upstart Job,您需要為執行個體安裝upstart服務,支援採用upstart服務管理啟動行為的作業系統有CentOS 6、Ubuntu 10/12/14以及Debian 6/7。

  • 簡介

    Upstart是一個事件驅動型的初始化系統,Upstart Job是一個設定檔,定義了一個服務或任務何時啟動、停止和如何運行。它通常放置在/etc/init/目錄下,副檔名為.conf。

  • 運行頻率

    • 啟動執行個體:執行個體每次啟動都會自動運行。

    • 更換作業系統:自動運行。

    • 重新初始化系統硬碟:自動運行。

      重要

      以下情況不會自動運行指令碼:

      • 如果更換作業系統使用的是自訂鏡像且來源於原執行個體,更換作業系統時會判斷執行個體不是初次啟動,因此不會自動運行指令碼。

      • 如果建立使用的是自訂鏡像,則建立執行個體時系統硬碟就有資料,初始化系統硬碟時會判斷執行個體不是初次開機,因此不會自動運行指令碼。

  • 格式

    首行為#upstart-job,且起始位置不能有空格。

  • Upstart Job內容樣本

    #upstart-job
    description "upstart test"
    start on runlevel [2345] #在運行層級2、3、4、5執行
    stop on runlevel [!2345] #在運行層級2、3、4、5以外不執行
    exec echo "Hello World. The time is now $(date -R)!" | tee /root/output.txt

    樣本Upstart Job表示在系統進入指定的運行層級時輸出一條包含時間戳記的訊息,並將該訊息記錄到/root/output.txt檔案中。當系統離開這些運行層級時,作業會停止執行。

Windows執行個體

Windows執行個體是通過Vminit工具的Plugin_Main_CloudinitUserData外掛程式來運行自訂資料指令碼,該外掛程式僅支援在執行個體初次開機時運行,該外掛程式支援Bat和PowerShell兩種指令碼。

bat指令碼

  • 運行頻率

    • 啟動執行個體:執行個體初次開機時運行一次,重啟執行個體不會自動運行。

    • 更換作業系統:自動運行。

    • 重新初始化系統硬碟:自動運行。

      重要

      以下情況不會自動運行指令碼:

      • 如果更換作業系統使用的是自訂鏡像且來源於原執行個體,更換作業系統時會判斷執行個體不是初次啟動,因此不會自動運行指令碼。

      • 如果建立使用的是自訂鏡像,則建立執行個體時系統硬碟就有資料,初始化系統硬碟時會判斷執行個體不是初次開機,因此不會自動運行指令碼。

  • 格式

    • 首行為[bat],且起始位置不能有空格。

    • 只能輸入半形字元,不能有多餘字元。

    • 寫入資料的路徑不能為C:\Users目錄,否則自訂資料會執行失敗。

      說明

      在Windows系統中,C:\Users及其子目錄是使用者設定檔和資料的預設儲存位置,需要登入系統後才可以訪問,而在系統初始化執行userdata階段實際還未登入系統,所以寫入資料到C:\Users目錄會失敗。

  • Bat指令碼樣本

    • 運行自訂指令碼

      [bat]
      echo "bat test" > C:\userdata_test.txt

      樣本Bat指令碼的效果是在執行個體初次開機時向userdata_test.txt檔案寫入內容"bat test"

PowerShell指令碼

  • 運行頻率

    • 啟動執行個體:執行個體初次開機時運行一次,重啟執行個體不會自動運行。

    • 更換作業系統:自動運行。

    • 重新初始化系統硬碟:自動運行。

      重要

      以下情況不會自動運行指令碼:

      • 如果更換作業系統使用的是自訂鏡像且來源於原執行個體,更換作業系統時會判斷執行個體不是初次啟動,因此不會自動運行指令碼。

      • 如果建立使用的是自訂鏡像,則建立執行個體時系統硬碟就有資料,初始化系統硬碟時會判斷執行個體不是初次開機,因此不會自動運行指令碼。

  • 格式

    • 首行為[powershell],且起始位置不能有空格。

    • 只能輸入半形字元,不能有多餘字元。

    • 寫入資料的路徑不能為C:\Users目錄,否則自訂資料會執行失敗。

      說明

      在Windows系統中,C:\Users及其子目錄是使用者設定檔和資料的預設儲存位置,需要登入系統後才可以訪問,而在系統初始化執行userdata階段實際還未登入系統,所以寫入資料到C:\Users目錄會失敗。

  • PowerShell指令碼樣本

    • 運行自訂指令碼

      [powershell]
      write-output "powershell test" | Out-File C:\userdata_test.txt

      樣本PowerShell指令碼的效果是在執行個體初次開機時向userdata_test.txt檔案寫入內容powershell test

2. 建立執行個體時使用自訂資料

  • 通過控制台建立執行個體

    執行個體購買頁展開進階選項地區,在自訂資料地區輸入執行個體自訂資料。

    重要

    如果執行個體自訂資料已進行Base64編碼,請勾選輸入已採用Base64編碼,且在進行Base64編碼前自訂資料內容的大小不能超過32 KB。否則,無需勾選,系統會自動對內容進行Base64編碼。

  • 通過API建立執行個體

    如果您通過API方式建立執行個體,請在RunInstances - 大量建立ECS執行個體CreateInstance - 建立ECS執行個體介面指定UserData欄位。

3. 驗證自訂資料運行效果

您需要結合自訂指令碼的實際內容進行運行效果的驗證,以下以在Linux執行個體中傳入如下User-Data指令碼為例,為您示範如何進行指令碼運行效果驗證。

#!/bin/sh
echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt

該樣本中,User-Data指令碼的效果是在執行個體初次開機時,向userdata_test.txt檔案寫入系統時間。為驗證該指令碼的執行效果,您可以運行cat userdata_test.txt命令來查看效果,系統已經向userdata_test.txt檔案寫入系統時間。

view-result

說明

當User-Data執行遇到問題時,可以通過雲助手公用命令ACS-ECS-UserData-Check-for-linux.sh來擷取失敗相關的錯誤記錄檔。如果返回有錯誤資訊表示指令碼執行有問題,如果沒有返回錯誤資訊表示執行沒有報錯,需要排查其他方面。關於雲助手公用命令的更多資訊,請參見查看和執行公用命令

其他動作

查看已有執行個體自訂資料

自訂資料傳入執行個體後,您可以通過中繼資料服務或控制台查看執行個體的自訂資料資訊。

通過中繼資料服務擷取(加固模式)

  • Linux執行個體

    TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:180"`
    curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/user-data
  • Windows執行個體

    $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "180"} -Method PUT -Uri http://100.100.100.200/latest/api/token
    Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/user-data
說明

通過控制台擷取

  1. 確保執行個體處於已停止狀態。

    重要

    如果執行個體的計費方式為隨用隨付、網路類型為專用網路,停止執行個體時,停止模式建議選擇普通停機模式,選擇節省停機模式會因計算資源(vCPU和記憶體)被回收,再次啟動執行個體時可能因為庫存不足導致啟動失敗。更多資訊,請參見節省停機模式

  2. 執行個體頁面,選擇icon1 > 執行個體設定 > 設定使用者資料,然後在使用者資料地區查看已設定的自訂資料。

通過調用API擷取

您可以通過調用DescribeUserData介面查詢一台ECS執行個體的自訂資料。更多資訊,請參見DescribeUserData

修改已有執行個體自訂資料

如需修改已有執行個體的自訂資料,您可以通過控制台進行操作。

  1. 確保執行個體處於已停止狀態。

    重要

    如果執行個體的計費方式為隨用隨付、網路類型為專用網路,停止執行個體時,停止模式建議選擇普通停機模式,選擇節省停機模式會因計算資源(vCPU和記憶體)被回收,再次啟動執行個體時可能因為庫存不足導致啟動失敗。更多資訊,請參見節省停機模式

  2. 執行個體頁面,選擇icon1 > 執行個體設定 > 設定使用者資料,然後在使用者資料地區輸入自訂資料。

重要

修改已有執行個體的自訂資料之後,在啟動執行個體後自訂資料指令碼是否被執行,取決於自訂資料的格式及運行頻率,請您在修改自訂資料之前明確您的需求,更多資訊,請參見自訂資料格式及運行頻率

相關文檔

  • 您也可以通過Auto Scaling的自訂資料功能,讓多台ECS執行個體在啟動時自動執行配置的指令碼或命令,確保ECS執行個體配置的一致性,簡化了營運工作。更多資訊,請參見使用執行個體自訂資料自動設定ECS執行個體

  • 如果希望服務或指令碼因程式異常、伺服器重啟、掉電等被中斷時,及時恢複運行,雲助手外掛程式ecs-tool-servicekeepalive實現。具體操作,請參見自動回復服務

  • 如果您希望瞭解更多關於管理執行個體初始化的相關資訊,請參見管理執行個體初始化配置