インスタンスユーザーデータとは、スクリプト、命令、設定ファイルなど、インスタンスにアップロードされるデータを指します。 インスタンスユーザーデータを使用して、インスタンスを初期化または設定できます。 たとえば、インスタンスが最初に起動されると、インスタンスは自動的にユーザーデータを使用してサービス起動スクリプトを実行し、ソフトウェアをインストールし、ログを印刷します。 このトピックでは、ユーザーデータをElastic Compute Service (ECS) インスタンスに渡し、ユーザーデータを変更し、ユーザーデータを表示する方法について説明します。
インスタンスが初めて起動されると、インスタンスは自動的にユーザーデータを実行します。 Linuxインスタンスを起動するたびに、特定の形式のユーザーデータを実行することもできます。 詳細については、このトピックの「ユーザーデータの形式と実行頻度」をご参照ください。
制限事項
インスタンスは仮想プライベートクラウド (VPC) にデプロイする必要があります。
インスタンスは、次のオペレーティングシステムのパブリックイメージ、またはパブリックイメージから派生したカスタムイメージから作成する必要があります。
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最適化インスタンスはユーザーデータをサポートしません。 詳細は、「廃止されたインスタンスタイプ」をご参照ください。
インスタンスユーザーデータの使用
ユーザーデータをECSインスタンスに渡す
ユーザーデータを準備します。
サポートされている形式、実行頻度、ユーザーデータの説明については、このトピックの「ユーザーデータの形式と実行頻度」をご参照ください。
重要ユーザーデータがBase64でエンコードされる前は、ユーザーデータのサイズは最大32 KBしかありません。
ユーザーデータをECSインスタンスに渡します。
インスタンスの作成時にユーザーデータを渡すと、インスタンスの最初の起動時、インスタンスで実行されているオペレーティングシステムが置き換えられたとき、またはインスタンスに接続されているシステムディスクが再初期化されたときに、ユーザーデータが実行されます。
既存のインスタンスのユーザーデータを変更した場合、インスタンスで実行されているオペレーティングシステムを置き換えるとき、またはインスタンスに接続されているシステムディスクを再初期化するときに、新しいユーザーデータが実行されます。
Linuxインスタンスを起動するたびに、特定の形式のユーザーデータを実行できます。 詳細については、このトピックの「ユーザーデータの形式と実行頻度」をご参照ください。
インスタンスのステータスが [停止済み] であることを確認します。
重要従量課金方式を使用してインスタンスが課金され、VPCにある場合は、インスタンスを停止するときに [停止モード] セクションで [標準モード] を選択することを推奨します。 [エコノミーモード] を選択した場合、インスタンスのコンピューティングリソース (vCPUとメモリ) がリサイクルされます。 その結果、リソース不足によりインスタンスの再起動に失敗することがあります。 詳細については、「経済モード」をご参照ください。
[インスタンス] ページで、
を選択します。 [ユーザーデータの設定] ダイアログボックスで、[ユーザーデータ] フィールドにユーザーデータを入力します。 [確認] をクリックします。ユーザーデータが期待どおりに実行されているかどうかを確認します。
説明ユーザーデータスクリプトの実行時に問題が発生した場合は、次の一般的なCloud Assistantコマンドを実行してエラーログを取得できACS-ECS-UserData-Check-for-linux.sh。 ログにエラーメッセージが表示された場合、スクリプトの実行時にエラーが発生しました。 ログにエラーメッセージが表示されない場合、スクリプトの実行時にエラーは発生しませんでした。 他の側面からスクリプトを確認して、問題の原因を特定します。 一般的なCloud Assistantコマンドの詳細については、「一般的なコマンドの表示と実行」をご参照ください。
たとえば、次のユーザーデータスクリプトがLinuxインスタンスに渡されます。
#!/bin/sh echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt
cat userdata_test.txt
コマンドを実行して、スクリプトが期待どおりに実行されているかどうかを確認します。 次のコマンド出力は、システム時刻がuserdata_test.txt
ファイルに書き込まれていることを示しています。
インスタンスの作成時にユーザーデータを渡す
ECSインスタンス購入ページの [カスタム起動] タブで、[詳細設定 (オプション)] セクションをクリックします。 [ユーザーデータ] フィールドに、インスタンスのユーザーデータを入力します。
[Base64エンコード情報の入力] を選択した場合、ユーザーデータがBase64でエンコードされ、Base64エンコード前のサイズが32 KBを超えないようにします。 Enter Base64 Encoded Informationを選択しない場合、システムは自動的にBase64でユーザーデータをエンコードします。
既存のインスタンスのユーザーデータの変更
インスタンスのユーザーデータの表示
ユーザーデータがインスタンスに渡された後、インスタンスのメタデータまたはECSコンソールでユーザーデータを表示できます。
メタデータ内のユーザーデータの表示 (通常モード)
Linux インスタンス
curl http://100.100.100.200/latest/user-data
Windows インスタンス
Invoke-RestMethod http://100.100.100.200/latest/user-data
メタデータ内のユーザーデータの表示 (セキュリティ強化モード)
たとえば、メタデータサーバーへのアクセスに使用される資格情報の有効期間
を180秒に設定します。
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
ECSコンソールでのユーザーデータの表示
インスタンスのステータスが [停止済み] であることを確認します。
重要従量課金方式を使用してインスタンスが課金され、VPCにある場合は、インスタンスを停止するときに [停止モード] セクションで [標準モード] を選択することを推奨します。 [エコノミーモード] を選択した場合、インスタンスのコンピューティングリソース (vCPUとメモリ) がリサイクルされます。 その結果、リソース不足によりインスタンスの再起動に失敗することがあります。 詳細については、「経済モード」をご参照ください。
[インスタンス] ページで、
を選択します。 表示されるダイアログボックスの [ユーザーデータ] フィールドで、設定したユーザーデータを表示します。
詳細については、「インスタンスメタデータの取得」をご参照ください。
ユーザーデータでLinuxスクリプトを使用する方法の例
例1: ユーザーデータスクリプトを使用したカスタムYUMリポジトリとNTPおよびDNSサービスの指定
例2: ユーザーデータスクリプトを使用して管理者アカウントを指定する
ユーザーデータの形式と実行周波数
Linux インスタンス
Linuxインスタンスは、cloud-initを使用してインスタンスの起動動作を管理します。 最初のインスタンスの起動時に、システムは自動的にユーザーデータを実行します。 インスタンスの再起動時にユーザーデータを実行するかどうかは、ユーザーデータの形式によって決まります。
次のセクションでは、Linuxインスタンスのユーザーデータの一般的な形式について説明します。
ユーザーデータ形式の詳細については、cloud-initドキュメントの「ユーザーデータ形式」をご参照ください。
ユーザーデータスクリプト、cloud-configデータ、またはincludeファイルのサイズが32 KBを超える場合は、データ型としてGzip圧縮コンテンツを選択することを推奨します。
インスタンスを起動するたびにユーザーデータスクリプトを実行する場合は、データ型としてcloud-config dataまたはUpstart jobを選択することを推奨します。
ユーザーデータスクリプト
概要
ユーザーデータスクリプトがLinuxインスタンスに渡された後、スクリプトはシェルスクリプトとして実行され、インスタンスが最初に起動されたときに1回だけ実行されます。
ランニング周波数
インスタンスブート: ユーザーデータスクリプトは、インスタンスが最初に起動されたときに1回だけ実行されます。 インスタンスの再起動時にスクリプトが実行されません。
オペレーティングシステムの交換: スクリプトは自動的に実行されます。
システムディスクの再初期化: スクリプトは自動的に実行されます。
重要次のシナリオでは、スクリプトは自動的に実行されません。
カスタムイメージを使用して、カスタムイメージが作成されたソースインスタンスのオペレーティングシステムを置き換えると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
カスタムイメージを使用してインスタンスを作成すると、インスタンスのシステムディスクにデータが保存されます。 システムディスクを初期化すると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
Format
最初の行は、数字記号と感嘆符 (
#!
) で始まります。サンプルユーザーデータスクリプト
#!/bin/sh echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt
サンプルのユーザーデータスクリプトは、インスタンスが最初に起動されたときに1回だけ実行され、システム時刻をuserdata_test.txtファイルに書き込みます。
クラウド設定データ
概要
Cloud-initは、特定のタスクを実行し、ソフトウェアパッケージのインストールやネットワーク設定の構成などの構成を実行する一連の機能モジュールを定義します。 Cloud-initは、ベンダーデータ、カスタムデータ、およびカーネルパラメータからcloud-configデータを取得します。 cloud-configデータは、タスクに関与するモジュールと実行するアクションを決定します。 ECSインスタンスを作成する前に、モジュールとタスクを指定してカスタムクラウド設定データを設定し、クラウド設定データをユーザーデータとしてインスタンスに渡すことができます。 インスタンスが起動されると、cloud-initはcloud-configデータを読み取り、解析して、構成ファイルの指示に従ってモジュールを実行し、タスクを実行してインスタンスを構成およびデプロイします。
ランニング周波数
インスタンスブート: cloud-configデータ内のタスクを実行するかどうかは、タスクに対応するモジュールの実行頻度によって決まります。 モジュールの詳細については、「モジュール」をご参照ください。
Once-per-instance: モジュールは、インスタンスが最初に起動されたときに1回だけ実行されます。 たとえば、AptやSet Passwordsなどのモジュールは、インスタンスごとに1回の頻度で設定および実行されます。 インスタンスの再起動時にモジュールは実行されません。
常に: モジュールは、インスタンスが起動されるたびに実行されます。 たとえば、BootcmdやUpdate Etc HostsなどのモジュールがAlwaysの頻度で実行される場合、インスタンスが起動されるたびにモジュールが実行されます。
オペレーティングシステムの置き換え: cloud-configデータは自動的に実行されます。
システムディスクの再初期化: cloud-configデータが自動的に実行されます。
重要次のシナリオでは、スクリプトは自動的に実行されません。
カスタムイメージを使用して、カスタムイメージが作成されたソースインスタンスのオペレーティングシステムを置き換えると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
カスタムイメージを使用してインスタンスを作成すると、インスタンスのシステムディスクにデータが保存されます。 システムディスクを初期化すると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
Format
最初の行は
#cloud-config
で始まり、ヘッダーにはスペースが含まれていません。Cloud-configデータは、YAML (Yet Another Markup Language) 構文に従う必要があります。
サンプルcloud-config data
#cloud-config apt: primary: - arches: [default] uri: https://us.archive.ubuntu.com/ubuntu/ bootcmd: - echo "Hello World. The time is now $(date -R)!" | tee /root/userdata_test.txt
この例では、インスタンスが起動されるたびにcloud-configデータが実行され、デフォルトリポジトリが変更され、最新のシステム時刻がuserdata_test.txtファイルに書き込まれます。
Include file
概要
インクルードファイルには、ユーザーデータスクリプトまたはクラウド設定データへの1つ以上のリンクが含まれています。 各リンクは別々のラインを占める。 インスタンスが起動されると、cloud-initはリンクを1つずつ読み取り、解析します。 cloud-initがリンクを読み取るときにエラーが発生した場合、cloud-initは残りのリンクの読み取りを停止します。
説明Alibaba Cloud Object Storage Service (OSS) を使用して、ユーザーデータスクリプトまたはクラウド設定データをインスタンスにアップロードしたり、リンクを取得したり、リンクの有効期間を指定したりできます。 詳細については、「OSSコンソールを使用して開始する」をご参照ください。
ランニング周波数
インスタンスブート: 実行頻度は、リンクの送信先のコンテンツによって異なります。 たとえば、リンクがユーザーデータスクリプトに向けられている場合、スクリプトはインスタンスが最初に開始されたときに1回だけ実行されます。 リンクがcloud-configデータに向けられている場合、cloud-configデータの実行頻度が優先されます。
オペレーティングシステムの置き換え: includeファイルは自動的に実行されます。
システムディスクの再初期化: インクルードファイルが自動的に実行されます。
重要次のシナリオでは、スクリプトは自動的に実行されません。
カスタムイメージを使用して、カスタムイメージが作成されたソースインスタンスのオペレーティングシステムを置き換えると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
カスタムイメージを使用してインスタンスを作成すると、インスタンスのシステムディスクにデータが保存されます。 システムディスクを初期化すると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
Format
最初の行は
#include
で始まり、ヘッダーにはスペースが含まれていません。サンプルinclude file
#include https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.sh
この例では、includeファイルにはユーザーデータスクリプトへのリンクが含まれており、スクリプトはインスタンスが最初に起動されたときに1回だけ実行されます。
説明インクルードファイルまたはGzip圧縮コンテンツを使用する場合は、ストレージサービスを使用してスクリプトをアップロードし、スクリプトリンクを取得し、リンクの有効期間を指定します。 Alibaba Cloud OSSの使用を推奨します。 詳細については、「OSSコンソールを使用して開始する」をご参照ください。
Gzip 圧縮コンテンツ
概要
ユーザーデータスクリプト、cloud-configデータ、またはincludeファイルのサイズが32 KBを超える場合は、Gzipを使用して、
. gz
形式で、対応するリンクを生成し、インクルードファイルをインスタンスに渡します。 Cloud-initは、Gzip圧縮コンテンツを自動的に解凍します。 解凍されたコンテンツの実行結果は、インスタンスに直接渡される非圧縮コンテンツの実行結果と同じです。説明Alibaba Cloud OSSを使用して、ユーザーデータスクリプトまたはクラウド設定データをインスタンスにアップロードしたり、リンクを取得したり、リンクの有効期間を指定したりすることもできます。 詳細については、「OSSコンソールを使用して開始する」をご参照ください。
ランニング周波数
インスタンスブート: 実行頻度は、スクリプトタイプとモジュールタイプによって異なります。 たとえば、リンクがユーザーデータスクリプトであるGzip圧縮コンテンツに向けられている場合、Gzip圧縮コンテンツは、インスタンスが最初に起動されたときに1回だけ実行されます。
オペレーティングシステムの置き換え: Gzip圧縮コンテンツが自動的に実行されます。
システムディスクの再初期化: Gzip圧縮コンテンツが自動的に実行されます。
重要次のシナリオでは、スクリプトは自動的に実行されません。
カスタムイメージを使用して、カスタムイメージが作成されたソースインスタンスのオペレーティングシステムを置き換えると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
カスタムイメージを使用してインスタンスを作成すると、インスタンスのシステムディスクにデータが保存されます。 システムディスクを初期化すると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
Format
最初の行は
#include
で始まり、ヘッダーにはスペースが含まれていません。Gzip圧縮コンテンツのサンプルコード
#include https://ecs-image-test.oss-cn-hangzhou.aliyuncs.com/userdata/myscript.gz
この例では、includeファイルには、ユーザーデータスクリプトであるGzip圧縮コンテンツへのリンクが含まれています。 cloud-initがGzip圧縮されたユーザーデータスクリプトを読み取った後、スクリプトは自動的に解凍され、インスタンスが最初に起動されたときにのみ実行されます。
upstart job
インスタンスでUpstartジョブを使用するには、インスタンスにUpstartサービスをインストールします。 インスタンスは、CentOS 6、Ubuntu 10、Ubuntu 12、Ubuntu 14、Debian 6、Debian 7のいずれかのオペレーティングシステムを実行する必要があります。
概要
Upstartは、イベント駆動型初期化システムです。 Upstartジョブは、いつ開始または停止するか、およびサービスまたはタスクを実行する方法を定義する構成ファイルです。 Upstartジョブファイルのファイル拡張子は。confで、/etc/init /ディレクトリにあります。
ランニング周波数
インスタンスブート: Upstartジョブは、インスタンスが開始されるたびに自動的に実行されます。
オペレーティングシステムの交換: Upstartジョブは自動的に実行されます。
システムディスクの再初期化: Upstartジョブは自動的に実行されます。
重要次のシナリオでは、スクリプトは自動的に実行されません。
カスタムイメージを使用して、カスタムイメージが作成されたソースインスタンスのオペレーティングシステムを置き換えると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
カスタムイメージを使用してインスタンスを作成すると、インスタンスのシステムディスクにデータが保存されます。 システムディスクを初期化すると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
Format
最初の行は
#upstart-job
で始まり、ヘッダーにはスペースが含まれていません。サンプルUpstartジョブ
#upstart-job description "upstart test" start on runlevel [2345] #Starts at run levels 2, 3, 4, and 5. stop on runlevel [!2345] #Stops at run levels other than 2, 3, 4, and 5. exec echo "Hello World. The time is now $(date -R)!" | tee /root/output.txt
サンプルUpstartジョブは、システムが指定された実行レベルで実行されるときにタイムスタンプを含むメッセージを返し、そのメッセージを
/root/output.txt
ファイルに追加します。 Upstartジョブは、前に指定した実行レベルとは異なる実行レベルでシステムが実行されると停止します。
Windows インスタンス
Windowsインスタンスは、VminitコンポーネントのPlugin_Main_CloudinitUserData
を使用してユーザーデータスクリプトを実行します。 このプラグインは、インスタンスが最初に起動されたときに1回だけ実行されます。 Windowsユーザーデータスクリプトは、バッチ形式とPowerShell形式をサポートしています。 詳細は、「Vminitコンポーネント」をご参照ください。
バッチスクリプト
ランニング周波数
インスタンスブート: スクリプトは、インスタンスが最初に起動されたときにのみ実行されます。 インスタンスの再起動時にスクリプトが実行されません。
オペレーティングシステムの交換: スクリプトは自動的に実行されます。
システムディスクの再初期化: スクリプトは自動的に実行されます。
重要次のシナリオでは、スクリプトは自動的に実行されません。
カスタムイメージを使用して、カスタムイメージが作成されたソースインスタンスのオペレーティングシステムを置き換えると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
カスタムイメージを使用してインスタンスを作成すると、インスタンスのシステムディスクにデータが保存されます。 システムディスクを初期化すると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
Format
最初の行は
[bat]
で、ヘッダーにはスペースが含まれていません。半角文字のみ入力できます。
データ書き込みパスを
C:\Users
ディレクトリにすることはできません。説明Windowsシステムでは、
C:\Users
ディレクトリとそのサブディレクトリは、ユーザープロファイルとデータの既定の保存場所であり、システムにログインした後にのみアクセスできます。 ユーザーデータの実行を伴うシステム初期化フェーズでは、ユーザーはまだシステムにログインしていないため、C:\Users
ディレクトリへのデータの書き込みに失敗します。
サンプルバッチスクリプト
[bat] echo "bat test" > C:\userdata_test.txt
この例では、バッチスクリプトは、インスタンスが最初に起動されたときに1回だけ実行され、userdata_test.txtファイルに
"bat test"
が書き込まれます。
PowerShellスクリプト
ランニング周波数
インスタンスブート: スクリプトは、インスタンスが最初に起動されたときにのみ実行されます。 インスタンスの再起動時にスクリプトが実行されません。
オペレーティングシステムの交換: スクリプトは自動的に実行されます。
システムディスクの再初期化: スクリプトは自動的に実行されます。
重要次のシナリオでは、スクリプトは自動的に実行されません。
カスタムイメージを使用して、カスタムイメージが作成されたソースインスタンスのオペレーティングシステムを置き換えると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
カスタムイメージを使用してインスタンスを作成すると、インスタンスのシステムディスクにデータが保存されます。 システムディスクを初期化すると、システムはインスタンスが初めて起動されていないと判断し、スクリプトを実行しません。
Format
最初の行は
[powershell]
で、ヘッダーにはスペースが含まれていません。半角文字のみ入力できます。
データ書き込みパスを
C:\Users
ディレクトリにすることはできません。説明Windowsシステムでは、
C:\Users
ディレクトリとそのサブディレクトリは、ユーザープロファイルとデータの既定の保存場所であり、システムにログインした後にのみアクセスできます。 ユーザーデータの実行を伴うシステム初期化フェーズでは、ユーザーはまだシステムにログインしていないため、C:\Users
ディレクトリへのデータの書き込みに失敗します。
サンプルPowerShellスクリプト
[powershell] write-output "powershell test" | Out-File C:\userdata_test.txt
この例では、PowerShellスクリプトは、インスタンスが最初に起動されたときに1回だけ実行され、
powershell test
をuserdata_test.txtファイルに書き込みます。
関連ドキュメント
ECSインスタンスのユーザーデータを照会するには、API操作を呼び出すことができます。 詳細については、「DescribeUserData」をご参照ください。
Auto Scalingのユーザーデータ機能を使用すると、インスタンスの起動時に複数のECSインスタンスが設定済みのスクリプトまたはコマンドを自動的に実行できるようになります。 これにより、ECSインスタンス設定の一貫性が確保され、O&Mが簡素化されます。詳細については、「インスタンスユーザーデータ機能を使用したECSインスタンスの自動設定」をご参照ください。
プログラムの例外、インスタンスの再起動、電源障害などの問題によりサービスまたはスクリプトが中断されたときにサービスまたはスクリプトを迅速に復旧させたい場合は、
ecs-tool-servicekeepalive
という名前のCloud Assistantプラグインを使用します。 詳細については、「サービスの自動復元」をご参照ください。