仕事でRubyでAmazon S3にアクセスする必要があったので、公式のgemであるaws-sdkを使ってみました。このgemはS3だけではなく、一通りのサービスにアクセスできるようなので、使いこなせばかなり有用かと思われます。
この記事では、S3へのファイルのアップロードを中心に以下の内容を扱っています。
・インストール
・基本設定
・ファイルのアップロード
・ファイルの暗号化
・アクセスコントロールの設定
■ インストール
gem install aws-sdk
■ 基本設定
アクセスキーを指定して、S3のインスタンスを生成します。
require 'aws-sdk'
AWS.config(
:access_key_id => 'YOUR_ACCESS_KEY_ID',
:secret_access_key => 'YOUR_SECRET_ACCESS_KEY')
s3 = AWS::S3.new
# 以下も可
# s3 = AWS::S3.new(
# :access_key_id => 'YOUR_ACCESS_KEY_ID',
# :secret_access_key => 'YOUR_SECRET_ACCESS_KEY')
■ ファイルのアップロード
ファイルをS3に格納します。
bucket = s3.buckets['yourbucketname']
filename = "fullpath/filename.ext"
basename = File.basename(filename)
o = bucket.objects[basename]
o.write(:file => filename)
■ ファイルの暗号化(クライアントサイド)
サーバーサイド(S3)でもできますが、とりあえずクライアントサイトでも簡単なので紹介します。
# キーの生成
my_key = OpenSSL::Cipher.new("AES-256-ECB").random_key
# オブジェクトの取得
o = bucket.objects[name]
# 暗号化して書込
o.write("MY TEXT", :encryption_key => my_key)
# 復号化して読込
puts o.read(:encryption_key => my_key)
公開鍵暗号を使いたいなら以下の通り。公開鍵で暗号化して、秘密鍵で復号化します。
# キーの生成
my_key = OpenSSL::PKey::RSA.new(1024)
# オブジェクトの取得
o = bucket.objects[name]
# 暗号化して書込
o.write("MY TEXT", :encryption_key => my_key)
# 復号化して読込
puts o.read(:encryption_key => my_key)
■ アクセスコントロールの設定
S3Objectクラスのacl=メソッドを使うと、アクセスコントロールを設定してS3上のオブジェクトに反映することができます。
o = bucket.objects[name]
# Canned ACL
o.acl = :public_read
# writeメソッドに渡すことも可能
o.write(:file => filename, :acl => :public_read)
以下、渡せるアクセスコントロールポリシーです。
- :private
- :public_read
- :public_read_write
- :authenticated_read
- :bucket_owner_read
- :bucket_owner_full_control
acl=には、AccessControlListを代入することもできます。changeメソッドを使ったやり方もあります。
o.acl.change do |acl|
acl.grant(:full_control).to(:canonical_user_id => "...")
end
S3ObjectのchangeメソッドはS3Objectが返すAccessControlListのインスタンスが持つ特異メソッドなので、注意してください。ブロックの処理が完了すると、S3上のオブジェクトに反映します。(具体的にはS3Objectのacl=メソッドを呼び出します。)
ACLに関しては以下を参照してください。
acl=メソッド(AWS::S3::S3Object)
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#acl%3D-instance_method
AWS::S3::AccessControlList
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/AccessControlList.html
■ 参考情報
・
Getting Started with the AWS SDK for Ruby(AWS)
・
AWS SDK for RubyのAPIリファレンス
・
aws/aws-sdk-ruby(GitHub)
・
aws-sdkのファイルアップロードのサンプル
・
AWS SDK for RubyでS3の操作をする - プログラマになりたい(ファイルの取得関係が詳しい)