AWS SDK for Ruby V2でS3に接続しようと調べていると、V1とV2の情報がごっちゃになったり接続方法が色々あったりでちょっとはまったのでまとめておく。
Gemfile
以下のようにversion指定でaws-sdkをインストールする。
gem 'aws-sdk', '~>2'
ドキュメント通りなのだが、ちょっと前まではaws-sdk-coreを入れるように書かれていた気がするのでここでちょっとはまった。
これでaws-sdk-coreとaws-sdk-resourcesがインストールされる。
S3にアクセスする
オブジェクトにアクセスする場合、Aws::S3::Clientで接続する方法とAws::S3::Objectを用いる方法がある。
Aws::S3::Clientを用いる場合
credentialを元にclientを生成する。
s3 = Aws::S3::Client.new(
access_key_id: 'xxxxxxxxxx',
secret_access_key: 'xxxxxxxxxx',
region: 'xxxxx'
)
clientからオブジェクトにアクセスする。
s3.get_object(bucket: 'xxx', key: 'xxx')
これでS3からobjectを取得できる。
ただし、ここで取得したオブジェクトはAws::S3::ObjectではなくAws::PageableResponseになっており、Aws::S3::Objectでしか用意されていないメソッドは使用できない。
今回は、presigned_urlを取得したかったので非常に困った。
そのため後述するAws::S3::Objectを用いて接続する方法で行った。
※ Aws::PageableResponseからAws::S3::Objectを取得する方法があれば教えて下さい。
Aws::S3::Objectを用いる場合
Aws.configを設定する
Aws.config = {
access_key_id: 'xxxxxxxxxx',
secret_access_key: 'xxxxxxxxxx',
region: 'xxxxx'
}
Aws::S3::Objectを生成する
obj = Aws::S3::Object.new(bucket, key)
データを取得する場合、getを用いて取得する
obj.get
今回は、presigned_urlを取得したかったので以下のように取得すれば良い
obj.presigned_url(:get, expires_in: 3600)