第9回:ネットワークに関するEucalyptusのAPI
前回はインスタンス操作に関するAPIについて説明しました。今回は、ElasticIPとセキュリティグループの操作に関するAPIを呼び出すプログラミングを説明します。今回もbotoとRightAwsを使用しますので、基本的な使い方は第8回を参照してください。
■ElasticIPを操作するAPI
ElasticIPを操作するAPIには下記の5つのAPIがあり、ElasticIPを確保・解放するAPIと、現在確保しているElasticIPの一覧を取得するAPIと、ElasticIPをインスタンスに取り付け・取り外すAPIがあります。
API | 説明 |
CreateSecurityGroup | セキュリティグループを作成するAPI |
DeleteSecurityGroup | セキュリティグループを削除するAPI |
DescribeSecurityGroups | 作成済みのセキュリティグループの一覧を取得するAPI |
AuthorizeSecurityGroupIngress | セキュリティグループにルールを追加するAPI |
RevokeSecurityGroupIngress | セキュリティグループからルールを削除するAPI |
■ElasticIPを確保する
ElasticIPを確保するためには、AllocateAddressを使います。AllocateAddress APIを呼び出す際のパラメータはありません。
address = connection.allocate_address() print address.public_ip |
# 戻り値は取得できたElasticIPの文字列が返る elastic_ip = @ec2.allocate_address |
■ElasticIPを解放する
確保したElasticIPを解放するためには、ReleaseAddressを使います。ReleaseAddress APIを呼び出す際のパラメータとして、確保しているElasticIP群に含まれているアドレスを指定しなければなりません。
# 戻り値はTrue/Falseが返る return_code = connection.release_address("192.0.2.100") |
# 戻り値はTrue/Falseが返る result = @ec2.release_address('192.0.2.100') |
■ElasticIPの一覧を取得する
確保したElasticIPの一覧を取得するためには、DescribeAddressesを使います。DescribeAddresses APIを呼び出す際のパラメータとして、確保しているElasticIPを指定することができますが、Eucalyptusの場合はパラメータを指定していても指定していなくとも、現在そのユーザが確保しているElasticIPの一覧が返ります。
addresses = connection.get_all_addresses() for address in addresses: print address.public_ip, address.instance_id |
elastic_ips = @ec2.describe_addresses # インスタンスへ取り付けられている場合はインスタンスIDの情報も返る pp elastic_ips [{:public_ip=>"192.0.2.124"}, {:public_ip=>"192.0.2.125", :instance_id=>"i-38720688"}, {:public_ip=>"192.0.2.126"}, {:public_ip=>"192.0.2.127"}] |
■ElasticIPをインスタンスに取り付ける
確保したElasticIPをインスタンスに取り付けるためには、AssociateAddressを使います。AssociateAddress APIを呼び出す際のパラメータには確保したElasticIPのアドレスとインスタンスIDを指定します。
# 戻り値はTrue/Falseが返る return_code = connection.associate_address('i-38720688', '192.0.2.125') |
【RightAwsでのAssociateAddress】
# 戻り値はTrue/Falseが返る result = @ec2.associate_address('i-38720688', '192.0.2.125') |
■ElasticIPをインスタンスから取り外す
取り付けたElasticIPをインスタンスから取り外すためには、DisassociateAddressを使います。DisassociateAddress APIを呼び出す際のパラメータにはElasticIPのアドレスを指定します。
# 戻り値はTrue/Falseが返る return_code = connection.disassociate_address('192.0.2.125') |
# 戻り値はTrue/Falseが返る result = @ec2.disassociate_address('192.0.2.125') |
■セキュリティグループを操作するAPI
セキュリティグループを操作するAPIには下記の5つのAPIがあり、セキュリティグループを作成・削除するAPIと、作成済みのセキュリティグループの一覧を取得するAPIと、セキュリティグループにルールを追加・削除するAPIがあります。
API | 説明 |
AllocateAddress | ElasticIPを1つ確保するAPI |
ReleaseAddress | 確保しているElasticIPを1つ解放するAPI |
DescribeAddresses | 確保しているElasticIPの一覧を取得するAPI |
AssociateAddress | 確保しているElasticIPをインスタンスに取り付けるAPI |
DisassociateAddress | インスタンスに取り付けているElasticIPを取り外すAPI |
■セキュリティグループを作成する
セキュリティグループを作成するためには、CreateSecurityGroupを使います。CreateSecurityGroup APIを呼び出す際のパラメータにはセキュリティグループ名とセキュリティグループの説明を指定します。なおセキュリティグループ名は必須ですが、RightAwsではセキュリティグループの説明を省略することが可能です。
group = connection.create_security_group('webapps', 'Allowing SSH, HTTP and HTTPS ingress') print group.name, group.description |
# 戻り値はTrue/Falseが返る result = @ec2.create_security_group('webapps', 'Allowing SSH, HTTP and HTTPS ingress') |
■セキュリティグループを削除する
セキュリティグループを削除するためには、DeleteSecurityGroupを使います。DeleteSecurityGroup APIを呼び出す際のパラメータにはセキュリティグループ名を指定します。
# 戻り値はTrue/Falseが返る return_code = connection.delete_security_group('webapps') |
# 戻り値はTrue/Falseが返る result = @ec2.delete_security_group('webapps') |
■セキュリティグループの一覧を取得する
セキュリティグループの一覧を取得するためには、DescribeSecurityGroupsを使います。DescribeSecurityGroups APIを呼び出す際のパラメータにはセキュリティグループ名を指定することができます。なお、パラメータを指定しない場合は、そのユーザのセキュリティグループの一覧が返ります。
groups = connection.get_all_security_groups() for group in groups: print group.owner_id, group.name, group.description for rule in group.rules: print rule.ip_protocol, rule.from_port, rule.to_port for grant in rule.grants: if grant.owner_id or grant.name: if grant.owner_id: print grant.owner_id if grant.name: print grant.name else: print grant.cidr_ip |
security_groups = @ec2.describe_security_groups(['default', 'webapps']) # 戻り値は以下のような情報が返る pp security_groups [{:aws_owner=>"vtaro", :aws_group_name=>"default", :aws_description=>"default group", :aws_perms=>[]}, {:aws_owner=>"vtaro", :aws_group_name=>"webapps", :aws_description=>"Allowing SSH, HTTP and HTTPS ingress", :aws_perms=> [{:from_port=>"22", :to_port=>"22", :protocol=>"tcp", :cidr_ips=>"192.0.2.0/24"}]}] |
■セキュリティグループにルールを追加する
セキュリティグループにルールを追加するためには、AuthorizeSecurityGroupIngressを使います。AuthorizeSecurityGroupIngressを呼び出す際のパラメータには以下のものがあります。
パラメータ | 説明 | 例 | 必須/任意 |
GroupName | ルールを追加するセキュリティグループ名を指定。 | webapps | 必須 |
IpProtocol | ルールで指定するプロトコル。tcpかudpかicmpを指定。 | tcp | 必須 |
FromPort | ルールで指定するポート番号。ポート番号を範囲で指定する場合は最小値を指定。tcp,udpの場合は1~65535まで指定でき、icmpの場合はタイプ番号を指定。icmpの場合は-1を指定すると全てのタイプ番号を指定。 | 22 | 必須 |
ToPort | ルールで指定するポート番号。ポート番号を範囲で指定する場合は最大値を指定。tcp,udpの場合は1~65535まで指定でき、icmpの場合はタイプ番号に応じたコード番号を指定。icmpの場合は-1を指定すると全てのコード番号を指定。 | 22 | 必須 |
CidrIp | ルールで接続を許可するネットワークのCIDRを指定。以下のUserIdとGroupNameを指定しない場合はこのパラメータは必須。 | 192.0.2.0/24 | 場合により必須 |
UserId | ルールで接続を許可するセキュリティグループのユーザID。CidrIpを指定しない場合はこのパラメータは必須。 | 012345678901 | 場合により必須 |
GroupName | ルールで接続を許可するセキュリティグループの名前。CidrIpを指定しない場合はこのパラメータは必須。 | default | 場合により必須 |
# CIDRを指定する場合 return_code = connection.authorize_security_group( group_name='webapps', ip_protocol='tcp', from_port=22, to_port=22, cidr_ip='192.0.2.0/24' ) # セキュリティグループを指定する場合 return_code = connection.authorize_security_group( group_name='webapps', src_security_group_owner_id='0000-0000-0000', src_security_group_name='default' ) |
# CIDRを指定する場合はauthorize_security_group_IP_ingress()を使用 result = @ec2.authorize_security_group_IP_ingress('webapps', 22, 22, 'tcp', '192.0.2.0/24') # セキュリティグループを指定する場合はauthorize_security_group_named_ingress()を使用 result = @ec2.authorize_security_group_named_ingress('webapps', '0000-0000-0000', 'default') |
■セキュリティグループからルールを削除する
セキュリティグループからルールを削除するためには、RevokeSecurityGroupIngressを使います。RevokeSecurityGroupIngressを呼び出す際のパラメータはAuthorizeSecurityGroupIngressと同じです。
# CIDRを指定する場合 return_code = connection.revoke_security_group( group_name='webapps', ip_protocol='tcp', from_port=22, to_port=22, cidr_ip='192.0.2.0/24' ) # セキュリティグループを指定する場合 return_code = connection.revoke_security_group( group_name='webapps', src_security_group_owner_id='0000-0000-0000', src_security_group_name='default' ) |
# CIDRを指定する場合はrevoke_security_group_IP_ingress()を使用 result = @ec2.revoke_security_group_IP_ingress('webapps', 22, 22, 'tcp', '192.0.2.0/24') # セキュリティグループを指定する場合はrevoke_security_group_named_ingress()を使用 result = @ec2.revoke_security_group_named_ingress('webapps', '0000-0000-0000', 'default') |
■RightAws固有のメソッド
RightAwsではセキュリティグループ関連のメソッドにedit_security_group()というメソッドがあり、引数によってAuthorizeSecurityGroupIngressかRevokeSecurityGroupIngressを呼び出す作りになっております。以下にこのメソッドの呼び出し例を示します。
# セキュリティグループ「webapps」に8080/tcpの穴をあける例 result = @ec2.edit_security_group( :authorize, 'webapps', :protocol => 'tcp', :port => '8080', :cidr_ip => '0.0.0.0/0' ) |
このメソッドの特徴として、ルールを追加・削除する際に前述のメソッドではCIDRを指定する場合とセキュリティグループを指定する場合でいちいちメソッドを使い分けるという煩わしさを回避できることと、ルールのポート番号が1つだけでも範囲指定として同じポート番号を引数に与える煩わしさを回避できるという点があります。特に不都合がない場合はこちらのメソッドを使用するほうが楽です。
■次回は、EBSを操作するAPIについて
これでElasticIPとセキュリティグループを操作するプログラミングができるようになりました。次回はEBSのボリュームとスナップショットを操作するAPIについて説明します。
羽深 修 | Eucalyptus歴はまだ1年ですが、周囲からはEucalyptus中毒と勘違いされているようです。Japan Eucalyptus User Groupの活動に参加し、オープンソースカンファレンスでネタなどを披露しています。度々Eucalyptusへのパッチも書いてます。ちなみに仕事ではCentOS + Xenという環境でEucalyptusを利用していますが、自宅のEucalyptus環境はGentoo Linux + KVMで動かしています。 |
志田 隆弘 | 主にEucalyptusやクラウドとはあまり関係のない分野でちょこちょこと活動していました。Eucalyptusはバージョン 1.3の頃からいじり始め、かれこれ2年近くEucalyptusに浸かった生活をしています。Eucalyptus 1.4が出たタイミングで、Tanacasinoという名前のGUIクライアントを作ったりしていました。最新のEucalyptusで動作するので、ぜひ使ってみてください。 |
田中 智文 | 志田さんとともに初期の頃からEucalyptusの調査・検証・使用してきました。志田さんの作成したTanacasinoのメンテナンスと機能拡張を行っています。新婚ほやほやなので家でのハック活動時間が少ないですが、Walrus Clientを作ってみたりbotoを使ってEucalyptusを操作して遊んでいます。 |