この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
よく訓練されたアップル信者、都元です。EC2をはじめとする大部分のAWSリソースには「タグ」というキー・バリュー形式の情報を付与できるのはご存知の通りです。このタグ情報に基いて課金額等を分類したり、まぁ色々な使い方があります。
が、Beanstalkが起動するEC2インスタンスに対して任意のタグを付けることは、Beanstalkの機能としては提供されていません。
.ebextensions
ところで、Elastic Beanstalkには、アプリケーションデプロイのタイミングで、インスタンス上で任意のコマンドを実行する仕組みがあります。.ebextensionsです。Beanstalkのアプリケーションバンドル *1直下に.ebextensionsというディレクトリを作り、その中に拡張子.configが付いた設定ファイルを配置することで制御します。
この仕組みを使って、デプロイのタイミングで自分自身のEC2インスタンスに、任意のタグを付与してしまおう、というのが本稿のテクニックです。
APIを叩くのでRole必須
まず、この仕組みはEC2のタグ付与を行います。つまりec2:CreateTags APIを叩きますので、EC2インスタンスにはこのアクションを許可したIAM Roleを付与しておく必要があります。付与の方法はAWS Elastic BeanstalkがIAMRoleに対応したようですを参考に。
Beanstalkのoption settingとしてはこんなかんじですね。
{
"Namespace" : "aws:autoscaling:launchconfiguration",
"OptionName" : "IamInstanceProfile",
"Value" : "..."
}
.ebextensionsファイル
その上で、アプリケーションバンドル内の.ebextensions/ec2instancetag.configとして下記のようなYAMLファイルを配置します。
packages:
yum:
jq: []
commands:
add-tags:
command: >-
aws ec2 create-tags
--region $(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r ".region")
--resources $(curl -s http://169.254.169.254/latest/meta-data/instance-id)
--tags Key=foo,Value=bar
順に解説していきましょう。
まず1〜3行目ですが、jqを使いたいのでyumでインストールしてます。
続いてcommandsディレクティブ(下記フォーマット)で実行したいコマンドを記述します。arbitraly-nameの部分は任意の名前で置き換えましょう。また、some commandの部分が「実行したいコマンド」です。例のように複数コマンドを書くことも可能です。
commands:
arbitraly-name-1:
command: some comannd 1
arbitraly-name-2:
command: some comannd 2
で、この例では非常にコマンドが長いので、複数行に分割しました。文字列の開始部分に>-を配置して次の行をインデントすると、同じインデントの深さで続く行を空白文字区切りで接続してくれます。これはBeanstalkの機能というより、YAMLの機能ですね。
あとは、引数として渡したい「リージョン名」や「自己インスタンスID」等を、169.254.169.254から取り出しています。
以上により、EC2インスタンスに対するタグで、fooというキーに対してbarという値が設定されます。
脚注
- アプリケーションをzipで固めたもの。Javaであればwar、PHPであればソースをzipで固めたもの。 ↩