[小ネタ] EC2インスタンスのEBSルートボリュームに自動でNameタグを付与する

2015.01.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。今回は小ネタを。
EBSはEC2インスタンスで使用するディスクボリュームのサービスで、インスタンス間で付け外ししたりインスタンスの削除時にボリュームを残すようにしたりといった、柔軟なボリューム管理が可能です。ただ、一旦インスタンスから外れてしまうと、どのボリュームを何に使っていたのかわからなくなってしまう恐れがあります。そうならないようボリュームにはNameタグとしてボリューム名を設定することができますが、EC2インスタンスのルートボリュームには既定でタグが付かないため、ついついボリューム名の設定を忘れてしまいがちです。

そこで今回は、インスタンス作成時に自動でルートボリュームにボリューム名を付与する方法をご紹介します。

仕組み

インスタンス起動時に、ユーザーデータとして後述の処理を実行するよう設定します。

  • EC2インスタンス自身のインスタンス名とインスタンスIDを調査
  • ルートボリュームのNameタグを追加

やること自体はさほど複雑ではありません。

動作要件、動作確認環境

  • インスタンスからインターネット(EC2 APIのエンドポイント)へ接続できること
  • AWS CLIがイントール済み
  • Amazon Linux 2014.09 HVMで動作確認

1. IAMロールの作成

インスタンスに紐づくEBSボリュームの取得とタグの設定はEC2 APIへのリクエストで実行します。それぞれのリクエストの実行許可をEC2インスタンスに与えるための以下のIAMロールを事前に作成します。既存のロールを利用する場合は、ロールに以下のStatementを追加しても良いでしょう。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:CreateTags"
      ],
      "Resource": "*"
    }
  ]
}

2. EC2インスタンスの作成

IAMロールができれば、準備完了です。EC2の管理画面から[Launch Instance]ボタンをクリックし、インスタンス作成ウィザードを表示します。今回はAmazon Linux AMI 2014.09.1 (HVM) - ami-4985b048(東京リージョン)を利用しますが、要件を満たす他のAMIでも問題ないでしょう。

インスタンスタイプを選択した次、[Step 3: Configure Instance Details]画面で、[IAM Role]から先ほど作成したロールを選択し、[User Data]に以下のデータをコピペします。

add-name-tag-to-root-volume01

#!/bin/bash
instance_id=`curl -s 169.254.169.254/latest/meta-data/instance-id`
az=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
region=${az%[a-z]}
instance_name=`aws ec2 describe-instances --output text --region $region --instance-ids $instance_id \
  --query 'Reservations[].Instances[].Tags[?Key==\`Name\`].Value'`
volume_id=`aws ec2 describe-instances     --output text --region $region --instance-ids $instance_id \
  --query 'Reservations[].Instances[].BlockDeviceMappings[?DeviceName==\`/dev/xvda\`].Ebs[].VolumeId'`
aws ec2 create-tags --region $region --resources $volume_id --tags Key=Name,Value=${instance_name}-${instance_id}-root

最後の行で、ボリューム名を{インスタンス名}-{インスタンスID}-rootの形式に設定していますが、好みのボリューム名に変更しても良いでしょう。あと、マルチバイト文字が通るかどうかは未検証ですので、日本語のインスタンス名は避けていただくのが安全です。今回はインスタンス名を、以下のように「ebs_add_tag_test」としてみました。

add-name-tag-to-root-volume02

3. 動作確認

Launch Wizardを完了し、インスタンスが起動するまで待ちます。画面左側のメニューから[Volumes]をクリックしEBSボリュームを確認します。しばらくすると、自動でボリューム名にインスタンス名を含む文字列が設定されました!

add-name-tag-to-root-volume03

まとめ

ボリューム名は手作業で設定することもできますが、Auto Scalingで作成されるインスタンスのルートボリュームを追跡したいという要件に応えるために考えた次第です。もちろん、Auto Scaling配下ではないインスタンスでも有効なやり方だと思います。EBSボリュームをラクして管理しましょう!

参考URL