EC2 user-data を使ってNAME Tagを設定する(Linux)

2019-09-25

前提条件

  • 今回は、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-Linuxniikawa-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でメタデータを読み込む方法は、下記の記事を参考にしてください。

AWS, bash, CentOS, EC2

Posted by takaaki