AWS SDK for Python

投稿日 2015/01/05

[Home] 前の記事 (AWS S3 CLI) 次の記事 (AWS で WinSCP)  当サイトの Python 技術情報AWS SDK for Ruby

このサイトは Amazon Web Service (AWS, クラウド) 上に構築しています。

 

AWS SDK for Python とは

まず、SDK を利用するためには、AWS にアクセスするためのキーが必要です。この取得・設定方法は、前の記事(下記)を参照願います。

AWS CLI の使い方

AWS ではサブシステム、例えば S3 をコマンドで操作することができます。AWSでは、それをさらに推し進めてプログラムでも操作するための SDK (System Development Kit) がいろいろな言語向けに用意されています。具体的には下記のような言語(環境)に対応しています。

この中で Python はいろいろな環境で動作しますし、EC2 の Ubuntu などの Linux にも標準搭載されていて何かと便利です。ただし、Windows では標準搭載ではないので自分でインストールしなければなりません。

 

Python のインストール (Windowsの場合)

Linux の場合は、普通、Python は標準搭載されていますが、Windows でも利用したい場合は、下記の場所から Windows インストーラをダウンロードしてインストールします。Python 2.x 系と Python 3.x系がありますが、AWS SDK はどちらでも動作します。また、32ビット版、64ビット版がありますが、自分で使っている Windows がどちらか調べるか、わからなければ、とりあえず32ビット版でもよいと思います。

python japan

 

AWS SDK for Python (Boto) のインストール

Windows で Python のインストールが成功したら(Linuxはここから開始) 、AWS SDK for Python をインストールします。AWS SDK for Python のモジュール名は boto というので、以下は boto と呼びます。

boto のインストールには、Python のモジュール管理コマンドの pip というのを使います。もし、"pip" と入力して「ない」と言われたら、自分でインストールする必要があります。

Ubuntu だと

sudo apt-get -y install python-pip

と入力すればインストールできるはずです。Windows だとちょっと面倒で、下の場所から、"get-pip.py" をダウンロードします。

次に下のようにして、Python で get-pip.py を実行します。

正常終了したら、pip を使って boto をインストールします。Windows の場合は、下のようにして boto をインストールします。

Ubuntu の場合は、下のようにします。

実際に動作しているかは、サンプルを下記のようにしてダウンロードして実行してみます。

git clone https://github.com/awslabs/aws-python-sample.git

ダウンロードが終わったら aws-python-sample フォルダ内の s3_sample.py を実行してみます。

このサンプルは、Python 2.x 向けなので、Python 3.x ではエラーが出ます。下のソースは 3.x 向けに修正したものです。


# Copyright 2013. Amazon Web Services, Inc. All Rights Reserved.
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#     http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Import the SDK
import boto
import uuid

# Instantiate a new client for Amazon Simple Storage Service (S3). With no
# parameters or configuration, the AWS SDK for Python (Boto) will look for
# access keys in these environment variables:
#
#    AWS_ACCESS_KEY_ID='...'
#    AWS_SECRET_ACCESS_KEY='...'
#
# For more information about this interface to Amazon S3, see:
# http://boto.readthedocs.org/en/latest/s3_tut.html
s3 = boto.connect_s3()

# Everything uploaded to Amazon S3 must belong to a bucket. These buckets are
# in the global namespace, and must have a unique name.
#
# For more information about bucket name restrictions, see:
# http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html
bucket_name = "python-sdk-sample-%s" % uuid.uuid4()
print("Creating new bucket with name: " + bucket_name)
bucket = s3.create_bucket(bucket_name)

# Files in Amazon S3 are called "objects" and are stored in buckets. A specific
# object is referred to by its key (i.e., name) and holds data. Here, we create
# a new object with the key "python_sample_key.txt" and content "Hello World!".
#
# For more information on keys and set_contents_from_string, see:
# http://boto.readthedocs.org/en/latest/s3_tut.html#storing-data
from boto.s3.key import Key
k = Key(bucket)
k.key = 'python_sample_key.txt'

print("Uploading some data to " + bucket_name + " with key: " + k.key)
k.set_contents_from_string('Hello World!')

# Fetch the key to show that we stored something. Key.generate_url will
# construct a URL that can be used to access the object for a limited time.
# Here, we set it to expire in 30 minutes.
#
# For a more detailed overview of generate_url's options, see:
# http://boto.readthedocs.org/en/latest/ref/s3.html#boto.s3.key.Key.generate_url
expires_in_seconds = 1800

print("Generating a public URL for the object we just uploaded. This URL will be active for %d seconds" % expires_in_seconds)
print()
print(k.generate_url(expires_in_seconds))
print()
input("Press enter to delete both the object and the bucket...")

# Buckets cannot be deleted unless they're empty. Since we still have a
# reference to the key (object), we can just delete it.
print("Deleting the object.")
k.delete()

# Now that the bucket is empty, we can delete it.
print("Deleting the bucket.")
s3.delete_bucket(bucket_name)

 

Boto の詳細ドキュメントは、下記のリンクを参照してください。

 AWS SDK for Python (Boto) のドキュメント
 boto: A Python interface to Amazon Web Services
 github

もし、サンプルが動作しないときは、~/.aws/config を確認してください。また、環境変数

AWS_ACCESS_KEY_ID - Your AWS Access Key ID
AWS_SECRET_ACCESS_KEY - Your AWS Secret Access Key
を設定してみてください。これは ~/.aws/config の内容と同じです。内容はこんな感じになります。
AWS_ACCESS_KEY_ID='AKIAI?????????45A'
AWS_SECRET_ACCESS_KEY='hb3yJrVO???????????????qNPmiaqD8w'

 

サンプル

オブジェクト一覧の取得

次のサンプルはバケツ "tiny10be" の内容を表示するものです。

#!/usr/bin/python
# coding: utf-8
import boto
bucket_name = 'tiny10be'
s3 = boto.connect_s3()
print("connected")
bucket = s3.get_bucket(bucket_name, validate=False)
if bucket is None :
 print('No such bucket.')
 quit()
items = bucket.list()
for item in items :
 print(item)
print("Done.")

次のサンプルは上と同じですが、こんなショートカットメソッド S3Connection() もあります。。

#!/usr/bin/python
# coding: utf-8
from boto.s3.connection import S3Connection
bucket_name = 'tiny10be'
s3 = S3Connection()
print("connected")
bucket = s3.get_bucket(bucket_name, validate=False)
if bucket is None :
 print('No such bucket.')
 quit()
items = bucket.list()
for item in items :
 print(item)
print("Done.")

ファイル名だけを表示するなら、次のようにした方がいいです。

#!/usr/bin/python
# coding: utf8
import boto
bucket_name = 'tiny10be'
s3 = boto.connect_s3()
print("connected")
bucket = s3.get_bucket(bucket_name, validate=False)
if bucket is None :
 print('No such bucket.')
 quit()
items = bucket.list()
for item in items :
 print(item.name.encode('utf-8'))
print("Done.")

ファイルのダウンロード

次はファイルをダウンロードするサンプルです。

#!/usr/bin/python
# coding: utf8
from boto.s3.connection import S3Connection
from boto.s3.key import Key
filename = '/home/ubuntu/temp/s3download'
download ='/data/test1.txt'
bucket_name = 'tiny10be'
s3 = S3Connection()
print("connected")
bkt = s3.get_bucket(bucket_name)
key = bkt.get_key(download)
if key == None :
  print('key is None.')
  quit()
fp = open(filename, 'w')
key.get_file(fp)
fp.close()
key.close()
print('Done.')

ファイルのアップロード

逆にファイルをアップロードするサンプルですが、なぜか key.send_file(fp) はエラーになります。代わりに key.set_contents_from_file(fp) を使っています。

#!/usr/bin/python
# coding: utf8
from boto.s3.connection import S3Connection
from from os.path import *
filename = '/home/ubuntu/temp/upload.txt'
if not exists(filename) :
  print('Error: ' + filename + ' does not exists.')
  quit()
upload = '/temp/upload.txt'
bucket_name = 'tiny10be'
s3 = S3Connection()
print("connected")
bkt = s3.get_bucket(bucket_name)
key = bkt.new_key(upload)
fp = open(filename, 'r')
#key.send_file(fp)
key.set_contents_from_file(fp)
fp.close()
key.close()
print('Done.')

ファイルの削除

ファイルの削除のサンプルです。

#!/usr/bin/python
# coding: utf-8
from boto.s3.connection import S3Connection
filename = '/temp/upload.txt'
bucket_name = 'tiny10be'
s3 = S3Connection()
print("connected")
bucket = s3.get_bucket(bucket_name, validate=False)
if bucket is None :
  print('No such bucket.')
  quit()
info = bucket.delete_key(filename)
print(info.name + " has been deleted.")

CGI として使用する場合

CGI として boto を使う場合、ユーザが apache になるため、CGI 側ではアクセスキーの場所がわかりません。したがって、S3Connection で直接キーを指定します。

#!/usr/bin/python
# coding: utf-8
#  S3 のオブジェクト一覧をJSONとして取得
#   パラメータ b : バケツ名
#   パラメータ k : キー名(ディレクトリ名、先頭や最後の "/" は不要)

from boto.s3.connection import S3Connection
import cgi
import cgitb
import json
cgitb.enable()  # エラーが起こったときエラーの詳細をブラウザに表示

#
# パラメータをJSONとみなして出力する。
#
def respond(str) :
  print("Content-Type: application/json; charset=utf-8\n\n")
  print(str)
  
#
#  メイン
#
# Bucket と Key を取得
form = cgi.FieldStorage()
bucket_name = form.getvalue("b")
key_name = form.getvalue("k")
if bucket_name == None :
  respond('Error: parameter is none.');
  quit()
# S3 に接続
s3 = S3Connection(aws_access_key_id='AKIAI?????????045A', aws_secret_access_key='hb3y???????????????????qD8w')
# Bucket を取得
bucket = s3.get_bucket(bucket_name, validate=False)
if bucket is None :
  respond('Error: No such bucket.')
  quit()
# 内容一覧を得る。
items = bucket.list(key_name)
# オブジェクトの名前だけを取り出して配列にする。
list = []
for item in items :
  list.append(item.name.encode('utf-8'))
  
# 結果を出力
respond(json.dumps(list))

 

 


 このページの先頭  前の記事 次の記事

 開設 2014年12月   著作権 2014-2015 bank.red  連絡先: こちらからメッセージを送ってください(お仕事も大募集)