

# ユーザーデータ入力を使用して EC2 インスタンスを起動するときにコマンドを実行する
<a name="user-data"></a>

Amazon EC2 インスタンスの起動時に、インスタンスの起動後に自動設定タスクを実行したり、スクリプトを実行したりするのに使用するインスタンスにユーザーデータを渡すことができます。

より複雑なオートメーションのシナリオに興味がある場合、CloudFormation を検討してください。詳細については、「*AWS CloudFormation ユーザーガイド*」の「[CloudFormation を使用して Amazon EC2 でアプリケーションのデプロイ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/deploying.applications.html)」を参照してください。

Linux インスタンスでは、シェルスクリプトと cloud-init ディレクティブという 2 つのタイプのユーザーデータを Amazon EC2 に渡すことができます。また、このデータは、プレーンテキスト、ファイル (コマンドラインツールを使用してインスタンスを起動する場合に便利です)、または base64 でエンコードされたテキスト (API コール向け) で、インスタンス起動ウィザードに渡すこともできます。

Windows インスタンスでは、起動エージェントがユーザーデータスクリプトを処理します。

**考慮事項**
+ ユーザーデータは非透過的なデータとして取り扱われ、指定したデータがそのまま返されます。インスタンスによって解釈が異なります。
+ ユーザーデータはbase64 でエンコードされている必要があります。Amazon EC2 コンソールは base64 エンコードを実行したり、base64 エンコード入力を受け入れたりできます。インスタンスのメタデータまたはコンソールを使用してユーザーデータを取得する場合、自動的に base64 でデコードされます。
+ ユーザーデータは raw 形式の 16 KB に制限されます (以前は base64 エンコード)。base64 エンコード後の 文字列の長さサイズ *n* はceil(*n*/3)\$14 です。
+ ユーザーデータはインスタンス属性です。インスタンスから AMI を作成する場合、インスタンスのユーザーデータは AMI に含まれません。

## AWS マネジメントコンソール のユーザーデータ
<a name="user-data-console"></a>

インスタンスの起動時のインスタンスユーザーデータを指定できます。インスタンスのルートボリュームが EBS ボリュームの場合は、インスタンスを停止してユーザーデータを更新することもできます。

### Launch Wizard を使用して起動時にインスタンスのユーザーデータを指定する
<a name="user-data-launch-instance-wizard"></a>

EC2 コンソールで Launch Wizard を使用してインスタンスを起動するときに、ユーザーデータを指定できます。起動時にユーザーデータを指定するには、[インスタンスを起動する](ec2-launch-instance-wizard.md)手順に従います。**[User data]** (ユーザーデータ) フィールドは、インスタンス起動ウィザードの [高度な詳細](ec2-instance-launch-parameters.md#liw-advanced-details) セクションにあります。PowerShell スクリプトを **[ユーザーデータ]**  フィールドに入力し、インスタンスの起動手順を完了します。

次の **[ユーザーデータ]** フィールドのスクリーンショットのスクリプト例では、ファイル名に現在の日付と時刻を使用して、Windows 一時フォルダーにファイルを作成します。`<persist>true</persist>` を含めると、インスタンスを再起動または起動するたびにスクリプトが実行されます。**[ユーザーデータは既に base64 でエンコードされています]** チェックボックスをオフのままにした場合、Amazon EC2 コンソールがユーザーに代わって base64 エンコードを実行します。

![\[Advance Details ユーザーデータテキストフィールド。\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/images/configure_ec2config_userdata.png)


詳細については、「[Launch Wizard を使用して起動時にインスタンスのユーザーデータを指定する](#user-data-launch-instance-wizard)」を参照してください。AWS CLI を使用するの Linux の例については、「[ユーザーデータと AWS CLI](#user-data-api-cli)」を参照してください。Windows PowerShell用ツール を使用する Windows の例については、「[ユーザーデータと Windows PowerShell用ツール](#user-data-powershell)」を参照してください。

### インスタンスユーザーデータの表示と更新
<a name="user-data-view-change"></a>

任意のインスタンスのインスタンスユーザーデータを表示し、停止したインスタンスのインスタンスユーザーデータを更新できます。

**コンソールを使用してインスタンスユーザーデータを更新するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで、[**インスタンス**] を選択してください。

1. インスタンスを選択し、[**Actions (アクション)**]、[**Instance state (インスタンスの状態)**]、[**Stop instance (インスタンスの停止)**] の順に選択してください。
**警告**  
インスタンスストアボリューム上のデータは、インスタンスを停止すると失われます。このデータを保持するには、永続ストレージにバックアップしてください。

1. 確認を求められたら、[**Stop**] を選択してください。インスタンスが停止するまで、数分かかる場合があります。

1. インスタンスが選択された状態のまま、[**Actions (アクション)**]、[**Instance settings (インスタンス設定)**]、[**Edit user data (ユーザーデータの編集)**] の順に選択してください。インスタンスの実行中はユーザーデータを変更できませんが、表示することはできます。

1. [**Edit user data (ユーザーデータの編集)**] ダイアログボックスで、ユーザーデータを更新し、[**Save (保存)**] を選択してください。インスタンスを再起動または起動するたびにユーザーデータスクリプトを実行するには、次の例に示すように `<persist>true</persist>` をユーザーデータに追加します。  
![\[[Edit User Data] (ユーザデータの編集) ダイアログボックス。\]](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/images/view-change-user-data.png)

1. インスタンスを起動します。後続の再起動または開始のためにユーザーデータの実行を有効にした場合、更新されたユーザーデータスクリプトはインスタンスの開始プロセスの一部として実行されます。

## Amazon EC2 が Linux インスタンスのユーザーデータを処理する方法
<a name="userdata-linux"></a>

次の例は、ユーザーデータを使用して、インスタンスの起動時に LAMP サーバーをセットアップするコマンドを実行します。各例では、次のタスクが実行されます。
+ ディストリビューションソフトウェアパッケージが更新されます。
+ ウェブサーバー、`php`、`mariadb` パッケージがインストールされます。
+ `httpd` サービスが開始され、有効になります。
+ ユーザー `ec2-user` が apache グループに追加されます。
+ ウェブディレクトリとその中に含まれるファイルに対して、適切な所有権とファイル権限が設定されます。
+ ウェブサーバーと PHP エンジンをテストするために、シンプルなウェブページが作成されます。

**Topics**
+ [

### 前提条件
](#user-data-requirements)
+ [

### ユーザーデータとシェルスクリプト
](#user-data-shell-scripts)
+ [

### インスタンスのユーザーデータを更新する
](#user-data-modify)
+ [

### ユーザーデータと cloud-init ディレクティブ
](#user-data-cloud-init)
+ [

### ユーザーデータと AWS CLI
](#user-data-api-cli)
+ [

### シェルスクリプトと cloud-init ディレクティブを組み合わせる
](#user-data-mime-multi)

### 前提条件
<a name="user-data-requirements"></a>

このトピックの例では、
+ インスタンスには、インターネットからアクセス可能なパブリック DNS 名が設定されていることを前提にしています。
+ インスタンスに関連付けられたセキュリティグループは、SSH (ポート 22) トラフィックを許可するように設定されているため、インスタンスに接続して出力ログファイルを表示できます。
+ Amazon Linux AMI を使用してインスタンスが起動します。コマンドとディレクティブは、他の Linux ディストリビューションでは機能しないことがあります。cloud-init のサポートなど、その他のディストリビューションについての詳細は、特定のディストリビューションのドキュメントを参照してください。

### ユーザーデータとシェルスクリプト
<a name="user-data-shell-scripts"></a>

シェルスクリプトに慣れている場合は、この方法が最も簡単で完全に起動時に指示を送信する方法です。起動時にこれらのタスクを追加すると、インスタンスの起動にかかる時間が増えます。タスクが完了するまでさらに数分待ち、それからユーザースクリプトが正常に完了したことをテストしてください。

**重要**  
デフォルトでは、ユーザーデータスクリプトと cloud-init ディレクティブは、インスタンスの最初の起動サイクル中にのみ実行されます。インスタンスを再起動するたびにユーザーデータスクリプトと cloud-init ディレクティブが実行されるように設定を更新できます。詳細については、AWS ナレッジセンターの[Amazon EC2 Linux インスタンスを再起動する度にユーザーデータを実行して自動的にファイルを作成するにはどうすればよいですか?](https://repost.aws/knowledge-center/execute-user-data-ec2)を参照してください。

ユーザーデータのシェルスクリプトは、`#!` の記号と、スクリプトを読み取るインタープリタのパス (通常は **/bin/bash)**) から始める必要があります。シェルスクリプトの概要については、*GNU オペレーティングシステム*のウェブサイトにある「[Bash Reference Manual](https://www.gnu.org/software/bash/manual/bash.html)」を参照してください。

ユーザーデータとして入力されたスクリプトはルートユーザーとして実行されます。そのため、スクリプトでは **sudo** コマンドを使用しないでください。作成したファイルはすべてルートユーザーの所有になることを忘れないでください。ルート以外のユーザーにファイルアクセスを与える場合、スクリプトで許可を適宜変更する必要があります。また、スクリプトはインタラクティブに実行されないため、ユーザーフィードバックを必要とするコマンド (`-y` フラグのない **yum update** など) を含めることはできません。

ユーザーデータスクリプトで AWS API (AWS CLI など) を使用する場合は、インスタンスを起動するときにインスタンスプロファイルを使用する必要があります。インスタンスプロファイルは、API 呼び出しを発行するためにユーザーデータスクリプトが必要とする適切な AWS 認証情報を提供します。詳細については、IAM ユーザーガイド の[インスタンスプロファイルの使用](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)を参照してください。IAM ロールに割り当てるアクセス許可は、API で呼び出すサービスによって異なります。詳細については、「[Amazon EC2 の IAM ロール](iam-roles-for-amazon-ec2.md)」を参照してください。

cloud-init 出力ログファイルでコンソール出力がキャプチャされるため、インスタンスが意図したように動作しない場合でも、起動後、簡単にスクリプトをデバッグすることができます。ログファイルを表示するには、[インスタンスに接続](connect-to-linux-instance.md)し、`/var/log/cloud-init-output.log` を開きます。

ユーザーデータスクリプトを処理すると、`/var/lib/cloud/instances/instance-id/` にコピーされ、実行されます。実行後にスクリプトを削除することはできません。必ず `/var/lib/cloud/instances/instance-id/` のユーザーデータスクリプトを削除してから、インスタンスに AMI を作成してください。それ以外の場合、スクリプトはこの AMI から起動されたインスタンスのこのディレクトリに存在します。

### インスタンスのユーザーデータを更新する
<a name="user-data-modify"></a>

インスタンスのユーザーデータを更新するには、まずインスタンスを停止する必要があります。インスタンスが実行されている場合は、ユーザーデータを表示できますが、変更することはできません。

**警告**  
インスタンスストアボリューム上のデータは、インスタンスを停止すると失われます。このデータを保持するには、永続ストレージにバックアップしてください。

**インスタンスユーザーデータを変更するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで、[**インスタンス**] を選択してください。

1. インスタンスを選択し、[**Instance state (インスタンスの状態)**]、[**Stop instance (インスタンスの停止)**] の順に選択してください。このオプションが無効になっている場合はインスタンスが既に停止しているか、またはルートボリュームがインスタンスストアボリュームです。

1. 確認を求められたら、[**Stop**] を選択してください。インスタンスが停止するまで、数分かかる場合があります。

1. インスタンスが選択された状態のまま、[**Actions (アクション)**]、[**Instance settings (インスタンス設定)**]、[**Edit user data (ユーザーデータの編集)**] の順に選択してください。

1. 必要に応じてユーザーデータを変更し、[**Save (保存)**] を選択してください。

1. インスタンスを起動します。新しいユーザーデータは、再起動後にインスタンス上に表示されますが、ユーザーデータスクリプトは実行されません。

### ユーザーデータと cloud-init ディレクティブ
<a name="user-data-cloud-init"></a>

cloud-init パッケージは、新しい Amazon Linux インスタンスが起動したときに、特定の側面を設定します。具体的には、お客様のプライベートキーでログインできるように、ec2-user の `.ssh/authorized_keys` ファイルを設定します。Amazon Linux インスタンスに対して cloud-init パッケージが実行する設定タスクの詳細については、次のドキュメントを参照してください。
+ **Amazon Linux 2023** – [カスタマイズされた cloud-init](https://docs.aws.amazon.com/linux/al2023/ug/cloud-init.html)
+ **Amazon Linux 2** – [Amazon Linux 2 上の cloud-init の使用](https://docs.aws.amazon.com/linux/al2/ug/amazon-linux-cloud-init.html)

構文は異なりますが、渡されたスクリプトと同じ方法で cloud-init ユーザーディレクティブを起動時のインスタンスに渡すことができます。cloud-init の詳細については、[https://cloudinit.readthedocs.org/en/latest/index.html](https://cloudinit.readthedocs.org/en/latest/index.html) を参照してください。

**重要**  
デフォルトでは、ユーザーデータスクリプトと cloud-init ディレクティブは、インスタンスの最初の起動サイクル中にのみ実行されます。インスタンスを再起動するたびにユーザーデータスクリプトと cloud-init ディレクティブが実行されるように設定を更新できます。詳細については、AWS ナレッジセンターの[Amazon EC2 Linux インスタンスを再起動する度にユーザーデータを実行して自動的にファイルを作成するにはどうすればよいですか?](https://repost.aws/knowledge-center/execute-user-data-ec2)を参照してください。

起動時にこれらのタスクを追加すると、インスタンスの起動にかかる時間が増えます。タスクが完了するまでさらに数分待ち、それからユーザーデータディレクティブが完了したことをテストしてください。

**cloud-init ディレクティブを Amazon Linux インスタンスに渡すには**

1. [インスタンスを起動する](ec2-launch-instance-wizard.md)ための手順に従います。**[User data]** (ユーザーデータ) フィールドは、インスタンス起動ウィザードの [高度な詳細](ec2-instance-launch-parameters.md#liw-advanced-details) セクションにあります。cloud-init ディレクティブテキストを**[User data]** (ユーザーデータ) フィールドに入力してから、インスタンスの起動手順を完了します。

   下の例では、ディレクティブが Amazon Linux でウェブサーバーを作成して設定します。一番上の `#cloud-config` 行は、cloud-init ディレクティブとしてコマンドを識別するために必要です。

------
#### [ AL2023 ]

   ```
   #cloud-config
   package_update: true
   package_upgrade: all
   	
   packages:
   - httpd
   - mariadb105-server
   - php8.1
   - php8.1-mysqlnd
   
   runcmd:
   - systemctl start httpd
   - systemctl enable httpd
   - [ sh, -c, "usermod -a -G apache ec2-user" ]
   - [ sh, -c, "chown -R ec2-user:apache /var/www" ]
   - chmod 2775 /var/www
   - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ]
   - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ]
   - [ sh, -c, 'echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php' ]
   ```

------
#### [ AL2 ]

   ```
   #cloud-config
   package_update: true
   package_upgrade: all
   	
   packages:
   - httpd
   - mariadb-server
   	
   runcmd:
   - [ sh, -c, "amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2" ]
   - systemctl start httpd
   - systemctl enable httpd
   - [ sh, -c, "usermod -a -G apache ec2-user" ]
   - [ sh, -c, "chown -R ec2-user:apache /var/www" ]
   - chmod 2775 /var/www
   - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ]
   - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ]
   - [ sh, -c, 'echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php' ]
   ```

------

1. インスタンスが起動し、ユーザーデータのディレクティブを実行するまで十分待ち、それから意図したタスクをディレクティブが完了したことを確認します。

   この例では、ウェブブラウザで、ディレクティブが作成した PHP テストファイルの URL を入力してください。この URL は、インスタンスのパブリック DNS アドレスにスラッシュとファイル名を追加したものです。

   ```
   http://my.public.dns.amazonaws.com/phpinfo.php
   ```

   PHP 情報ページが表示されるはずです。PHP 情報ページが表示されない場合、使用しているセキュリティグループに HTTP (ポート 80) トラフィックを許可するルールが含まれていることを確認します。詳細については、「[セキュリティグループルールの設定](changing-security-group.md#add-remove-security-group-rules)」を参照してください。

1. (オプション) ディレクティブが期待したタスクを達成しなかった場合、あるいは単にディレクティブがエラーなしで完了したことを確認する場合は、[インスタンスに接続](connect-to-linux-instance.md)し、出力ログファイル `/var/log/cloud-init-output.log`を調べ、出力にエラーメッセージがないか探します。デバッグの詳細情報を取得するには、ディレクティブに次の行を追加します:

   ```
   output : { all : '| tee -a /var/log/cloud-init-output.log' }
   ```

   このディレクティブにより、**runcmd** 出力が `/var/log/cloud-init-output.log` に送信されます。

### ユーザーデータと AWS CLI
<a name="user-data-api-cli"></a>

AWS CLI を使用して、インスタンスのユーザーデータを指定、変更、表示することができます。インスタンスのメタデータを使用して、インスタンスからユーザーデータを表示する方法については、[EC2 インスタンスのインスタンスメタデータにアクセスする](instancedata-data-retrieval.md)を参照してください。

Windows では、AWS CLI を使用する代わりに AWS Tools for Windows PowerShell を使用できます。詳細については、「[ユーザーデータと Windows PowerShell用ツール](#user-data-powershell)」を参照してください。

**例: ユーザーデータは、起動時に指定します。**  
インスタンスの起動時にユーザーデータを指定するには、[run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) コマンドと `--user-data` パラメータを使用します。**run-instances** で、AWS CLI はユーザーデータの base64 エンコードを実行します。

次の例は、コマンドラインで文字列としてスクリプトを指定する方法を示しています。

```
aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \
    --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \
    --user-data echo user data
```

次の例は、テキストファイルを使用してスクリプトを指定する方法を示しています。ファイルを指定するには、必ず `file://` プレフィクスを使用してください。

```
aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \
    --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \
    --user-data file://my_script.txt
```

シェルスクリプトを使用したテキストファイルの例を次に示します。

```
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```

**例: 停止しているインスタンスのユーザーデータを変更する**  
停止したインスタンスのユーザーデータは、[modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html) コマンドを使用して変更できます。**modify-instance-attribute** では、AWS CLI はユーザーデータの base64 エンコードを実行しません。
+ **Linux** コンピュータでは、base64 コマンドを使用してユーザーデータをエンコードします。

  ```
  base64 my_script.txt >my_script_base64.txt
  ```
+ **Windows** コンピュータでは、certutil コマンドを使用してユーザーデータをエンコードします。このファイルを AWS CLI で使用する前に、最初の (証明書の開始) 行と最後の (証明書の終了) 行を削除する必要があります。

  ```
  certutil -encode my_script.txt my_script_base64.txt
  notepad my_script_base64.txt
  ```

`--attribute` および `--value` パラメータを使用して、エンコードされたテキストファイルを使用してユーザーデータを指定します。ファイルを指定するには、必ず `file://` プレフィクスを使用してください。

```
aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --value file://my_script_base64.txt
```

**例: 停止しているインスタンスのユーザーデータをクリアする**  
既存のユーザーデータを削除するには、次の [modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html) コマンドを使用します。

```
aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --user-data Value=
```

**例: ユーザーデータの表示**  
インスタンスのユーザーデータを取得するには、[describe-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-attribute.html) コマンドを使用します。**describe-instance-attribute** では、AWS CLI はユーザーデータの base64 デコードを実行しません。

```
aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData
```

ユーザーデータが base64 でエンコードされた出力例を次に示します。

```
{
    "UserData": {
        "Value": "IyEvYmluL2Jhc2gKeXVtIHVwZGF0ZSAteQpzZXJ2aWNlIGh0dHBkIHN0YXJ0CmNoa2NvbmZpZyBodHRwZCBvbg=="
    },
    "InstanceId": "i-1234567890abcdef0"
}
```
+ **Linux** コンピュータでは、`--query` オプションを使用してエンコードされたユーザーデータを取得し、base64 コマンドを使用してデコードします。

  ```
  aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" | base64 --decode
  ```
+ **Windows** コンピュータでは、`--query` オプションを使用してコード化されたユーザーデータを取得し、certutil コマンドを使用してコードをデコードします。エンコードされた出力はファイルに保存され、デコードされた出力は別のファイルに保存されることに注意してください。

  ```
  aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" >my_output.txt
  certutil -decode my_output.txt my_output_decoded.txt
  type my_output_decoded.txt
  ```

以下は出力の例です。

```
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```

### シェルスクリプトと cloud-init ディレクティブを組み合わせる
<a name="user-data-mime-multi"></a>

デフォルトでは、ユーザーデータに含めることができるコンテンツタイプは一度に 1 つだけです。ただし、MIME マルチパートファイルの中で `text/cloud-config` と `text/x-shellscript` のコンテンツタイプを使用して、ユーザーデータにシェルスクリプトと cloud-init ディレクティブの両方を含めることは可能です。

以下に、MIME マルチパートの形式を示します。

```
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-init directives
	
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
	
#!/bin/bash
shell script commands
--//--
```

例えば、次のユーザーデータには cloud-init ディレクティブと bash シェルスクリプトが含まれています。cloud-init ディレクティブはファイル `/test-cloudinit/cloud-init.txt`を作成し、そのファイルに `Created by cloud-init` を書き込みます。bash シェルスクリプトはファイル `/test-userscript/userscript.txt`を作成し、そのファイルに `Created by bash shell script` を書き込みます。

```
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
runcmd:
- [ mkdir, /test-cloudinit ]
write_files:
- path: /test-cloudinit/cloud-init.txt
content: Created by cloud-init
	
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
	
#!/bin/bash
mkdir test-userscript
touch /test-userscript/userscript.txt
echo "Created by bash shell script" >> /test-userscript/userscript.txt
--//--
```

## Amazon EC2 が Windows インスタンスのユーザーデータを処理する方法
<a name="ec2-windows-user-data"></a>

Windows インスタンスでは、起動エージェントはユーザーデータに関連するタスクを実行します。詳細については次を参照してください:
+ [EC2Launch v2](ec2launch-v2.md) 
+ [EC2Launch](ec2launch.md) 
+ [EC2Config サービス](ec2config-service.md)

`UserData` テンプレート内の CloudFormation プロパティのアセンブリ例については、[UserData プロパティの Base64 エンコード](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-general.html#scenario-userdata-base64)および[AccessKey と SecretKey を含む UserData プロパティの Base64 エンコード](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-general.html#scenario-userdata-base64-with-keys)を参照してください。

ライフサイクルフックと連携する Auto Scaling グループ内のインスタンスでコマンドを実行する例については、「Amazon EC2 Auto Scaling ユーザーガイド」の「[チュートリアル: インスタンスのメタデータを使用してターゲットライフサイクル状態を取得するようにユーザーデータを設定する](https://docs.aws.amazon.com/autoscaling/ec2/userguide/tutorial-lifecycle-hook-instance-metadata.html)」を参照してください。**

**Topics**
+ [

### ユーザーデータスクリプト
](#user-data-scripts)
+ [

### 圧縮ユーザーデータ
](#user-data-compressed)
+ [

### ユーザーデータの実行
](#user-data-execution)
+ [

### ユーザーデータと Windows PowerShell用ツール
](#user-data-powershell)

### ユーザーデータスクリプト
<a name="user-data-scripts"></a>

`EC2Config` または `EC2Launch` でスクリプトを実行するには、そのスクリプトをユーザーデータに追加するときにスクリプトを特別なタグで囲む必要があります。使用するタグは、コマンドをコマンドプロンプトウィンドウ (バッチコマンド) で実行するか、Windows PowerShell を使用するかによって異なります。

バッチスクリプトと Windows PowerShell スクリプトの両方を指定すると、バッチスクリプトが最初に実行され、インスタンスユーザーデータに表示される順序に関係なく、次に Windows PowerShell スクリプトが実行されます。

ユーザーデータスクリプトで AWS API (AWS CLI など) を使用する場合は、インスタンスを起動するときにインスタンスプロファイルを使用する必要があります。インスタンスプロファイルは、API 呼び出しを実行するためにユーザーデータスクリプトが必要とする適切な AWS 認証情報を提供します。詳細については、「[インスタンスプロファイル](iam-roles-for-amazon-ec2.md#ec2-instance-profile)」を参照してください。IAM ロールに割り当てるアクセス許可は、API で呼び出すサービスによって異なります。詳細については、「[Amazon EC2 の IAM ロール](iam-roles-for-amazon-ec2.md)」を参照してください。

**Topics**
+ [

#### バッチスクリプトの構文
](#user-data-batch-scripts)
+ [

#### Windows PowerShell スクリプトの構文
](#user-data-powershell-scripts)
+ [

#### YAML 設定スクリプトの構文
](#user-data-yaml-scripts)
+ [

#### Base64 エンコード
](#user-data-base64-encoding)

#### バッチスクリプトの構文
<a name="user-data-batch-scripts"></a>

`script` タグを使用してバッチ スクリプトを指定します。次の例に示すように、改行を使用してコマンドを区切ります。

```
<script>
    echo Current date and time >> %SystemRoot%\Temp\test.log
    echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log
</script>
```

デフォルトでは、ユーザーデータスクリプトはインスタンスを起動すると一度だけ実行されます。インスタンスを再起動または起動するたびにユーザーデータスクリプトを実行するには、`<persist>true</persist>` をユーザーデータに追加します。

```
<script>
    echo Current date and time >> %SystemRoot%\Temp\test.log
    echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log
</script>
<persist>true</persist>
```

**EC2 ローンチ v2 エージェント**  
XML ユーザーデータスクリプトを `UserData` ステージ内の EC2Launch v2 **executeScript** タスクでデタッチされたプロセスとして実行するには、ユーザーデータに `<detach>true</detach>` を追加します。

**注記**  
detach タグは以前の起動エージェントではサポートされていません。

```
<script>
    echo Current date and time >> %SystemRoot%\Temp\test.log
    echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log
</script>
<detach>true</detach>
```

#### Windows PowerShell スクリプトの構文
<a name="user-data-powershell-scripts"></a>

AWS Windows AMI には [AWS Tools for Windows PowerShell](https://aws.amazon.com/powershell/) が含まれており、ユーザーデータにこれらのコマンドレットを指定することができます。インスタンスに IAM ロールを関連付けている場合は、コマンドレットに認証情報を指定する必要はありません。インスタンスで実行するアプリケーションは、ロールの認証情報を使用して AWS リソース (Simple Storage Service (Amazon S3) バケットなど) にアクセスします。

`<powershell>` タグを使用して Windows PowerShell スクリプトを指定します。コマンドは、改行を使って区切ります。`<powershell>` タグでは、大文字と小文字が区別されます。

例えば、次のようになります。

```
<powershell>
    $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
```

デフォルトでは、ユーザーデータスクリプトはインスタンスを起動すると一度だけ実行されます。インスタンスを再起動または起動するたびにユーザーデータスクリプトを実行するには、`<persist>true</persist>` をユーザーデータに追加します。

```
<powershell>
    $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

`<powershellArguments>` タグを使用して、1 つ以上の PowerShell 引数を指定できます。引数が渡されない場合、EC2Launch と EC2Launch v2 はデフォルトで次の引数を追加します: `-ExecutionPolicy Unrestricted`

**例:**

```
<powershell>
    $file = $env:SystemRoot + "\Temp" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
<powershellArguments>-ExecutionPolicy Unrestricted -NoProfile -NonInteractive</powershellArguments>
```

**EC2 ローンチ v2 エージェント**  
XML ユーザーデータスクリプトを `UserData` ステージ内の EC2Launch v2 **executeScript** タスクでデタッチされたプロセスとして実行するには、ユーザーデータに `<detach>true</detach>` を追加します。

**注記**  
detach タグは以前の起動エージェントではサポートされていません。

```
<powershell>
    $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
<detach>true</detach>
```

#### YAML 設定スクリプトの構文
<a name="user-data-yaml-scripts"></a>

EC2Launch v2 を使用してスクリプトを実行する場合は、YAML 形式を使用できます。EC2Launch v2 の設定タスク、詳細、例を表示するには、[EC2Launch v2 タスクの設定](ec2launch-v2-settings.md#ec2launch-v2-task-configuration)を参照してください。

`executeScript` タスクで YAML スクリプトを指定します。

**PowerShell スクリプトを実行するための YAML 構文の例** 

```
version: 1.0
tasks:
- task: executeScript
  inputs:
  - frequency: always
    type: powershell
    runAs: localSystem
    content: |-
      $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
      New-Item $file -ItemType file
```

**バッチスクリプトを実行するための YAML 構文の例**

```
version: 1.1
tasks:
- task: executeScript
  inputs:
  - frequency: always
    type: batch
    runAs: localSystem
    content: |-
      echo Current date and time >> %SystemRoot%\Temp\test.log
      echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log
```

#### Base64 エンコード
<a name="user-data-base64-encoding"></a>

Amazon EC2 API または、ユーザーデータの base64 エンコーディングが実行されないツールを使用している場合、ユーザーデータを手動でエンコードする必要があります。エンコードしない場合、実行する `script` タグまたは `powershell` タグが見つからないというエラーが記録されます。Windows PowerShell を使用してエンコードする例を次に示します。

```
$UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))
```

PowerShell を使用してデコードする例を次に示します。

```
$Script = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData))
```

base64 エンコードの詳細については、[https://www.ietf.org/rfc/rfc4648.txt](https://www.ietf.org/rfc/rfc4648.txt)を参照してください。

### 圧縮ユーザーデータ
<a name="user-data-compressed"></a>

EC2Launch v2 は、IMDS が課す上限の 16 KB を超えるユーザーデータを送信する方法として、zip 形式のユーザーデータをサポートしています。この機能を使用するには、ユーザーデータスクリプトを `.zip` アーカイブに圧縮してから、EC2 インスタンスに渡します。EC2Launch v2 が圧縮されたユーザーデータを検出すると、圧縮されたユーザーデータスクリプトを自動的に解凍して実行します。

標準ユーザーデータと同様に、Amazon EC2 API、またはユーザーデータの base64 エンコーディングを実行しないツールを使用している場合は、圧縮されたユーザーデータを手動でエンコードする必要があります。ユーザーデータのサイズ制限と base64 エンコーディングの詳細については、「[EC2 インスタンスのインスタンスメタデータにアクセスする](instancedata-data-retrieval.md)」を参照してください。

### ユーザーデータの実行
<a name="user-data-execution"></a>

デフォルトでは、すべての AWS Windows AMI で初回起動時のユーザーデータの実行が有効になっています。次にインスタンスが再起動されたときにユーザーデータスクリプトが実行されるように指定できます。また、インスタンスが再起動するたびにユーザーデータスクリプトが実行されるように指定することもできます。

**注記**  
ユーザーデータは、初期起動後にデフォルトで実行するように有効化されていません。インスタンスを再起動または起動したときにユーザーデータが実行できるようにするには、「[その後の再起動または起動時にスクリプトを実行する](#user-data-scripts-subsequent)」を参照してください。

ユーザーデータスクリプトは、ランダムなパスワードが生成されたときにローカル管理者アカウントから実行されます。それ以外の場合、ユーザーデータスクリプトはシステムアカウントから実行されます。

#### インスタンス起動スクリプト
<a name="user-data-scripts-launch"></a>

インスタンスユーザーデータ内のスクリプトは、インスタンスの最初の起動時に実行されます。`persist` タグが見つかった場合は、その後の再起動または開始時にユーザーデータの実行が有効になります。EC2Launch v2、EC2Launch、EC2Config のログファイルには、標準出力ストリームと標準エラーストリームの出力が含まれています。

**EC2Launch v2**  
EC2Launch v2 のログファイルは `C:\ProgramData\Amazon\EC2Launch\log\agent.log` です。

**注記**  
`C:\ProgramData` フォルダは非表示になっている場合があります。このフォルダを表示するには、非表示のファイルおよびフォルダを表示する必要があります。

ユーザーデータが実行されると、次の情報が記録されます。
+ `Info: Converting user-data to yaml format` – ユーザーデータが XML 形式で提供されているか
+ `Info: Initialize user-data state` – ユーザーデータ実行の開始
+ `Info: Frequency is: always` – ブートのたびにユーザーデータタスクが実行されているか
+ `Info: Frequency is: once` – ユーザーデータタスク実行は一度だけか
+ `Stage: postReadyUserData execution completed` – ユーザーデータの実行の終了

**EC2Launch**  
EC2Launch のログファイルは `C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log` です。

`C:\ProgramData` フォルダは非表示になっている場合があります。このフォルダを表示するには、非表示のファイルおよびフォルダを表示する必要があります。

ユーザーデータが実行されると、次の情報が記録されます。
+ `Userdata execution begins` – ユーザーデータ実行の開始
+ `<persist> tag was provided: true` – 永続タグが見つかったか
+ `Running userdata on every boot` – 永続タグが見つかったか
+ `<powershell> tag was provided.. running powershell content` – PowerShell タグが見つかったか
+ `<script> tag was provided.. running script content` – スクリプトタグが見つかったか
+ `Message: The output from user scripts` – 実行されたユーザーデータスクリプトがあり、その出力が記録されたか

**EC2Config**  
EC2Config のログファイルは `C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2Config.log` です。ユーザーデータが実行されると、次の情報が記録されます。
+ `Ec2HandleUserData: Message: Start running user scripts` – ユーザーデータ実行の開始
+ `Ec2HandleUserData: Message: Re-enabled userdata execution` – 永続タグが見つかったか
+ `Ec2HandleUserData: Message: Could not find <persist> and </persist>` – 永続タグが見つからなかったのか
+ `Ec2HandleUserData: Message: The output from user scripts` – 実行されたユーザーデータスクリプトがあり、その出力が記録されたか

#### その後の再起動または起動時にスクリプトを実行する
<a name="user-data-scripts-subsequent"></a>

インスタンスのユーザー データを更新すると、次回インスタンスを再起動または起動したときに、更新されたユーザーデータコンテンツがインスタンスメタデータに自動的に反映されます。ただし、インストールされている起動エージェントによっては、その後の再起動または起動時にユーザー データ スクリプトを実行するように構成するための追加の設定が必要になる場合があります。

[**Shutdown with Sysprep (Sysprep でシャットダウン)**] オプションを選択すると、以降のインスタンスの起動時や再起動時にユーザーデータの実行を有効にしなくても、次回の起動時や再起動時にユーザーデータスクリプトが実行されます。

ユーザーデータの実行を有効にする手順については、起動エージェントに一致するタブを選択して確認してください。

------
#### [ EC2Launch v2 ]

EC2Launch v1 とは異なり、EC2Launch v2 は起動のたびにユーザー データ タスクを評価します。ユーザーデータタスクを手動でスケジュールする必要はありません。ユーザーデータは、含まれている頻度または永続オプションに基づいて実行されます。

XML ユーザーデータスクリプトの場合  
起動のたびにユーザーデータスクリプトを実行するには、ユーザーデータに `<persist>true</persist>` フラグを追加します。永続フラグが含まれていない場合、ユーザーデータスクリプトは最初の起動時にのみ実行されます。

YAML ユーザーデータの場合  
+ 最初の起動時にユーザーデータでタスクを実行するには、タスク `frequency` を `once` に設定します。
+ 起動するたびにユーザーデータ内のタスクを実行するには、タスク `frequency` を `always` に設定します。

------
#### [ EC2Launch ]

1. Windows インスタンスに接続します。

1. PowerShell コマンドウィンドウを開き、次のいずれかのコマンドを実行します。

**1 回実行する**  
次回の起動時にユーザーデータを 1 回実行するには、`-Schedule` フラグを使用します。

   ```
   C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -Schedule
   ```

**以降のすべての起動時に実行する**  
以降のすべての起動時にユーザー データを実行するには、 `-SchedulePerBoot` フラグを使用します。

   ```
   C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -SchedulePerBoot
   ```

1. Windows インスタンスから切断します。次にインスタンスを起動するときに更新されたスクリプトを実行するには、インスタンスを停止してユーザーデータを更新します。

------
#### [ EC2Config ]

1. Windows インスタンスに接続します。

1. `C:\Program Files\Amazon\Ec2ConfigService\Ec2ConfigServiceSetting.exe` を開く。

1. [**ユーザーデータ**] で、[**Enable UserData execution for next service start (次のサービス開始でユーザーデータの実行を有効にする)**] を選択してください。

1. Windows インスタンスから切断します。次にインスタンスを起動するときに更新されたスクリプトを実行するには、インスタンスを停止してユーザーデータを更新します。

------

### ユーザーデータと Windows PowerShell用ツール
<a name="user-data-powershell"></a>

Windows PowerShell用ツール を使用して、インスタンスのユーザーデータを指定、変更、表示することができます。インスタンスのメタデータを使用して、インスタンスからユーザーデータを表示する方法については、[EC2 インスタンスのインスタンスメタデータにアクセスする](instancedata-data-retrieval.md)を参照してください。ユーザーデータと AWS CLI の詳細については、「[ユーザーデータと AWS CLI](#user-data-api-cli)」を参照してください。

**例: 起動時にインスタンスユーザーデータを指定する**  
インスタンスユーザーデータを含むテキストファイルを作成します。インスタンスを再起動または起動するたびにユーザーデータスクリプトを実行するには、次の例に示すように `<persist>true</persist>` をユーザーデータに追加します。

```
<powershell>
    $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

インスタンスの起動時にインスタンスユーザーデータを指定するには、[New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) コマンドを使用します。このコマンドは、ユーザーデータの base64 エンコードを実行しません。次のコマンドを使用して、`script.txt` という名前のテキストファイルにユーザーデータをエンコードします。

```
PS C:\> $Script = Get-Content -Raw script.txt
PS C:\> $UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))
```

`-UserData` パラメータを使用して、ユーザーデータを **New-EC2Instance** コマンドに渡します。

```
PS C:\> New-EC2Instance -ImageId ami-abcd1234 -MinCount 1 -MaxCount 1 -InstanceType m3.medium \
    -KeyName my-key-pair -SubnetId subnet-12345678 -SecurityGroupIds sg-1a2b3c4d \
    -UserData $UserData
```

**例: 停止したインスタンスのインスタンスユーザーデータを更新する**  
停止したインスタンスのユーザーデータは、[Edit-EC2InstanceAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceAttribute.html) コマンドを使用して変更できます。

新しいスクリプトを使用してテキストファイルを作成します。次のコマンドを使用して、`new-script.txt` という名前のテキストファイルにユーザーデータをエンコードします。

```
PS C:\> $NewScript = Get-Content -Raw new-script.txt
PS C:\> $NewUserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($NewScript))
```

`-UserData` および `-Value` パラメータを使用して、ユーザーデータを指定します。

```
PS C:\> Edit-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData -Value $NewUserData
```

**例: インスタンスユーザーデータを表示する**  
インスタンスのユーザーデータを取得するには、[Get-EC2InstanceAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceAttribute.html) コマンドを使用します。

```
PS C:\> (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData
```

以下は出力の例です。ユーザーデータはエンコードされていることに注意してください。

```
PHBvd2Vyc2hlbGw+DQpSZW5hbWUtQ29tcHV0ZXIgLU5ld05hbWUgdXNlci1kYXRhLXRlc3QNCjwvcG93ZXJzaGVsbD4=
```

次のコマンドを使用して、エンコードされたユーザーデータを変数に格納し、それをデコードします。

```
PS C:\> $UserData_encoded = (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData
PS C:\> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData_encoded))
```

以下は出力の例です。

```
<powershell>
    $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
    New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

**例: タグ値と合うようにインスタンスの名前を変更する**  
[Get-EC2Tag](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Tag.html) コマンドを使用してタグ値を読み出し、タグ値と一致するように最初の起動時にインスタンスの名前を変更して、再起動することができます。タグ情報は API コールで取得されるため、このコマンドを適切に実行するには、`ec2:DescribeTags` アクセス許可が付与されているロールがインスタンスにアタッチされている必要があります。IAM ロールを使用した設定のアクセス許可の詳細については、「[インスタンスへの IAM ロールのアタッチ](attach-iam-role.md)」を参照してください。

------
#### [ IMDSv2 ]

```
<powershell>
    [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri 'http://169.254.169.254/latest/api/token' -UseBasicParsing
    $instanceId = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri 'http://169.254.169.254/latest/meta-data/instance-id' -UseBasicParsing
	$nameValue = (Get-EC2Tag -Filter @{Name="resource-id";Value=$instanceid},@{Name="key";Value="Name"}).Value
	$pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$"
	#Verify Name Value satisfies best practices for Windows hostnames
	If ($nameValue -match $pattern) 
	    {Try
	        {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} 
	    Catch
	        {$ErrorMessage = $_.Exception.Message
	        Write-Output "Rename failed: $ErrorMessage"}}
	Else
	    {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"}
</powershell>
```

------
#### [ IMDSv1 ]

```
<powershell>
	$instanceId = (Invoke-WebRequest http://169.254.169.254/latest/meta-data/instance-id -UseBasicParsing).content
	$nameValue = (Get-EC2Tag -Filter @{Name="resource-id";Value=$instanceid},@{Name="key";Value="Name"}).Value
	$pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$"
	#Verify Name Value satisfies best practices for Windows hostnames
	If ($nameValue -match $pattern) 
	    {Try
	        {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} 
	    Catch
	        {$ErrorMessage = $_.Exception.Message
	        Write-Output "Rename failed: $ErrorMessage"}}
	Else
	    {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"}
</powershell>
```

------

インスタンスメタデータからタグにアクセスするようにインスタンスが設定されている場合は、インスタンスメタデータ内のタグを使用してインスタンスの名前を変更することもできます。詳細については、「[インスタンスメタデータを使用して EC2 インスタンスのタグを表示する](work-with-tags-in-IMDS.md)」を参照してください。

------
#### [ IMDSv2 ]

```
<powershell>
    [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri 'http://169.254.169.254/latest/api/token' -UseBasicParsing
	$nameValue = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri 'http://169.254.169.254/latest/meta-data/tags/instance/Name' -UseBasicParsing
	$pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$"
	#Verify Name Value satisfies best practices for Windows hostnames
	If ($nameValue -match $pattern) 
	    {Try
	        {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} 
	    Catch
	        {$ErrorMessage = $_.Exception.Message
	        Write-Output "Rename failed: $ErrorMessage"}}
	Else
	    {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"}
</powershell>
```

------
#### [ IMDSv1 ]

```
<powershell>
	$nameValue = Get-EC2InstanceMetadata -Path /tags/instance/Name
	$pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$"
	#Verify Name Value satisfies best practices for Windows hostnames
	If ($nameValue -match $pattern) 
	    {Try
	        {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} 
	    Catch
	        {$ErrorMessage = $_.Exception.Message
	        Write-Output "Rename failed: $ErrorMessage"}}
	Else
	    {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"}
</powershell>
```

------