第9回:ネットワークに関するEucalyptusのAPI


 前回はインスタンス操作に関するAPIについて説明しました。今回は、ElasticIPとセキュリティグループの操作に関するAPIを呼び出すプログラミングを説明します。今回もbotoとRightAwsを使用しますので、基本的な使い方は第8回を参照してください。

 

ElasticIPを操作するAPI

 ElasticIPを操作するAPIには下記の5つのAPIがあり、ElasticIPを確保・解放するAPIと、現在確保しているElasticIPの一覧を取得するAPIと、ElasticIPをインスタンスに取り付け・取り外すAPIがあります。

【セキュリティグループを操作するAPI】
API説明
CreateSecurityGroupセキュリティグループを作成するAPI
DeleteSecurityGroupセキュリティグループを削除するAPI
DescribeSecurityGroups作成済みのセキュリティグループの一覧を取得するAPI
AuthorizeSecurityGroupIngressセキュリティグループにルールを追加するAPI
RevokeSecurityGroupIngressセキュリティグループからルールを削除するAPI

 

ElasticIPを確保する

 ElasticIPを確保するためには、AllocateAddressを使います。AllocateAddress APIを呼び出す際のパラメータはありません。

【botoでのAllocateAddress】
address = connection.allocate_address()
print address.public_ip

 

【RightAwsでのAllocateAddress】
# 戻り値は取得できたElasticIPの文字列が返る
elastic_ip = @ec2.allocate_address

 

ElasticIPを解放する

 確保したElasticIPを解放するためには、ReleaseAddressを使います。ReleaseAddress APIを呼び出す際のパラメータとして、確保しているElasticIP群に含まれているアドレスを指定しなければなりません。

【botoでのReleaseAddress】
# 戻り値はTrue/Falseが返る
return_code = connection.release_address("192.0.2.100")

 

【RightAwsでのReleaseAddress】
# 戻り値はTrue/Falseが返る
result = @ec2.release_address('192.0.2.100')

 

ElasticIPの一覧を取得する

 確保したElasticIPの一覧を取得するためには、DescribeAddressesを使います。DescribeAddresses APIを呼び出す際のパラメータとして、確保しているElasticIPを指定することができますが、Eucalyptusの場合はパラメータを指定していても指定していなくとも、現在そのユーザが確保しているElasticIPの一覧が返ります。

【botoでのDescribeAddresses】
addresses = connection.get_all_addresses()
for address in addresses:
  print address.public_ip, address.instance_id

 

【RightAwsでのDescribeAddresses】
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を指定します。

【botoでのAssociateAddress】
# 戻り値は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のアドレスを指定します。

【botoでのDisassociateAddress】
# 戻り値はTrue/Falseが返る
return_code = connection.disassociate_address('192.0.2.125')

 

【RightAwsでのDisassociateAddress】
# 戻り値はTrue/Falseが返る
result = @ec2.disassociate_address('192.0.2.125')

 

セキュリティグループを操作するAPI

 セキュリティグループを操作するAPIには下記の5つのAPIがあり、セキュリティグループを作成・削除するAPIと、作成済みのセキュリティグループの一覧を取得するAPIと、セキュリティグループにルールを追加・削除するAPIがあります。

【ElasticIPを操作するAPI】
API説明
AllocateAddressElasticIPを1つ確保するAPI
ReleaseAddress確保しているElasticIPを1つ解放するAPI
DescribeAddresses確保しているElasticIPの一覧を取得するAPI
AssociateAddress確保しているElasticIPをインスタンスに取り付けるAPI
DisassociateAddressインスタンスに取り付けているElasticIPを取り外すAPI

 

セキュリティグループを作成する

 セキュリティグループを作成するためには、CreateSecurityGroupを使います。CreateSecurityGroup APIを呼び出す際のパラメータにはセキュリティグループ名とセキュリティグループの説明を指定します。なおセキュリティグループ名は必須ですが、RightAwsではセキュリティグループの説明を省略することが可能です。

【botoでのCreateSecurityGroup】
group = connection.create_security_group('webapps', 'Allowing SSH, HTTP and HTTPS ingress')
print group.name, group.description

 

【RightAwsでのCreateSecurityGroup】
# 戻り値はTrue/Falseが返る
result = @ec2.create_security_group('webapps', 'Allowing SSH, HTTP and HTTPS ingress')

 

セキュリティグループを削除する

 セキュリティグループを削除するためには、DeleteSecurityGroupを使います。DeleteSecurityGroup APIを呼び出す際のパラメータにはセキュリティグループ名を指定します。

【botoでのDeleteSecurityGroup】
# 戻り値はTrue/Falseが返る
return_code = connection.delete_security_group('webapps')

 

【RightAwsでのDeleteSecurityGroup】
# 戻り値はTrue/Falseが返る
result = @ec2.delete_security_group('webapps')

 

セキュリティグループの一覧を取得する

 セキュリティグループの一覧を取得するためには、DescribeSecurityGroupsを使います。DescribeSecurityGroups APIを呼び出す際のパラメータにはセキュリティグループ名を指定することができます。なお、パラメータを指定しない場合は、そのユーザのセキュリティグループの一覧が返ります。

【botoでのDescribeSecurityGroups】
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

 

【RightAwsでのDescribeSecurityGroups】
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を呼び出す際のパラメータには以下のものがあります。

【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場合により必須

 

【botoでのAuthorizeSecurityGroupIngress】
# 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'
  )

 

【RightAwsでのAuthorizeSecurityGroupIngress】
# 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と同じです。

【botoでのRevokeSecurityGroupIngress】
# 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'
  )

 

【RightAwsでのRevokeSecurityGroupIngress】
# 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を呼び出す作りになっております。以下にこのメソッドの呼び出し例を示します。

【RightAws固有メソッドedit_security_group()】
# セキュリティグループ「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を操作して遊んでいます。
関連情報
(羽深 修/志田 隆弘/田中 智文)
2011/1/7 06:00