Amazon EC2 Linux インスタンスを再起動する度にユーザーデータを実行して自動的にファイルを作成するにはどうすればよいですか?

最終更新日: 2021 年 7 月 13 日

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスが再起動されるたびに、ユーザーデータを利用してスクリプトを実行したいと考えています。その方法を教えてください。

簡単な説明

デフォルトでは、ユーザーデータスクリプトと cloud-init ディレクティブは、EC2 インスタンスが起動される最初の起動サイクルでのみ実行されます。ただし、MIME マルチパートファイルを使えば、ユーザーデータスクリプトと cloud-init ディレクティブを設定できます。MIME マルチパートファイルを使用すると、cloud-init パッケージでユーザーデータが実行される頻度をスクリプトで変更できます。その後、ファイルは、ユーザースクリプトを実行します。MIME マルチパートファイルの詳細については、cloud-init ウェブサイトの「MIME マルチパートアーカイブ」をご参照ください。

解決方法

警告: この手順を開始する前に、次の点にご注意ください。

1.    cloud-init の最新バージョンが EC2 インスタンスにインストールさ れ、正常に動作することを確認します。

2.    セキュリティ上の理由から、IAM ポリシーを作成して、ユーザーデータを追加または削除するユーザーModifyInstanceAttribute API を使って制限します。

3.    Amazon EC2 コンソールを開きます。

4.    インスタンスを停止します。

5.    [Actions] (アクション)、[Instance Settings] (インスタンスの設定)、[Edit User Data] (ユーザーデータの編集) の順に選択します。

6.    ユーザースクリプトを [Edit user data] (ユーザーデータの編集) ボックスにコピーして、[Save] (保存) を選択します。

次の例は、「Hello World」を /tmp ディレクトリの testfile.txt ファイルに書き込むシェルスクリプトです。

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/echo "Hello World" >> /tmp/testfile.txt
--//--

デフォルトでは、cloud-initは ユーザーデータで一度に 1 つのコンテンツタイプのみを許可します。ただし、この例は、MIMEマルチパートファイルのtext/cloud-config text/x-shellscript の両方のコンテンツタイプを示しています。

text/cloud-config コンテンツタイプは、SCRIPTS-USER パラメータを ALWAYS に設定することによって、cloud-init パッケージでユーザーデータが実行される頻度をオーバーライドします。

text/x-shellscript コンテンツタイプは、cloud-init cloud_final_modules モジュールによって実行される実際のユーザースクリプトを提供します。この例では、実行する行は /bin/echo "Hello World." >> /tmp/testfile.txt の 1 つだけです。

: /bin/echo "Hello World." >> /tmp/testfile.txt の行を、インスタンス起動時に実行するシェルスクリプトの行と置き換えます。

7.    EC2 インスタンスを再度起動し、スクリプトが正しく実行されていることを検証します。