batchiです。
タイトルの通りです。
Auto Scalingグループによって自動的に増えたり減ったりするEC2インスタンス。
EC2インスタンス自体のタグに関しては、
Auto Scalingグループに付与したタグと同じものを自動的に付与させる設定があります。
でもそのEC2インスタンスにアタッチされているEBSにはタグはつかない。
つけたい。
どうしたらいいですか。
AWSサポートからの回答
「同じような要望をたくさんもらってます」
「Feature Requestとして要望中です」
「実装可否や実装時期についてはお答えできません」
「現時点で実装するなら、以下のいずれかでやってください」
・起動設定にユーザーデータ仕込む
・ライフサイクルフックを使う
というわけで、ユーザーデータを仕込むパターンを選択しました。
実装
参考にしたのはクラスメソッドさんの以下の記事。
[小ネタ] EC2インスタンスのEBSルートボリュームに自動でNameタグを付与する
http://dev.classmethod.jp/cloud/add-name-tag-to-root-volume/
カスタマイズしたのは以下のあたり。
・AWS CLIのインストールもユーザーデータで実施する
・タグを複数付与する
・ブロックデバイス名を変更
・インスタンス作成時でなくAuto Scaling起動設定に仕込む
・タグの値にインスタンス名は含めないので変数instance_nameはカット
結果、こうなりました。
#!/bin/bash
#AWS CLIのインストール
curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py
pip install awscli
#各種変数の定義
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]}
volume_id=`aws ec2 describe-instances --output text --region $region --instance-ids $instance_id \
--query 'Reservations[].Instances[].BlockDeviceMappings[?DeviceName==\`/dev/sda1\`].Ebs[].VolumeId'`
#タグ付与
aws ec2 create-tags --region $region --resources $volume_id --tags Key=Name,Value=<Nameタグの値> Key=System,Value=<Systemタグの値>
AWS CLIはインストールした状態でAMIを取得してから
起動設定を作成するのが自然だろうと思いますが、
なるたけAMIおよび起動設定をいじりたくなかったのと、
インストールにかかった時間を計測したら数秒程度だったので、そのままにしました。
少しだけわからなかったところ
変数volume_idを取得している箇所で、
–query以降をなんであんな書き方するの?というのがパッとは理解できず。
(Reservationsとか何のために書いてるの?)
–outputをtable形式にするとすんなり理解できました。
(jsonに親しんでいる人はjsonのほうがいいと思います。)
>aws ec2 describe-instances --output table --instance-ids <インスタンスID>
出力結果は階層構造になっていて、
お目当ての「VolumeId」に至るまでの、
上位の階層も書いてあげないとダメというわけでした。
以下、無駄に長い出力結果です。
-------------------------------------------------------------------------------- | DescribeInstances | +------------------------------------------------------------------------------+ || Reservations || |+-------------------------------+--------------------------------------------+| || OwnerId | 13xxxxx31447 || || ReservationId | r-03a26xxxx77df49cc || |+-------------------------------+--------------------------------------------+| ||| Instances ||| ||+------------------------+-------------------------------------------------+|| ||| AmiLaunchIndex | 0 ||| ||| Architecture | x86_64 ||| ||| ClientToken | alfAo1496209729199 ||| ||| EbsOptimized | False ||| ||| Hypervisor | xen ||| ||| ImageId | ami-249fad43 ||| ||| InstanceId | i-0cd43xxxxx6953268 ||| ||| InstanceType | t2.micro ||| ||| KeyName | aws_shared_key_tokyo ||| ||| LaunchTime | 2017-07-26T00:35:27.000Z ||| ||| Platform | windows ||| ||| PrivateDnsName | ip-10-5-1-210.ap-northeast-1.compute.internal ||| ||| PrivateIpAddress | 10.5.1.210 ||| ||| PublicDnsName | ||| ||| PublicIpAddress | 54.xx.84.xxx ||| ||| RootDeviceName | /dev/sda1 ||| ||| RootDeviceType | ebs ||| ||| SourceDestCheck | True ||| ||| StateTransitionReason | User initiated (2017-07-26 15:00:06 GMT) ||| ||| SubnetId | subnet-91axxxxx ||| ||| VirtualizationType | hvm ||| ||| VpcId | vpc-dxxxxxbc ||| ||+------------------------+-------------------------------------------------+|| |||| BlockDeviceMappings |||| |||+------------------------------------+-----------------------------------+||| |||| DeviceName | /dev/sda1 |||| |||+------------------------------------+-----------------------------------+||| ||||| Ebs ||||| ||||+------------------------------+---------------------------------------+|||| ||||| AttachTime | 2017-05-31T05:48:51.000Z ||||| ||||| DeleteOnTermination | True ||||| ||||| Status | attached ||||| ||||| VolumeId | vol-00cxxxxxb03bfb5c8 ||||| ||||+------------------------------+---------------------------------------+|||| |||| Monitoring |||| |||+------------------------------+-----------------------------------------+||| |||| State | disabled |||| |||+------------------------------+-----------------------------------------+||| |||| NetworkInterfaces |||| |||+------------------------------+-----------------------------------------+||| |||| Description | Primary network interface |||| |||| MacAddress | 06:cc:05:12:ba:2b |||| |||| NetworkInterfaceId | eni-xxxxaabe |||| |||| OwnerId | 1xxxxxxxx447 |||| |||| PrivateIpAddress | 10.5.1.210 |||| |||| SourceDestCheck | True |||| |||| Status | in-use |||| |||| SubnetId | subnet-9xxxxxe6 |||| |||| VpcId | vpc-xxxxxxbc |||| |||+------------------------------+-----------------------------------------+||| ||||| Association ||||| ||||+-----------------------------------+----------------------------------+|||| ||||| IpOwnerId | 133285731447 ||||| ||||| PublicDnsName | ||||| ||||| PublicIp | 54.xx.84.xxx ||||| ||||+-----------------------------------+----------------------------------+|||| ||||| Attachment ||||| ||||+------------------------------+---------------------------------------+|||| ||||| AttachTime | 2017-05-31T05:48:50.000Z ||||| ||||| AttachmentId | eni-attach-5450dbbc ||||| ||||| DeleteOnTermination | True ||||| ||||| DeviceIndex | 0 ||||| ||||| Status | attached ||||| ||||+------------------------------+---------------------------------------+|||| ||||| Groups ||||| ||||+------------------------+---------------------------------------------+|||| ||||| GroupId | GroupName ||||| ||||+------------------------+---------------------------------------------+|||| ||||| sg-dcxxxxb8 | testxxxxavpc-internal ||||| ||||| sg-e0xxxx84 | testxxxxavpc-22_from ||||| ||||+------------------------+---------------------------------------------+|||| ||||| PrivateIpAddresses ||||| ||||+----------------------------------------+-----------------------------+|||| ||||| Primary | True ||||| ||||| PrivateIpAddress | 10.5.1.210 ||||| ||||+----------------------------------------+-----------------------------+|||| |||||| Association |||||| |||||+----------------------------------+---------------------------------+||||| |||||| IpOwnerId | 13xxxxxxxcx7 |||||| |||||| PublicDnsName | |||||| |||||| PublicIp | 54.xx.84.xxx |||||| |||||+----------------------------------+---------------------------------+||||| |||| NetworkInterfaces |||| |||+------------------------------------+-----------------------------------+||| |||| Description | |||| |||| MacAddress | 06:ec:04:91:0b:9d |||| |||| NetworkInterfaceId | eni-8bxxxxc5 |||| |||| OwnerId | 133285731447 |||| |||| PrivateIpAddress | 10.5.3.222 |||| |||| SourceDestCheck | True |||| |||| Status | in-use |||| |||| SubnetId | subnet-7xxxxxx6 |||| |||| VpcId | vpc-xxxxxxxc |||| |||+------------------------------------+-----------------------------------+||| ||||| Attachment ||||| ||||+------------------------------+---------------------------------------+|||| ||||| AttachTime | 2017-05-31T08:11:05.000Z ||||| ||||| AttachmentId | eni-attach-83xxxxxb ||||| ||||| DeleteOnTermination | False ||||| ||||| DeviceIndex | 1 ||||| ||||| Status | attached ||||| ||||+------------------------------+---------------------------------------+|||| ||||| Groups ||||| ||||+------------------------+---------------------------------------------+|||| ||||| GroupId | GroupName ||||| ||||+------------------------+---------------------------------------------+|||| ||||| sg-dcdb40b8 | testxxxxavpc-internal ||||| ||||| sg-e05ac084 | testxxxxavpc-22_fromINF ||||| ||||+------------------------+---------------------------------------------+|||| ||||| PrivateIpAddresses ||||| ||||+----------------------------------------+-----------------------------+|||| ||||| Primary | True ||||| ||||| PrivateIpAddress | 10.5.3.222 ||||| ||||+----------------------------------------+-----------------------------+|||| |||| Placement |||| |||+------------------------------------+-----------------------------------+||| |||| AvailabilityZone | ap-northeast-1a |||| |||| GroupName | |||| |||| Tenancy | default |||| |||+------------------------------------+-----------------------------------+||| |||| SecurityGroups |||| |||+------------------------+-----------------------------------------------+||| |||| GroupId | GroupName |||| |||+------------------------+-----------------------------------------------+||| |||| sg-dcdb40b8 | tesxxxxxavpc-internal |||| |||| sg-e05ac084 | testxxxxavpc-22_fromINF |||| |||+------------------------+-----------------------------------------------+||| |||| State |||| |||+-----------------------------+------------------------------------------+||| |||| Code | 80 |||| |||| Name | stopped |||| |||+-----------------------------+------------------------------------------+||| |||| StateReason |||| |||+----------+-------------------------------------------------------------+||| |||| Code | Client.UserInitiatedShutdown |||| |||| Message | Client.UserInitiatedShutdown: User initiated shutdown |||| |||+----------+-------------------------------------------------------------+||| |||| Tags |||| |||+--------------------+---------------------------------------------------+||| |||| Key | Name |||| |||| Value | testxxxxa-member1 |||| |||+--------------------+---------------------------------------------------+|||
蛇足
以下、お遊びで以下のユーザーデータも試してみました。
#!/bin/bash
#AWS CLIのインストール
curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py
pip install awscli
#各種変数の定義
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]}
volume_id=`aws ec2 describe-instances --output text --region $region --instance-ids $instance_id \
--query 'Reservations[].Instances[].BlockDeviceMappings[?DeviceName==\`/dev/sda1\`].Ebs[].VolumeId'`
date=`date`
#タグ付与
aws ec2 create-tags --region $region --resources $volume_id --tags Key=Name,Value=<Nameタグの値> Key=System,Value=<Systemタグの値> Key=Date,Value="$date"
ユーザーデータが実行された時刻をタグとしてつけてしまおうというものです。
Auto Scalingグループのコンソール画面では、
履歴からインスタンスのローンチが行われた時刻が確認できます。
それとこのタグを比較すると…
ローンチ開始から50秒程度後にユーザーデータが実行されているようでした。
(あくまで私が試した環境において。)
なるほど。と思いました。
以上です。