アルバイトのMoriです。
今回はクローリング会社として、データをS3を介してクライアントに納品する際に便利な、aws-sdk for rubyを使ったS3操作のTipsについて書きたいと思います。

目次

なにを紹介するのか

業務の中でもS3を利用してファイル管理を行いたいときが多々あると思います.
そんな時に役立つTipsをいくつか書いてみました.

0. Gemfileとrequire

S3以外の必要のない機能もインストールしてしまうとかなり時間がかかります.
なので、SDKの中でS3の機能のみ使う場合には以下の方法がオススメです.

gem 'aws-sdk-s3'
require 'aws-sdk-s3'

1. アクセスキーの設定・バケットの取得

Linux または OS X のような、Unix ベースのシステムでは~/.aws/config~/.aws/credentialsに以下のように記述することでアクセスキーやシークレットキーを管理します.

  • ~/.aws/config
[default]
region = your_region
output = your_format

[profile profile_name1]
region = your_region
output = your_format

[profile profile_name2]
region = your_region
output = your_format
  • ~/.aws/credentials
[default]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key

[profile_name1]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key

[profile_name2]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key

~/.aws/config~/.aws/credentialsに認証情報を記述した場合、ソースコードからは以下のようにしてprofileを読み込むことができます

s3 = Aws::S3::Resource.new({
  profile: 'profile_name'
})

バケットの取得は、Aws::S3::Resourceクラスのオブジェクトのbucketメソッドにバケット名を渡すことで可能です.

bucket = s3.bucket('bucket_name')

2. データを指定してS3にアップロード

データを指定してS3にアップロードしたい時は以下のようにします

obj = bucket.object('obj_name')
obj.put(body: some_data)

3. ローカルファイルをS3にコピー

ローカルファイルをS3にアップロードしたい時は以下のようにします

obj = bucket.object('obj_name')
obj.upload_file('local_file_path')

4. オブジェクトのデータを変数で受け取る

オブジェクトの内容を読み込みたい時は以下のようにします

body = bucket.object('obj_name').get.body.read

5. オブジェクトをローカルにコピー

オブジェクトをローカルにファイルとしてダウンロードしたい時は以下のようにします

obj = bucket.object('obj_name')
obj.download_file('local_file_path')

6. オブジェクト一覧を取得する

バケット内のオブジェクト一覧を取得します. :prefixでマッチパターンを指定できます(前方一致のみ)

bucket.objects(:prefix => 'hoge/').each do |obj|
  puts obj.key
end

7. オブジェクトを削除する

オブジェクトを削除したい時には以下のようにします.

bucket.object('obj_name').delete

8. ライフサイクルを指定する

バックアップなど一定の時間が経過したら必要のないオブジェクトを削除したい時に使います.

ルールをJSON形式でファイルに保存しておく(この場合はrules.jsonというファイル名で保存)
以下のルールはhoge/*にマッチするオブジェクトが365日経過したら削除するもの.

[
    {
        "id":"some ID",
        "status":"Enabled",
        "filter":{"prefix":"hoge/"},
        "expiration":{"days":365},
    }
]

ライフサイクルを指定する場合はAws::S3::ResourceではなくAws::S3::Clientの方を使用します.

s3_client = Aws::S3::Client.new(region: 'ap-northeast-1', profile: 'dev1')
json_data = JSON.parse(File.read('rules.json'), opt={symbolize_names: true})
s3_client.put_bucket_lifecycle_configuration(
    :bucket => 'bucket_name',
    :lifecycle_configuration => {:rules => json_data}
)

最後に

ライフサイクルに関する記事が異様に少なかったのでRubyからライフサイクルを設定するのは邪道なのかなと感じました(^_^;)
この記事を読んで、S3のファイル操作に少しでも慣れてもらえれば幸いです.

参考になったページ