仕事で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の操作をする - プログラマになりたい(ファイルの取得関係が詳しい)

Posted by あかさた
最近のエントリ
最近の読書メモ