Python & AWS
クックブック

Mitch Garnaat 著
成田 昇司
訳
株式会社トップスタジオ

本書で使用するシステム名、製品名は、それぞれ各社の商標、または登録商標です。
なお、本文中では、™、®、© マークは省略しています。

Python and AWS Cookbook

Mitch Garnaat

Beijing・Cambridge・Farnham・Köln・Sebastopol・Tokyo© 2012 OʼReilly Japan, Inc. Authorized Japanese translation of the English edition of Python and AWS Cookbook.
© 2012 Mitch Garnaat. This translation is published and sold by permission of OʼReilly Media, Inc., the owner of allrights to publish and sell the same.
本書は、株式会社オライリー・ジャパンが OʼReilly Media, Inc. の許諾に基づき翻訳したものです。日本語版についての権利は、株式会社オライリー・ジャパンが保有します。
日本語版の内容について、株式会社オライリー・ジャパンは最大限の努力をもって正確を期していますが、本書の内容に基づく運用結果について責任を負いかねますので、ご了承ください。

v

まえがき

筆者が初めて Amazon Web Services（AWS）を体験したのは、2006 年 3 月 14 日のことでした。それに先立って Simple Storage Service（S3）と呼ばれる Web ベースの新しいストレージサービスを発表したプレスリリースを見たときには、Amazon がそのようなサービスを提供するとは何と奇妙なことだろうと思ったのを今でも覚えています。それはともかく、筆者はサインアップしてアカウントを取得し、ドキュメントを読み始めました。
筆者は S3 に圧倒されました。単純で、手ごろな価格のモデル。洗練された REST API。実質的に無制限のストレージ容量。驚くべきことです。これを何かさらに改善できるとするなら、と筆者は自問し̶̶

Python インタフェースこそがそれだと考えました。その日、後に boto ライブラリ（https://github.com/
boto/boto）となるもののコーディングを始めました。このライブラリは、Amazon Web Services とのイ
ンタフェースとして本書で使用します。
私は今でも確信していますが、Python は、AWS を始めとするクラウドサービスを対話的に操作するのに最適な言語です。すばらしい標準ライブラリがすべての Python のインストールに付属しており（「バッテリー同梱」!）、これまでに蓄積された膨大な数のモジュールを Python Cheese Shop（http://pypi.python.

org/）†を介して簡単にダウンロードでき、要求を試みれば即座に結果が表示されるというようにクラウドサービスを対話的に操作できる機能が備わっています。これらの特徴があいまって、アプリケーションを開発し、クラウドベースのインフラストラクチャを制御するための、強力で楽しい方法を提供してくれます。
何か新しいことを学習する最善の方法は多くの例を見るほかないということに、筆者はいつも気づかされます。本書は、短いながらも、その点に焦点を当てながら、Elastic Compute Cloud（EC2）および Simple

Storage Service（S3）に関連する多くの共通する問題に対する解法を（Python と boto を使用して）紹介
します。これが読者の役に立つことを期待しています。

†

Python Cheese Shop は以前の名称で、現在は PyPI という名称に変更されている。

vi

まえがき

本書で使用されている表記規則
本書では以下に示すような活字の表記規則を使用しています。

Bold（太字）
新しい用語、URL、電子メールアドレス、ファイル名、およびファイル拡張子を表します。

Constant Width（等幅）プログラムコードに使用します。さらに、本文の中で変数名や関数名、データベース、データ型、
環境変数、ステートメント、キーワードなどのプログラム要素を参照する場合にも使用します。

Constant Width Bold（等幅の太字）
ユーザがそのまま入力するコマンドなどのテキストを示します。

Constant-width Italic （等幅の斜体）
ユーザが指定する値または前後関係に応じて決定される値に置き換えるテキストを示します。

このアイコンは、ヒント、提案、または一般的なメモを意味します。

このアイコンは、警告または注意を表します。

サンプルコードの使用について
本書は、読者の皆さんが仕事を遂行するための役に立つことを目的にしています。一般的に言えば、本書に含まれているコードは、皆さんのプログラムやドキュメントで使用できます。本書の関係者に連絡して許可を得る必要はありません。ただし、大量のコードをまとめて再利用する場合は別です。例えば、本書に含まれるコードをいくつか使用してプログラムを作成する場合には、許可を得る必要がありません。しかし、O'Reilly 社の書籍から引用したサンプルを CD-ROM にコピーして販売したり配布したりする場合には、必ず許可を得る必要があります。また、質問に答える際に本書を引き合いに出してサンプルコードを引用する
場合には、許可を得る必要はありません。それに対して、かなり大量のサンプルコードを本書から皆さんの製品のドキュメントに取り入れる場合には、必ず許可を得る必要があります。
サンプルコードの帰属を明示していただければ感謝しますが、要求はしません。出典を示す際にはタイト
ル、著者、発行者などを含めます。例えば「『Python & AWS クックブック』、Mitch Garnaat 著、オライ
リー・ジャパン刊」のような形です。
サンプルコードの使用法が適正な使用法から逸脱していたり上記の許可される範囲を超えていると思われる場合は、permissions@oreilly.com 宛てにメールでご連絡下さい（英語のみ）
。

まえがき

vii

お問合せ先
本書に関するご意見やご質問は、下記の出版社にお寄せ下さい。
株式会社オライリー・ジャパン〒 160-0002

東京都新宿区坂町 26 番地 27 インテリジェントプラザビル 1F

電話：03-3356-5227

FAX：

03-3356-5261

本書専用の Web ページを用意し、正誤表、サンプル、その他の追加情報などを掲載しています。このページには次の URL でアクセスできます。

http://shop.oreilly.com/product/0636920020202.do（英語）http://www.oreilly.co.jp/books/9784873115436（日本語）
本書に関するご意見や技術的なご質問は、次のアドレス宛の電子メールでも受け付けています。

bookquestions@oreilly.com（英語）japan@oreilly.co.jp（日本語）
当社の書籍、講座、カンファレンス、ニュースなどに関する詳細な情報については、当社の Web サイトをご覧下さい。

http://www.oreilly.com（英語）http://www.oreilly.co.jp（日本語）

ix

目

次

まえがき................................................................................................................................v
1 章.

一般情報................................................................................................................ 1
Python に関するクイックメモ ...............................................................................................1
boto のインストール ...............................................................................................................1
Amazon Web Services の使用開始 ........................................................................................4
Eucalyptus による boto の使用 ..............................................................................................8
Google Cloud Storage による boto の使用 ...........................................................................9
AWS で利用可能なリージョンの検出 ..................................................................................10
boto によるデバッグ出力の有効化 ......................................................................................11
boto におけるソケットのタイムアウトの制御 ...................................................................122 章.

EC2 のレシピ................................................................................................... 13
インスタンスの起動 ..............................................................................................................13
タグを利用したインスタンスの追跡....................................................................................18
コンソールログへのアクセス ...............................................................................................20
既存の SSH 鍵ペアのアップロード......................................................................................20

EC2 の複数のリージョンにまたがる SSH 鍵ペアの同期化 ...............................................21
インスタンスへの固定 IP アドレスの関連付け...................................................................22
インスタンスへの永続的な EBS ボリュームの割り当て ...................................................24

EBS ボリュームのバックアップ ..........................................................................................25
スナップショットからのボリュームの復元 ........................................................................27
既存のインスタンスのクローン作成....................................................................................28
実行中のすべての EC2 インスタンスの検出.......................................................................30
インスタンスのパフォーマンスのモニタリング .................................................................32
通知の受信 .............................................................................................................................35

x

目次

CloudWatch へのカスタムデータの保存 ............................................................................41
インスタンスの起動時におけるカスタムスクリプトの実行 ..............................................43

3 章.

S3 のレシピ...................................................................................................... 53
バケットの作成......................................................................................................................53
特定の場所でのバケットの作成 ...........................................................................................54
秘密データの保存 ..................................................................................................................56
オブジェクトとメタデータの保存 .......................................................................................57
バケットに使用されているストレージの総容量の計算 .....................................................58
別のバケットへの既存のオブジェクトのコピー .................................................................59
既存のオブジェクトのメタデータの修正 ............................................................................60
自分のデータにアクセスしている人の検出 ........................................................................61
重要性の低いデータの保存コストの削減 ............................................................................63

S3 オブジェクトへの有効期限付き URL の生成 .................................................................64
S3 のデータの偶発的削除の防止 ..........................................................................................65
S3 での静的な Web サイトの運用 ........................................................................................68
S3 への大きなオブジェクトのアップロード .......................................................................70

1

1章
一般情報

Python に関するクイックメモ
本書に掲載されているサンプルでは、Python 2.7.1 を使用していますが、2.5.x から 2.7.x までの任意のバージョンの Python で動作するはずです†。botoライブラリについては、Python 3.x への移植と完全なテストをまだ行っていませんが、近い将来に移行する計画になっています。

Python のすべてのバージョンは、ソースコードの形式と多くの一般的なプラットフォーム用にコンパイ
ル済みの状態の両方が、http://python.org で公開されています。

boto のインストール
本書のサンプルを実行するには、botoのバージョン 2.1 以降が必要です。 botoをインストールする際には、いくつかの選択肢が用意されています。

github.com からのダウンロードとインストール
botoプロジェクトは、github（https://github.com/）をソースコードリポジトリとして使用しています。
したがって、github のリポジトリのクローンを自分のコンピュータ上に作成すれば、クローンされた配布物から botoをインストールできます。この方法では、 botoに加えられた最新の変更内容にいつでもアクセスすることができます。その中には最新の機能はもちろんですが、最新のバグも含まれます。したがって、そのような危険を考慮に入れた上で、次に示す手順に従ってインストールするかどうかを自分で判断する必要があります。

% git clone https://github.com/boto/boto% cd boto% sudo python setup.py install

手動による boto のダウンロードとインストール
Python Cheese Shop は、Python パ ッ ケ ー ジ の 公 式 リ ポ ジ ト リ で す。Cheese Shop（http://pypi.
python.org/、PyPI とも呼ばれます）に移動して botoを検索すると、 図 1-1に示すようなページが表示さ†日本語版のサンプルコードは Python 2.7.3 で動作確認をしました。

1章

2

一般情報

れます（図に示したのはバージョン 2.0 ですが、実際にはバージョン 2.3 となっているはずです）。

図 1-1

PyPI 上の boto のページ

boto-2.3.tar.gzのリンクをクリックすると、 botoのソースパッケージを含んだ状態で圧縮された tar
ボールがダウンロードされます。このファイルを自分のコンピュータに保存し、次の手順に従ってソースパッケージからインストールします。

% tar xfz boto-2.3.tar.gz% cd boto-2.3% sudo python setup.py install

easy_install による boto のインストール
easy_installユーティリティを使用すると、Python パッケージの検索、インストール、アップグレー
ド、およびアンインストールを（その名のとおり）簡単に行うことができます。easy_installの優れた機能を使用できるようにするには̶̶最初にこれをインストールする必要があります。setuptoolsパッケー
ジ（easy_installはその一部です）のインストールに関する詳細な手順については、http://pypi.python.

org/pypi/setuptools に記載されています。多くの Linux ディストリビューションにも setuptoolsのパッ
ケージが含まれています。例えば、Ubuntu の場合なら、次に示すコマンドを実行します。

% sudo apt-get install python-setuptools

１章

一般情報

3

Fedora や CentOS を始めとする yum 対応のディストリビューションであれば、次に示すコマンドを実行します。

% sudo yum install python-setuptools

easy_installを自分のコンピュータにセットアップした後ならば、 botoのインストールは、次に示すよ
うに簡単に行えます。

% sudo easy_install boto

pip による boto のインストール
pipユーティリティも、Python パッケージの検索、インストール、アップグレード、およびアンインス
トールを行うためのツールです。筆者の経験では、easy_installと pipのどちらも十分に機能します。したがって、少し調べてみて、どちらを使用するかご自身で決めるとよいでしょう。あるいは、両方使用するという手もあります。pipのインストールに関する詳細な手順については、http://pypi.python.org/pypi/

pip に記載されています。pipを自分のコンピュータにセットアップした後であれば、 botoのインストール
は、同じように簡単に行えます。

% sudo pip install boto

virtualenv による boto のインストール
インストール方法の選択肢を長々と紹介してきましたが、最後に紹介するのは、実際にはインストール
ツールではなく、むしろ独立した Python の環境を非常に手軽に作成するための方法です。virtualenvを使用すると、自己完結した Python の独立環境を自分のワークステーション上にいくつでも作成することができます。これらの仮想環境にインストールしたパッケージは、システムの Python パッケージやその他の仮想環境に影響を与えません。筆者は、筆者のラップトップ上で、何か 1 つのプロジェクトでの変更や誤りが他のプロジェクトや全体環境に及ぶ心配なしに、多くの異なるプロジェクトを進行できることがとても有用だと感じています。おまけに、一度 virtualenvをインストールして環境を作成してしまえば、それらの環境内での easy_installと pipの両方に自動でアクセスできるようになり、環境内にソフトウェアをインストールする際にスーパーユーザや管理者権限を必要としません。

virtualenvのインストールに関する詳細な手順については、http://pypi.python.org/pypi/virtualenv に記載されています。virtualenvを自分のコンピュータにセットアップした後であれば、次に示すコマンド
によって仮想環境をセットアップできます。

% virtualenv paws
仮想環境を作成するときには、当然ながら任意の名前を付けることが可能です。それからその仮想環境を有効にして、botoをインストールできます †。
†Windows 環境の場合、実行ファイルは仮想環境の Script フォルダ以下に作成されます。

4

1章

一般情報

% cd paws% source bin/activate% pip install botoparamiko のインストール
paramikoパッケージは、リモートマシンとの間でセキュリティで保護された接続を確立するための SSH2
プロトコルを実装しています。paramikoをインストールしなくても botoを使用することは可能ですが、本書で紹介する EC2 のレシピの中には paramikoパッケージに依存しているものもあるので、インストールすることをお勧めします。手動でインストールする場合は、http://www.lag.net/paramiko/ に記載されている手順に従って下さい。あるいは、すでに easy_installまたは pipをインストールしてある場合は、 easy_

install paramikoまたは pip install paramikoというコマンドを実行します。

euca2ools のインストール
インストールすることが望ましい最後のパッケージは、euca2oolsです。このパッケージは Eucalyptus
チームによって開発されたものであり、AWS で提供されているツールと互換性のあるコマンドラインツールを提供します。euca2oolsは Python で書かれており、 botoを基盤として構築されています。クラウドイ
ンフラストラクチャの管理に役立つ一連の優れたツールを提供するとともに、学習や拡張の素材に適したサ
ンプルコードも提供しています。

euca2oolsは、多くの Linux ディストリビューションでパッケージ化されてきました。Ubuntu の場合には、sudo apt-get -y euca2oolsというコマンドでインストールできます。yum 対応のディストリビュー
ションの場合には、sudo yum install euca2oolsというコマンドでインストールできます。また、最新バー
ジョンのソースコードは https://launchpad.net/euca2ools で入手することができ、パッケージ化された
ソースリリースは http://open.eucalyptus.com/downloads からダウンロードできます。

Amazon Web Services の使用開始
AWS アカウントの作成
Amazon Web Services を使用するには、まず最初にサインアップしてアカウントを取得する必要があります。インターネットで http://aws.amazon.com/ のページを開き、［サインアップ］ボタンをクリックします。Amazon.com のアカウントをすでに持っていて、AWS の操作をそのアカウントに関連付けたい場合
は、単にそれらの認証情報を使用してログインします。あるいは、お望みなら、AWS の操作専用のアカウ
ントを新しく作成することもできます。

AWS へのサインアップに関する詳細な手順については、RightScale によって提供されているチュートリ
アル（http://support.rightscale.com/1._Tutorials/01-RightScale/1.5_Sign-up_for_AWS、英語）を参照して下さい†。
自分のアカウントが最低でも EC2 サービスと S3 サービスに対して有効になっていることを確認します。
上記のチュートリアルには各種のサービスへのサインアップに関する詳細な手順が記載されています。
†

日本語のドキュメントへのリンクが http://aws.amazon.com/jp/aws-first-step/に掲載されています。

１章

一般情報

5

アカウントを作成し終えると、次に示すようなさまざまな認証情報がそのアカウントに関連付けられます。

AWS アカウント認証情報
AWS Web ポータルと AWS Management Console にログインする際に使用する認証情報です。電子メールアドレスとパスワードで構成されます。これらの認証情報は、後で検討する他の認証情報のすべてに対するアクセスを制御します。したがって、このアカウントには強力なパスワードを選択し、そのパスワードをなるべく短い期間で積極的に変更することが非常に重要です。

AWS アカウント番号
自分の AWS アカウントに関連付けられた一意な番号で、12 桁の 10 進数で表されます。これから論じる他の認証情報とは異なり、この情報は秘密事項ではありません。自分のアカウント番号を最も簡単に調べるには、AWS ポータルにログインした後で、Web ページの右上隅のほうを見ます。
すると、図 1-2に示すような表示を確認できます。

図 1-2

AWS アカウント番号の確認

アカウント番号は公開識別子であり、主に AWS 内でリソースを共有する場合に使用します。例えば、EC2 の中で AMI を作成して、その AMI を公開することなく特定のユーザと共有したい場合に、そのユーザのアカウント番号を AMI に関連付けられたユーザ ID のリストに追加することが必要になります。ここに混乱を引き起こす可能性のある問題がひとつあります。アカウント番号が表示されるときには、4 つの数字ごとにハイフンによって 3 つのグループに分けられています。ところが、API を介して使用するときには、これらのハイフンを取り去らなければならないのです。

AccessKeyID および SecretAccessKey
これらのアクセス識別子は、AWS におけるすべての API アクセスの核心にあるものです。各AWS サービスに対して REST または Query API のリクエストを行うときには、そのすべてにおいて自分の AccessKeyID（アクセス鍵 ID）を渡して自分が誰であるかを明確にする必要があります。さらに API では、シグネチャを計算してリクエストに含めることも必要になります。
シグネチャを計算するには、さまざまなリクエストの要素（例えば、タイムスタンプ、リクエ

6

1章

一般情報

スト名、パラメータなど）を連結して署名する文字列（StringToSign）を構成し、次に自分のSecretAccessKey（秘密アクセス鍵）を鍵として使用して StringToSign の HMAC を計算することによってシグネチャを作成します。
リクエストが AWS に受信されたときには、同サービスによって同じように StringToSign が連結され、次にリクエストに含めて送られた AccessKeyID と AWS によって関連付けられた

SecretAccessKey に基づいてシグネチャが計算されます。それらが一致すれば、リクエストは認証されます。一致しなければ、拒絶されます。
アカウントに関連付けられた AccessKeyID は変更できませんが、SecretAccessKeyは、AWS
ポータルを使用していつでも再生成できます。SecretAccessKey は、認証メカニズム全体の基礎となっている共有秘密鍵なので、自分の SecretAccessKey が侵害された恐れがある場合には再生成すべきです。

X.509 証明書
アカウントに関連付けられるもうひとつのアクセス識別子は、X.509 証明書です。自分で独自の証明書を用意することもできますが、AWS によって証明書を生成することもできます。この証明書
は、SOAP バージョンの AWS API を使用するときに、リクエストを認証するために使用することができ、さらに EC2 において独自の S3 ベースの AMI を作成するときにも使用されます。基本的に、AMI をバンドルしたときに作成されたファイルは、アカウントと関連付けられた X.509 証明書を使用して暗号で署名されています。したがって、誰かがバンドルされた AMI を不正に変更しようという気になれば、シグネチャは破られ容易に検知されてしまいます。

SOAP API を使用する場合、X.509 証明書は、セキュリティの見地からも非常に重要です。その重要性は先ほど述べた SecretAccessKey と変わらないので、同じくらい慎重に管理する必要があります。たとえ皆さんが SOAP を使用しなくても、ハッカーには可能なのだということを忘れない
で下さい。

SSH 鍵
説明する必要のある認証情報の最後は、EC2 インスタンスへの SSH アクセスに使用される公開鍵と秘密鍵のペアです。デフォルトでは、EC2 インスタンスは公開鍵認証による SSH アクセスのみを許可します。あなたが自分で使用するために作成するすべての AMI においてもこの方針に従う
ことを強くお勧めします。SSH の鍵ペアは AWS Console と API を使用して生成できますし、既存の鍵ペアをインポートすることもできます。実行中のインスタンスにアクセスする必要がある組
織内のすべての個人に対して鍵ペアをそれぞれ作成し、それらの SSH 鍵を慎重に保護しなければなりません。

boto における AWS 認証情報の管理
サインアップして AWS アカウントを取得し、さらに認証情報を取得し終えたら、それらを botoで使用できるようにする必要があります。この方法は数通り用意されています。

１章

一般情報

7

認証情報を明示的に boto に渡す
いずれかの AWS サービスにアクセスするには、そのたびに botoによってそのサービスへの接続を確立する必要があります。そのようなときには、次に示すように自分のアクセス鍵 ID と秘密ア
クセス鍵を明示的に渡すことができます。botoではサービスとの通信を行うときにそれらの認証
情報を使用します。

% python
Python 2.7.1 (r271:86882M, Nov 30 2010, 10:35:34)[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto>>> ec2 = boto.connect_ec2(aws_access_key_id='my_access_key',aws_secret_access_key='my_secret_key')
大半の人は、接続するたびにこのように入力するのはわずらわしいとすぐに思うでしょう。
認証情報を環境変数に保存する
上記のようにして接続するときに、認証情報が明示的に botoに渡されない場合は、 AWS_ACCESS_

KEY_IDと AWS_SECRET_ACCESS_KEYという環境変数がユーザの環境内で定義されているかどうかがbotoによって確認されます。これらの環境変数が定義されている場合は、 botoによってそれらの値がアクセス鍵と秘密鍵として使用されます。
認証情報を boto の構成ファイルに保存する認証情報が明示的に botoに渡されない場合、およびユーザの環境内でそれらが見つからない場合
は、botoの構成ファイルの内容からそれらを検索することが試みられます。デフォルトで botoによって検索されるのは、/etc/boto.cfgファイルと ~/.botoファイルに含まれる構成情報です。自分の構成情報を別の場所に保存したい場合は、BOTO_CONFIG環境変数にその構成ファイルのパスを設定します。すると、botoはそのファイルから読み込みます。自分の認証情報を botoの構成ファ
イルに追加するには、次に示すようなセクションを追加します。

[Credentials]
aws_access_key_id = your_access_key
aws_secret_access_key = your_secret_key
認証情報を botoの構成ファイルに保存した後であれば、ユーザが botoを使用するたびに、認証情報は自動的に使用されます。AWS 認証情報を取り扱うには、これが最も便利な方法です。ただし、自分の AWS 認証情報を自分の botoの構成ファイルに保存する場合は、そのファイルの読み取りを自分だけに許可するようにファイル保護の設定を変えるのが賢明です。

8

1章

一般情報

クイックテスト
うまくいけばこの時点で、皆さんは botoをインストールし終えて、さらに自分の AWS アカウントを作成し、認証情報を環境変数または botoの構成ファイルに保存し終えていることでしょう。次の段階に進む
前に、簡単なテストでそれらが正常に機能していることを確認してみましょう。

% python
Python 2.7.1 (r271:86882M, Nov 30 2010, 10:35:34)[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto>>> ec2 = boto.connect_ec2()>>> ec2.get_all_zones()[RegionInfo:eu-west-1, RegionInfo:us-east-1, RegionInfo:ap-northeast-1,
RegionInfo:us-west-1, RegionInfo:ap-southeast-1,RegionInfo:us-west-2,
RegionInfo:sa-east-1]>>>
この短いテストを実行したときにほぼ同じ出力が得られれば、準備万端で次のレシピに進むことができます。そうでない場合には、これまでの手順をもう一度確認して下さい。それでもうまくいかない場合には、

boto ユーザグループ（http://groups.google.com/group/boto-users）に質問を投稿してみて下さい。

Eucalyptus による boto の使用
Eucalyptus とは何か
http://open.eucalyptus.com/learn/what-is-eucalyptus では次のように説明されています。
Eucalyptus は、業務用のプライベートクラウドの作成を可能にします。その際、組織の既存の IT イン
フラストラクチャを再編する必要はありませんし、専用のハードウェアを導入する必要もありません。

Eucalyptus が実装する IaaS（Infrastructure as a Service）プライベートクラウドは、Amazon EC2 お
よび Amazon S3 と互換性のある API によってアクセス可能です。この互換性のおかげで、すべてのEucalyptus クラウドは、パブリッククラウドからコンピュートリソースを引き出すことが可能なハイ
ブリッドクラウドに変化させることができます。さらに Eucalyptus は、EC2 および S3 の事実上標準に準拠した豊富なツールやアプリケーションと互換性があります。
簡単に言えば、Eucalyptus は、独自の AWS 互換ミニクラウド（あるいは、十分なハードウェアがある
場合にはマクシクラウド）のセットアップを可能にします。本書で紹介する AWS 用のレシピのほとんどす
べては、Eucalyptus でも動作します。したがって、ハードウェアに余裕がある場合には、自分のネットワー
クの快適性と安全性を維持したままで、すべてが正常に機能するか試してみることができます。

１章

一般情報

9

Eucalyptus の入手とインストール
Eucalyptus を イ ン ス ト ー ル す る こ と に 関 心 が あ る 場 合 に は、FastStart（http://go.eucalyptus.com/
Download-FastStart.html）を試してみるとよいでしょう。FastStart を使用すると、可能な限り少ない操作
で Eucalyptus をすばやくインストールして実行することができます。

Eucalyptus Community Cloud の使用
特別なソフトウェアをまったくインストールすることなく、Eucalyptus が正常に機能するか試してみることも可能です。Eucalyptus では Eucalyptus Community Cloud と呼ばれるサンドボックスを中心とした環境が提供されており、その中で Eucalyptus のクラウドソフトウェアを試用できます。詳細については、

http://open.eucalyptus.com/try/community-cloud を参照して下さい。

boto における Eucalyptus 認証情報の管理
Eucalyptus を起動して実行状態にした後は、botoを使用してシステムに簡単に接続できます。最初に自分の botoの構成ファイルを編集して、次に示すように Eucalyptus のホスト名と 認証情報を追加します。

[Credentials]
euca_access_key_id = 自分の Eucalyptus アクセス鍵
euca_secret_access_key = 自分の Eucalyptus 秘密鍵[Boto]
eucalyptus_host = " 使用する Eucalyptus CLC の DNS の名前または IP アドレス "walrus_host = " 使用する Walrus の DNS の名前または IP アドレス "情報を botoの構成ファイルに入力した後は、次のように操作することで Eucalyptus（EC2 互換のサービス）と Walrus（S3 互換のサービス）に接続できます。

% python>>> import boto>>> euca = boto.connect_euca()>>> walrus = boto.connect_walrus()

Google Cloud Storage による boto の使用
Google Cloud Storage とは何か
Google Cloud Storage for Developers（https://developers.google.com/storage/）は、Google のイン
フラストラクチャの中で自分のデータを保存したり自分のデータにアクセスしたりするための RESTful な（つまり、REST の原則に従った）サービスです。Google Cloud Storage と S3 は、それぞれ独自の機能をいくつか提供していますが、機能性と基本的な API の両方において共通している箇所もかなり見られます。

Google の開発者は、botoの中で Google Cloud Storage の機能に完全にアクセスすることを許容したとい

1章

10

一般情報

う点で、botoに対してかなり大きな貢献をしてくれました。本書で紹介する S3 レシピの多くは、Google

Cloud Storage でも正常に機能します。

boto における Google Cloud Storage の認証情報の管理
Google Cloud Storage は独立したサービスなので、一連の認証情報を独自に管理します。これらの認証
情報は、次に示すように botoの構成ファイルに追加できます。

[Credentials]
gs_access_key_id = 自分の Google Cloud Storage アクセス鍵
gs_secret_access_key = 自分の Google Cloud Storage 秘密鍵
これで次に示すように Google Cloud Storage への接続を確立できるようになります。

% python
Python 2.7.1 (r271:86882M, Nov 30 2010, 10:35:34)[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto>>> gs = boto.connect_gs()

AWS で利用可能なリージョンの検出
botoで EC2 サービスへの接続を確立する際、デフォルトでは US-EAST-1 リージョンに接続されます。
当初はこれが利用できる唯一のリージョンでしたが、その後、AWS はその動作の規模をかなり拡張してきました。本書の執筆時点では、以下のリージョンで EC2 を利用できるようになっており、それぞれ独自のエンドポイントが設定されています†。

●us-east-1［米国東部（バージニア北部）］●

us-west-1［米国西部（カリフォルニア北部）］●

us-west-2［米国西部（オレゴン）］●

eu-west-1［欧州西部（アイルランド）］●

ap-southeast-1［アジアパシフィック（シンガポール）］●

ap-northeast-1［アジアパシフィック（東京）］●sa-east-1［南米（サンパウロ）］

botoではこれらのリージョンを検出して接続する方法がいくつも用意されています。例えば、次のコマ†

原書では 5 つのリージョンが紹介されていますが、2012 年 7 月現在は 7 つのリージョンが利用できます。

１章

一般情報

11

ンドを実行すると、指定したサービス（この場合は EC2）のすべての RegionInfo オブジェクトのリストが返されます。それらの RegionInfo オブジェクトは、いずれもそのリージョンへの Connection オブジェク
トを返す connectメソッドを持ちます。

$ python
Python 2.7.1 (r271:86882M, Nov 30 2010, 10:35:34)[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto.ec2>>> boto.ec2.regions()[RegionInfo:eu-west-1, RegionInfo:us-east-1, RegionInfo:ap-northeast-1,
RegionInfo:us-west-1, RegionInfo:ap-southeast-1,RegionInfo:us-west-2,
RegionInfo:sa-east-1]>>> eu_conn = _[0].connect()
接続するリージョンの名前がわかっている場合には、次の方法でも接続できます。

$ python
Python 2.7.1 (r271:86882M, Nov 30 2010, 10:35:34)[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto.ec2>>> eu_conn = boto.ec2.connect_to_region('eu-west-1')>>>
最後に、EC2 接続を確立するときに botoで使用されるデフォルトのリージョンを変更するには、次に示
すような記述を自分の botoの構成ファイルに追加します。

[Boto]
ec2_region_name = eu-west-1
ec2-region-endpoint = ec2.eu-west-1.amazonaws.com
この記述を自分の botoの構成ファイルに追加しておけば、それ以降はパラメータを指定せずに boto.

connect_ec2を呼び出したときに、自動的に eu-west-1リージョンに接続できます †。

boto によるデバッグ出力の有効化
ときには何かが期待したとおりに動作しないことがあります。HTTP ベースの API を介してリモートサー
ビスと対話型処理を行っている場合、利用できる最良のデバッギングツールは、リモートサービスに送られた実際の HTTP リクエストと、リモートサービスから返された実際の HTTP 応答を記録した詳細なログです。
†

ec2-region-endpointにリージョンのエンドポイントを記述しておく必要もあります。

12

1章

一般情報

botoでは Python のロギングモジュールを使用して非常に詳細なログを記録する方法が用意されています。Python のロギングモジュールに組み込まれている多彩な機能の詳細については、http://docs.python.

org/library/logging.html に記載されています。次に紹介するサンプルは、botoを使用するときに完全なデバッグ出力を対話型コンソールに表示する簡単な方法を示しています。

% python>>> import boto>>> boto.set_stream_logger('paws')>>> ec2 = boto.connect_ec2(debug=2)>>> s3 = boto.connect_s3(debug=2)>>>

set_stream_loggerに渡す文字列は、何でも好きなものを指定できます。この文字列は、ログエントリのヘッダの位置に表示されます。この時点以降に ec2または s3の接続を使用して実行されたすべての動作は、その完全なデバッグログが対話型の Python シェルに出力されます。

boto におけるソケットのタイムアウトの制御
クラウドサービスと通信するため botoによって使用される API は、すべて HTTP ベースのものです。つ
まり、私たちは目に見えないところでソケットを介して分散サービスと通信していることになります。ときにはこれらのサービスが応答しなくなる可能性がありますし、自分のアプリケーションとサービスの間の通信層が信頼性を失う可能性もあります。このような事態に合理的な方法で対処する手立てとしては、タイムアウトが重要です。タイムアウトを使用すると、アプリケーションによってネットワークまたはサービスの問題を検出し、その処理を試みることが可能になります。あるいは、少なくともその事態についてユーザに知らせることができます。
ソケットレベルのタイムアウトを botoで明示的に管理するには、自分の botoの構成ファイルに次のようなセクションを追加します。タイムアウトは秒単位で指定します。

[Boto]
http_socket_timeout = 5