BLOGサブスレッドの日常

2016.04.19

EC2へのSSH接続を簡単にしたい! (3)名前をつけてやる

mzsm

株式会社サブスレッドのみずしま a.k.a mzsm(@mzsm_j)です。こんにちは。

この記事は前回の続きになります。

前回は、EC2で起動している各インスタンスのIDとパブリックホスト名、それとキーペア名を取得して表示するところまででした。

ここからは、各インスタンスに対して、人間にとってわかりやすい記号をつけるにはどうすればよいかということです。

タグの情報を取得してみる

ていうか見出しで答えが出てるんですが、タグを使います。
各インスタンスに対して、任意のタグと値を自由に登録できます。

インスタンスに登録したタグの情報は、次のような形式で取得できます。

>>> (省略)
>>> resp = client.describe_instances(
...   Filters=[{'Name': 'instance-state-code',
...             'Values': ['16']}]
...  )
>>> import pprint
>>> pprint.pprint(resp)
{'Reservations': [{'Groups': [],
                   'Instances': [{'AmiLaunchIndex': 0,
                                  : (省略)
                                  'Tags': [{'Key': 'Role',
                                            'Value': 'prod'},
                                           {'Key': 'HostAlias',
                                            'Value': 'prod-1'},
                                           {'Key': 'Name', 'Value': '商用1'}],
                                  : (省略)
                                  'VpcId': 'vpc-00000000'}],
                   'OwnerId': '000000000000'},
                  {'Groups': [],
                   'Instances': [{'AmiLaunchIndex': 0,
                                  : (省略)
                                  'Tags': [{'Key': 'Role',
                                            'Value': 'test'},
                                           {'Key': 'HostAlias',
                                            'Value': 'test-2'},
                                           {'Key': 'Name', 'Value': '受入2'}],
                                  : (省略)
                                  'VpcId': 'vpc-00000000'}],
                   'OwnerId': '000000000000'},
                  : (省略)
                  {'Groups': [],
                   'Instances': [{'AmiLaunchIndex': 0,
                                  : (省略)
                                  'Tags': [{'Key': 'Role',
                                            'Value': 'test'},
                                           {'Key': 'HostAlias',
                                            'Value': 'dev-1'},
                                           {'Key': 'Name', 'Value': '開発'}],
                                  : (省略)
                                  'VpcId': 'vpc-00000000'}],
                   'OwnerId': '000000000000'}],
 'ResponseMetadata': {'HTTPStatusCode': 200,
                      'RequestId': '00000000-0000-0000-0000-000000000000'}}

{'Key': 文字列, 'Value': 文字列}という形式のディクショナリのリストの形式で格納されています。
ディクショナリで格納されているほうがPythonで扱うには都合がいいのですが、それは諦めましょう。

ここではHostAliasというタグ名で、SSH接続に使う名前を登録しています。

そしてループをぶん回せば…

>>> for resv in resp['Reservations']:
...   for instance in resv['Instances']:
...     tags = {tag['Key']: tag['Value'] for tag in instance['Tags']}
...     print('Host eigyo-kaizen-' + tags.get('HostName'))
...     print('    HostName ' + instance['PublicDnsName'])
...
Host eigyo-kaizen-prod-1
    HostName  ec2-203-0-113-23.ap-northeast-1.compute.amazonaws.com
Host eigyo-kaizen-test-2
    HostName  ec2-203-0-113-179.ap-northeast-1.compute.amazonaws.com
Host eigyo-kaizen-test-1
    HostName  ec2-203-0-113-10.ap-northeast-1.compute.amazonaws.com
Host eigyo-kaizen-prod-2
    HostName  ec2-203-0-113-205.ap-northeast-1.compute.amazonaws.com
Host eigyo-kaizen-dev-1
    HostName  ec2-203-0-113-200.ap-northeast-1.compute.amazonaws.com

初回~/.ssh/configで書き込んだのとほぼ同じ内容の文字列を生成できました!

この次はどうする?

今回までで、~/.ssh/configに必要な情報をプログラムから取得することができるようになりました。

次回から、これらの情報を使って~/.ssh/configを自動的に書き換えるプログラムを作っていくことにします。

…というわけで、次回に続きます。

この記事を書いた人

mzsm