AWS CLIを使って、よく発生する作業リスト作成作業を効率化したい。
また、なんとかManagement Consoleに頼るのをやめたい。
使い慣れるために、発生しそうな作業を色々と試してみた。
####環境
Mac OS X 10.9.5
Python 2.7.5
aws-cli 1.5.1
##ホスト名(Nameタグ)取得方法
まずはインスタンスの一覧を取得。
自分の場合、ホスト名はNameタグに登録しておくことが多いので、describe-tags から取得。
Nameタグだけ取れてもあまり役に立たないので、インスタンスIDも一緒に取ってみる。
--query
オプションを使うと、返却する要素のselectと、フィルタ条件を付けられる。
ここでは、ResourceTypeが "instance" の インスタンスIDとNameタグ(タグKeyが"Name")を取得。
$ aws ec2 describe-tags --query 'Tags[?ResourceType==`instance`] | [?Key==`Name`].{ResourceId:ResourceId,ResourceName:Value}'
(結果)
[
{
"ResourceId": "i-xxxxxxx",
"ResourceName": "hoge1"
},
{
"ResourceId": "i-xxxxxxx",
"ResourceName": "hoge2"
},
]
##ホスト名とIPの一覧を取得
こうなると、IPも一緒に取りたい。
ということで、describe-instance からとってみることにする。
パブリックIP,プライベートIP,インスタンスID,Nameタグの値を取得する。
[?~]
で条件を書くことで、絞り込みが可能。
$ aws ec2 describe-instances --query 'Reservations[].Instances[].{PublicIp:PublicIpAddress,PrivateIp:PrivateIpAddress,InstanceId:InstanceId,Name:Tags[?Key==`Name`].Value}'
(結果)
[
{
"PublicIp": "x.x.x.1",
"InstanceId": "i-xxxxxxxx",
"Name": [
"hoge1"
],
"PrivateIp": "10.x.x.1"
},
{
"PublicIp": "x.x.x.2",
"InstanceId": "i-xxxxxxxx",
"Name": [
"hoge2"
],
"PrivateIp": "10.x.x.2"
},
{
"PublicIp": null,
"InstanceId": "i-xxxxxxxx",
"Name": [],
"PrivateIp": null
}
]
こんな感じで拾える。
Nameタグを登録していないインスタンスを省く場合は、
not_null
関数を組み合わせて、
Name:Tags[?Key==`Name`].Value
の部分を
↓
Name:Tags[?Key==`Name`] | [?not_null(Value)].Value}
とすればOK。
また、--output
オプションをつけると、タブ区切りのテキストで返してくれる。
これは便利、と思ったが・・・
i-xxxxxxxx 10.x.x.1 x.x.x.1
NAME hoge1
i-xxxxxxxx 10.x.x.2 x.x.x.2
NAME hoge2
困ったことに、階層の違う要素が同じ行に出力されず、なんとも扱いにくい感じに。
うーん。誰か解決方法知りませんか。
今後の課題。
##参考にしたサイトなど
AWS CLIのセットアップに関してはこちら。
http://dev.classmethod.jp/cloud/aws-command-line-tool-python/
--query
オプションの使い方
http://dev.classmethod.jp/etc/aws-cli-query/
http://dev.classmethod.jp/cloud/awscli-enhanced-query-opt-snipets/
--query
オプションの書式は、JMESPathというbotoのライブラリによるもの。なのでこちらも参考。
http://jmespath.readthedocs.org/en/latest/index.html
jq というJSON整形ツールの説明。
http://dev.classmethod.jp/tool/jq-manual-japanese-translation-roughly/
(最初こちらを調べようとしていたら、既に--query
オプションだけで事足りつつある、
とのことだったのでサンプル程度でやめました。)
公式ドキュメントでも一応。
◆AWS Command Line Interface User Guide
http://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html