この記事では凡そAWS S3互換であるとされるさくらのオブジェクトストレージに対し、Rubyのaws-sdk-s3パッケージを用いてアクセスする方法を記載します。
どのAPIが互換であるのかは以下の公式マニュアルをご確認下さい。
Gemfile
記事記載時点でのパッケージのバージョンは 1.141
です。
gem "aws-sdk-s3", '1.141'
Clientの初期化
クライアントは Aws::S3::Client
です。
client = Aws::S3::Client.new(
region: 'jp-north-1',
endpoint: "https://s3.isk01.sakurastorage.jp",
access_key_id: "01234567-89ab-cdef-0123-456789abcdef",
secret_access_key: "SAMPLETOKENSAMPLETOKENSAMPLETOKENSAM"
)
regionは現在さくらのオブジェクトストレージは石狩第1ゾーンにしか存在しないため jp-north-1
固定となります。
endpointは公式のAWS SDK 利用時の設定パラメータを参照すると isk01.sakurastorage.jp
とあるのですが、実際にエンドポイントとして設定する場合は https://s3.isk01.sakurastorage.jp
にする必要があるようです(同ページ下部のエンドポイントを指定して実行のところには同様のURLの記載があります)。
access_key_id、secret_access_keyにはさくらのオブジェクトストレージのサイト画面で発行したもの、またはパーミッションからパーミッションの追加を行い発行されたものを用います。ただし、サービス側はパーミッションの追加から生成されたアクセスキーの利用を推奨しています(パーミッションの追加から生成されたものはバケットそのものに対する直接的な操作は出来なくなります)。
Resourceの生成
この記事はClientオブジェクトから直接的にAPIを呼ぶのではなく、よりリソース指向的に扱えるとされるResourceオブジェクトを用いてアクセスします。
resource = Aws::S3::Resource.new(client: client)
ResourceオブジェクトのコンストラクタはClientと同様のオプションを受け付けます。ここではclientをベースとして作成しています。
例えばバケットの特定フォルダのファイル一覧を表示する場合、Clientで
client.list_objects({bucket: "bucket_name", prefix: "folder_name/"})
のようにアクセスするか、Resourceで
bucket = resource.bucket("bucket_name")
bucket.objects(prefix: "folder_name/")
とするかはお好みで使い分けて下さい。
バケット内のオブジェクトに対するアクセス
基本的なアクセス方法を以下に示します。各APIには様々なオプションがありますので、AWSの公式ドキュメントを参照してください(さくらのオブジェクトストレージに互換がないものは扱えませんが)。
アップロード
bucket.put_object(body: file_path, key: "path/to/name")
単一で5GBを超えるオブジェクトはput_object()
ではアップロード出来ないので、マルチパートアップロードにより対応する必要があります。RubyのAWS SDKにはupload_file()
が用意されておりこれが複雑なマルチパートアップロードを内部的にやってくれるので、put_object()
よりこちらを呼び出すと良さそうです。
bucket.object("path/to/name").upload_file(file_path)
アップロード先に既に同名のオブジェクトが存在する場合はそのオブジェクトは上書きされます。
削除
bucket.delete_objects({
delete: {
objects: objects
},
})
列挙
found_objects = bucket.objects(prefix: "path/to/folder")