【AWS】AWS Simple Storage Service をpython で


はじめに

これからAWSで使ったシステム構築を行うことになりそうです。(^^)/
そこでpython で端末からstorage に直接に、(WEBを通さずに)ファイルをやり取りできるか調査したので、そのまとめメモです。

GCPとAWS

そもそも、おじさんはGCP で Google Cloud Storage を使ってきました。ユーザから見ると、AWS S3はCloud Storage とほとんど同じ感じがします。
GCPの解説ページでは、分散オブジェクト ストレージでAWSとの比較を紹介しています。

  • object (blob)としてデータを保存する 分散object storage である
  • ファイルとmetadata でobject を構成。key value に対応する。
  • オブジェクトのkey はファイルパスのようにする (e.g., foo/bar.txt)
  • bucket にobject を入れて保存する

違いは権限の管理、課金方法にあるようです。今回の実装に関係する認証関係の設定は以下の通りです。

  • GCPでは、私は担当サービス用のユーザをIAMで作り、そのユーザkey を使用しています。ユーザに対して bucket の権限を設定します。端末やサーバでは、ユーザのkey を用いて(ユーザの権限で)storage にアクセスします。
  • AWSでは、まだ始めたばかりですが、IAMで作成した作業用ユーザに対して S3やbucket へのアクセスを設定するようです。端末では、アクセスIDとそれに対応するシークレット・アクセス・キーを指定しました。

Storage の操作方法

コンソール(ブラウザ経由)で操作する方法以外に、実際に使うには、

の2つの方法があるようです。

作業内容

コンソールでの動作確認

これはチュートリアルに書いてある通りにできました。bucket を作り、ファイルをupload/download する操作は、ブラウザから行えます。Google と同じ。

Google と違ったのは、bucket name に制約があることです。bucket を作る機会は少ないかもしれないので、プログラムでなくここで操作しても良いかも。使えない文字列だとすぐに教えてくれます。

AWS SDKの用意

AWS CLI

AWS CLIをインストールします。GCPのgcloud みたいなもののイメージです。
AWSのページに書かれている通り、Linux環境(Windows ノートPCで WSL2)に下記でインストールできました。割と時間がかかりました。

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install

こんな感じになりました。

$ aws --version
aws-cli/2.2.16 Python/3.8.8 Linux/5.4.72-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off

AWS SDK for python (boto3)

boto3 というのをpipするでけでした。

$ python -m pip install boto3

Access ID、それに対応する Secret Access Key をIAMで発行しましょう。これをセットします。

$ aws configure

でインタラクティブに入力しました。以下にあるファイルに設定が書かれるようです。

/home/user0001/.aws/
├── config
└── credentials

コードを動かす

これもチュートリアルにとおりで、何事もありませんでした。

まず、アクセスIDとシークレットアクセスキーは設定してある状態です。

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************R7UK shared-credentials-file
secret_key     ****************/OCE shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config

以下で不通に作成したbucket のリストを表示できました。

import boto3
s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
     print(bucket.name)

ファイルのupload も問題なくできました。

data = open('test.txt', 'rb')
ret = s3.Bucket('xxxx-yyyyy-bucket-20210704').put_object(Key='test.txt', Body=data)
print(ret)

s3.Object(bucket_name='xxxx-yyyyy-bucket-20210704', key='test.txt') と表示されました。コンソール(ブラウザ)でbucket を除くと、確かにファイルがupload されていました。

まとめ

AWS の分散object storageにpython スクリプトでファイルをアップロードすることができた。今後考えなければいけないのは、

  • 複数の端末で実行するとき、アクセスキーをどうするのか。複製はしない方がよいとなると、それぞれ作るのかな。それらをdeploy するときにはどうしたらよいのだろう。きっとノウハウがあるんだろうな。
  • 今回はAWS CLIで access IDの設定をしたが、プログラム内で行いたい。(AWS CLI無しで動かしたい)
  • REST APIを試す。結局、RestAPIがプログラミング言語に依存せず、最強ではないかと思う。

とまぁ、いろいろあるが、とりあえず、python でプロト実装すると思います。
以上、おじさんメモでした。
(2021/07/04)