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秒程度後にユーザーデータが実行されているようでした。

(あくまで私が試した環境において。)

なるほど。と思いました。
以上です。

TOP