PythonでのAmazon S3プログラミング
ちょっとした事情があり、PythonでAmazon Web Servicesを操作するプログラムを作ることになりました。PythonでAWSを操作するにはbotoがよさそうです。
PythonでAWSプログラミングの手始めにメジャーなサービスであるAmazon S3でbotoの使い方を学習してみました。
■ botoについて
botoはAWSの公式SDKではありませんが、以下のAWSのAPIに対応したライブラリです。
- Simple Storage Service (S3)
- SimpleQueue Service (SQS)
- Elastic Compute Cloud (EC2)
- Mechanical Turk
- SimpleDB
- CloudFront
- CloudWatch
- AutoScale
- Elastic Load Balancer (ELB)
- Virtual Private Cloud (VPC)
- Elastic Map Reduce (EMR)
- Relational Data Service (RDS)
- Simple Notification Server (SNS)
- Identity and Access Management (IAM)
- Route53 DNS Service (route53)
公式SDKに迫るような対応サービスの多さですね。
それだけではなく、Google Storageにも対応しています。PythonとGoogle関連サービスとの相性がよいからでしょうか...。単純にS3とインタフェースが近しいからというのもありそうですが。
まあ、とにかくしっかりAWSプログラミングができそうなライブラリです。
■ botoインストール
Linux、Mac OS Xなどではeasy_installがあれば以下のような感じで簡単インストールです。オススメです。
% sudo easy_install boto
あるいは、ここからダウンロードして、展開して
以下のような感じでインストールでもよいかと。(easy_installつかったほうが簡単だと思いますが・・・)
% wget http://boto.googlecode.com/files/boto-2.0.tar.gz % cd boto-2.0 % sudo python setup.py install
■ S3への接続とアクセスキー、秘密キーについて
環境変数としてAWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYをあらかじめセットしておけばプログラム中にアクセスキー、秘密キーを記述する必要はありません。以下のような感じで接続できます。
from boto.s3.connection import S3Connection conn = S3Connection() # プログラム中にキー情報は書かない
もし、プログラム中に記述する場合は以下のようにAWSとのAWSAuthConnectionを継承したクラス(この場合S3Connection)のインスタンスを作成するのですが、そこで引数にキー情報を入れます。
from boto.s3.connection import S3Connection conn = S3Connection('アクセスキー', '秘密キー')
■ バケット情報取得とバケット作成
すべてのバケット情報を取得して、バケット名を出力すると以下のような感じになります。簡単ですね。
from boto.s3.connection import S3Connection conn = S3Connection() # すべてのバケットを取得する。 buckets = conn.get_all_buckets() # バケット名出力 for bucket in buckets: print bucket.name
続いて、バケットの有無を判定して、あればバケットオブジェクト取得、なければバケットオブジェクトを作成する、というのは以下のようにすれば動きます。ちなみにバケットのリージョンは東京リージョンを指定しています。
bucket_name = 'flect-bucket-tokyo' # バケットがあるかどうかを調べる、なければ作成する。 if bucket_name in conn: bucket = conn.get_bucket(bucket_name) else: bucket = conn.create_bucket(bucket_name, location=Location.APNortheast) # 東京リージョン指定
補足ですが、リージョン情報を取得するのは以下のように書けばできます。
from boto.s3.connection import Location print dir(Location) # 出力例→ ['APNortheast', 'APSoutheast', 'DEFAULT', 'EU', 'USWest', '__doc__', '__module__']
■ オブジェクトの作成と削除
続いて、先ほど作成したバケットにオブジェクトを出し入れしてみます。
まずは単純なテキストから。以下のように出し入れできます。
# キーからオブジェクトの取得/保存操作には以下のインポートが必要 from boto.s3.key import Key # 中略 k = Key(bucket) k.key = 'text_content' # キー指定 k.set_contents_from_string('text content') # テキストをオブジェクトとして保存 text_content = k.get_contents_as_string() # 保存したオブジェクトのテキスト取得
また、ファイルとしてアップロード/ダウンロードも簡単です。
以下はローカルの画像ファイルをアップし、別名でダウンロードする例です。
(bucketはバケットオブジェクトが取得されているものとします)
# ファイルをS3に保存する k = Key(bucket) k.key = 'sample_image.jpg' k.set_contents_from_filename('./sample.jpg') # ファイルをS3から取得して、指定したファイル名に保存 k.get_contents_to_filename('./download.jpg')
■ まとめと次の課題
内容が著しく浅い、という感はぬぐえないですが、今回はPythonでAWSを触る感触を学習してみたかった、ということでS3を操作するプログラムを通してbotoの使い方になじんでみました。
よく使っているからという理由でS3から学習してみたのですが、今回はAmazon SESなどほかに動かしたいサービスのウォーミングアップなので次回以降いろいろなサービスを動かしてみたいと思います。
http://1c-job.net
このサイトにはプログラマーとして必要だと思うことが載っています。
これをとっかかりにしてプログラムに興味が出てくること間違いないです。
投稿: 匿名がかり | 2012年4月19日 (木) 14:48