0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

さくらのオブジェクトストレージにRubyからaws-sdk-s3を用いてアクセスする

Posted at

この記事では凡そ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_idsecret_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")
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?