EC2 user-data を使ってNAME Tagを設定する(Linux)
前提条件
- 今回は、EC2のName Tag をOSのスクリプトから設定する方法を紹介します。想定されるシチュエーションとしては、AMIからEC2 起動時にuser-data にスクリプトを組み込むことで一意のName Tag を設定します。
- スクリプトサンプルはLinux 版となります。aws cli および curl、jq が使用できる環境が前提です。
- Windows版のスクリプトサンプルは、下記記事を参照ください。
Linuxの場合
user-dataの設定方法
- Linuxでシェルスクリプトが動作することを確認し、EC2インスタンス作成時の「インスタンスの詳細の設定」にて「高度な詳細」のユーザーデータに貼り付けます。
- Linuxでのポイントは、シェバン(
#!
から始まる1行目)を忘れずに記載します。
スクリプトサンプル
- EC2のメタデータを使用してインスタンスID、プライベートIPを読み込み、aws cli を使用して、Name Tagの設定を行います(Name TagにプライベートIPを追記する)。
- 例:niikawa-test-Linux → niikawa-test-Linux-10.10.0.138
- スクリプトの実行前後で、Namt Tag は下記の様に更新されます。
- 以下、今回使用したスクリプトのサンプルです。EC2 起動時に、user-dataに指定します。
#!/bin/bash
TMPDIR=/tmp
# Instance IDを取得する
/usr/bin/curl 'http://169.254.169.254/latest/meta-data/instance-id' > ${TMPDIR}/instance-id.txt
# Private IPを取得する
/usr/bin/curl 'http://169.254.169.254/latest/meta-data/local-ipv4' > ${TMPDIR}/local-ipv4.txt
# NAME Tagを取得する
/usr/bin/aws ec2 describe-instances \
--query 'Reservations[].Instances[].{Name:Tags[?Key==`Name`].Value}' \
--filter "Name=instance-id,Values=`cat ${TMPDIR}/instance-id.txt`" \
--region ap-northeast-1 \
| /usr/bin/jq -r .[0].Name[0] > ${TMPDIR}/hostname.txt
# 変更後のNAME Tagを作成する
/usr/bin/echo `cat ${TMPDIR}/hostname.txt`-`cat ${TMPDIR}/local-ipv4.txt` > ${TMPDIR}/new-hostname.txt
# NAME Tagを更新する
/usr/bin/aws ec2 create-tags --resources `cat ${TMPDIR}/instance-id.txt` --tags Key=Name,Value=`cat ${TMPDIR}/new-hostname.txt` --region ap-northeast-1
user-dataが意図した通りに実行されない場合
- 先ず、bashシェルスクリプト単体でエラーなく、実行できることを調査します。
- EC2のroleに、EC2のFullAccess権限があることを確認します。
- EC2起動後、下記ファイルを確認し、user-dataがセットされているか否かを調べます。
- /var/lib/cloud/instance/user-data.txt
- 下記ログファイルを確認し、エラーの有無や調査の手がかりを見つけます。
- /var/log/cloud-init.log
- bashシェルスクリプトにデバッグを追加し、どのステップで問題が起きたかを調べます。
参考資料
- 今回のスクリプトでは、EC2のメタデータを読み込み、EC2のInstance IDやPrivate IPを取得しています。LinuxおよびWindowsでメタデータを読み込む方法は、下記の記事を参考にしてください。