はじめに
IoT関係の案件で、ゲートウェイ(以下GW)からS3にあるファイルをダウンロードしたり、アップロードしたりする必要があったので、python(2.7)とboto3(AWS SDK for python)を使って実装してみました。その際の手順を備忘録的に残しておこうと思います。
最終目標
- バケット内のファイルをダウンロードできるようになる
- 特定のディレクトリへファイルをアップロードできるようになる
さあ、はじめようか
boto3のインストール
GWにssh接続でログインして、pipでboto3をインストールします。(GWはpython2.7 pipはインストール済み)
sudo pip install boto3
特定のバージョンを指定する場合は以下のようにインストールします。
sudo pip install boto3==1.0.0
IAM作成
boto3を利用する際に、IAMにてポリシーを設定する必要があります。今回はS3FullAccessを設定したIAMユーザーを作成しました。
必要に応じて読み込みのみにしたり、アクセスできるバケットを絞ったりなど必要最低限のポリシーを設定するようにしましょう。
※この手順は省略します
AWSCLI設定
先ほど作成したIAMユーザーのアクセスキー情報を設定します。
AWSCLIのインストール
sudo pip install awscli
Configure設定
aws configure
AWS Access Key ID: xxxxxxxxxxxxxxxxx
AWS Secret Access Key: xxxxxxxxxxxxxxxxx
Default region name: ap-northeast-1
Default output format:
これで設定完了です。設定した内容は、「~/.aws/credentials」と「~/.aws/config」で確認することができます。
python内でboto3をimportする
bote3のimportしてS3のファイルをごにょごにょするためには、下記のように書き始めます。
# -*- coding: utf-8 -*-
import boto3
s3 = boto3.resource('s3')
ほかのサービスを利用する場合は下記のように書きます。(DynamoDBの例)
# -*- coding: utf-8 -*-
import boto3
# S3
s3 = boto3.resource('s3')
# DynamoDB
dynamo = bot3.resource('dynamodb')
実際にS3のファイルをごにょごにょする
S3からのダウンロード
download_file()を使用します。バケット名hoge内のfuga.txtをダウンロードする場合は
# -*- coding: utf-8 -*-
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('hoge')
bucket.download_file('fuga.txt', 'fuga.txt')
バケットは同じで、フォルダhogehoge内のfuga.txtをダウンロードする場合は
#---省略---
bucket = s3.Bucket('hoge')
bucket.download_file('hogehoge/fuga.txt', 'fuga.txt')
S3へのアップロード
upload_file()を使用します。バケット名hoge内にfuga.txtをアップロードする場合は
#---省略---
bucket = s3.Bucket('hoge')
bucket.upload_file('fuga.txt', 'fuga.txt')
バケットは同じで、フォルダhogehoge内にfuga.txtをアップロードする場合は
#---省略---
bucket = s3.Bucket('hoge')
bucket.upload_file('fuga.txt', 'hogehoge/fuga.txt')
これでS3内のファイルをダウンロードしたり、アップロードすることができるようになりました。
ちなみにバケット内の各オブジェクト情報を表示させるのは
#---省略---
bucket = s3.Bucket('hoge')
print bucket.name
で一覧が表示されます。
最後に
boto3を使う以前にpython自体あまり触れたことがなかったので少し苦戦してしまいましたが、公式ドキュメントがかなり整っていたので助かりました。というか英語に対する拒否反応を示さない方は公式ドキュメントを読んでいただいたほうがいいと思います。汗