0
Help us understand the problem. What are the problem?

posted at

updated at

boto3を使って、さくらのオブジェクトストレージにファイルをアップしてみる

はじめに

最近になって、さくらのクラウドを触り始めた初心者(筆者)が四苦八苦しながら
オブジェクトストレージにファイルをアップロードしてみたのが前回の内容。

上記のアップロードができるようになったら
「なんかPythonから操作できる気がしてきたわ...」
と思い立ったので、Pythonから操作してみるのが今回の内容。

あと、先に言っておきますが、AWS公式ライブラリboto3を使った方法になるので
さくらインターネットの公式サポート対象外のやり方です。(多分)

だから、1年後には使えなくなっているかもしれない。(バナージ...悲しいね)

予想される検索ワード

以下、この記事を求めているであろう方が入力しそうな
(というか実際に私が必死で検索した)検索ワードです。

さくらのクラウド, オブジェクトストレージ, アップロード方法, Python, boto3

実行環境

  • ubuntu 18.04(Dockerで構築)
  • Python 3.7
  • boto3 1.22.0

手順

オブジェクトストレージにてバケットを作成する

前回記事同様、以下のマニュアル通りなので多分ハマらないです。
(サイト作成時のアクセスキーIDとシークレットアクセスキーのメモは忘れずに!)

boto3をインストール

pipでboto3をインストールします。

$ pip install boto3

オブジェクトストレージへのアクセス確認

boto3からさくらのオブジェクトストレージ内のバケット一覧が取得できるか確認します。

  1. test_boto3.pyを作成します。(場所は多分どこでもOK)

    $ vi test_boto3.py
    

    test_boto3.pyの中身はこんな感じ。

    test_boto3.py
    import boto3
    
    s3 = boto3.resource('s3',
        endpoint_url = "https://s3.isk01.sakurastorage.jp",
        aws_access_key_id = [サイト作成時のアクセスキー],
        aws_secret_access_key = [サイト作成時のシークレットアクセスキー],
        region_name = 'jp-north-1'
    )
    
    for bucket in s3.buckets.all():
        print(bucket)
    
  2. test_boto3.pyを実行して、作成したテストバケットが表示されるか確認します。

    $ python test_boto3.py
    

オブジェクトストレージにファイルをアップする

ubuntu上にあるtest_file_py.txtをオブジェクトストレージにアップしてみます。

  1. /tmpフォルダ直下にtest_file_py.txtを用意しておきます。

    $ vi /tmp/test_file_py.txt
    (中身は適当に記述して保存しておきます)
    
  2. test_boto3.pyに以下の記述を追加します。

    test_boto3.py
    # アップロード先のバケット名
    bucket_name = "test-bucketxxxx"
    
    # アップロードするファイル
    upload_file = "/tmp/test_file_py.txt"
    
    # オブジェクトストレージ上で表示されるファイル名
    obj_name = "test_file_py.txt"
    
    # ファイルのアップロード
    s3.Bucket(bucket_name).upload_file(upload_file, obj_name)
    
  3. test_boto3.pyを実行します。

    $ python test_boto3.py
    
  4. Webブラウザでオブジェクトストレージにファイルがアップされているか確認します。
    image.png

補足というか余談

boto3を使用する際、boto3.client()とboto3.resource()があって混乱しました。

どうやらboto3.client()は低レイヤーサービスへのアクセス(辞書型データが返ってくる)
boto3.resource()は高レイヤーサービスへのアクセス(s3オブジェクトが返ってくる)
という感じのようです。

boto3.resource()の方がコードの可読性が高くなるので
基本的にboto3.resource()を使っておくのが正解のようです。

おわりに

AWS様の力をお借りしつつ、Pythonを使って
さくらのオブジェクトストレージにファイルをアップすることができました。

いつ使用できなくなるのか若干の不安はありますが、
Python上から操作できるのは、やっぱり便利ですね。

今後も「Python × さくらのクラウド」な小技を見つけたら
記事に残したいなと(現時点では)思っています。

参考記事など

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?