AWS SDK for Ruby

投稿日 2015/02/15

[Home] 前の記事 次の記事 当サイトのオリジナルRubyリファレンス Python SDK はこちら AWS SDK for Ruby API

準備

証明書 (Credentials) の取得とインストール

AWS SDK for Ruby を使うためには、証明書 (Credentials) が必要になります。これは、AWS CLI が使える環境ならすでに作成・インストール済みです。もし、AWS CLI が使えないなら新たに証明書を取得する必要があります。詳しくは「AWS CLIの使い方」を参照してください。


AWS SDK fo Ruby のインストール

Linux または Windows どちらもデフォルトでは ruby はインストールされていないので、もし、インストールされていなければ、(例) Ubuntu なら下のようにしてインストールします。

sudo apt-get install ruby

これで gem コマンドが使えるようになるので、下のようにして SDK をインストールします。

sudo gem install aws-sdk

 

最初の一歩

SDK は EC2, S3 など代表的なサブシステム以外もサポートしていますが、最も需要の多そうな S3 を例に説明します。

S3 への接続

証明書ファイルは ~/.aws フォルダの中にありますが、そこからキーの内容をコピーしてハードコーディングしたのが下の例です。これで接続できなければ他の方法もダメでしょうね。うまく S3 に接続できればバケツ一覧が表示されます。この方法はセキュリティ上、あまり好ましくないので常用するのには向きません。どうせやるなら、~/aws/config ファイルからデータを読み取って、その内容を使ったほうがいいです。

#!/usr/bin/ruby
# coding: utf-8
require 'aws-sdk'
Aws.config[:region] = 'us-west-2'  # リージョン指定
credentials = Aws::Credentials.new('AKIA???????W45A', 'hb3yJ???????????????????????miaqD8w')
s3 = Aws::S3::Client.new(credentials: credentials)
rp = s3.list_buckets
p rp.buckets.map(&:name)
puts "Done."

下の例は、前のとほとんど同じですが、構成情報 Aws.config[] に証明書の情報を格納しています。こうしておくと、S3 オブジェクトの取得が s3 = Aws::S3::Client.new と簡単になるので、大きなプログラムでは有利ですね。

#!/usr/bin/ruby
# coding: utf-8
require 'aws-sdk'
Aws.config[:region] = 'us-west-2'  # リージョン指定
Aws.config[:credentials] = Aws::Credentials.new('AKIAI???????W45A', 'hb3yJ?????????????????aqD8w')  # 証明書
s3 = Aws::S3::Client.new
rp = s3.list_buckets
p rp.buckets.map(&:name)
puts "Done."

環境変数 AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY に証明書の情報を設定すると、ライブラリ側で環境変数を読み取ってくれて接続情報として使うので、下のようにコードが短くなります。

#!/usr/bin/ruby
# coding: utf-8
#  ENV['AWS_ACCESS_KEY_ID'] と ENV['AWS_SECRET_ACCESS_KEY'] が必要。
require 'aws-sdk'
s3 = Aws::S3::Client.new(region: 'us-west-2')
rp = s3.list_buckets
p rp.buckets.map(&:name)
puts "Done."

さらに環境変数 AWS_REGION を設定すれば、下のようにリージョン指定も不要になります。

#!/usr/bin/ruby
# coding: utf-8
#  ENV['AWS_ACCESS_KEY_ID'] と ENV['AWS_SECRET_ACCESS_KEY'], ENV['AWS_REGION'] が必要。
require 'aws-sdk'
s3 = Aws::S3::Client.new
rp = s3.list_buckets
p rp.buckets.map(&:name)
puts "Done."

 

SDK の構成

AWS SDK for Ruby S3 の構成ですが、下のようになっています。この他に EC2 や RDS 等々もあるので結構膨大です。

AWS SDK for Ruby S3 の構成

EC2, RDS, IAM も以下に示します。

AWS SDK for Ruby EC2 の構成
AWS SDK for Ruby RDS の構成
AWS SDK for Ruby IAM の構成

 

S3 API の内容

前に示した "AWS SDK for Ruby S3 の構成" を見ると、Client は Base から派生していますが、多くのクラスが Resource から派生しています。そして、Resource 自身も Resources::Resource から派生しています。以下に主要なクラスの概要を示します。


Client クラス

このクラスは証明書を使って S3 に接続するのに使います。

s3 = Aws::S3::Client.new(
  region: region_name,
  credentials: credentials
)

以下に主なメソッドを示します。(この他にもメソッドは多数あります)


Resource クラス

リソース指向の S3 API を提供するクラスです。Client オブジェクトからも S3 のサブオブジェクトの操作が直接可能ですが、Resource クラスは Bucket オブジェクトを取得して、そのサブオブジェクトとして各種オブジェクトを操作します。

環境変数 AWS_ACCESS_KEY_IDなどが設定してある場合、構築は下のようにします。

resource = Aws::S3::Resource.new

環境変数が設定していない場合は、クライアントを指定する必要があります。

client = Aws::S3::Client.new(region: 'us-west-2')
resource = Aws::S3::Resource.new(client: client)

S3::Resource クラスは次のようなメンバーを持ちます。


Bucket クラス

Bucket クラスは Resource クラスから派生しています。この Resource クラス とは S3::Resource でなく、Resources::Resource クラスです。したがって、Bucket オブジェクトはコンストラクタを使ってインスタンス化するのではなく、S3::Resource オブジェクトから取得します。

bucket = resource.bucket('bucket_name')

以下に主なメソッドを示します。(この他にも多数のメソッドがあります)


Object クラス

Object オブジェクトは Bucket.object メソッドなどで取得できます。以下に主なフィールドやメソッドを示します。(この他にも多数のフィールドやメソッドがあります)

フィールド

メソッド


Errors クラス

S3 はエラーが発生すると次のようなエラーオブジェクトを発生させます。

サービスエラーは次のようにしてキャッチできます。

begin
  ....
rescue Aws::S3::Errors::ServiceError
  ....
end

 

サンプル集

以下のサンプルは、環境変数 AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY および AWS_REGION が正しく設定されている条件で動作します。


Resource の使用例

#!/usr/bin/ruby
# coding: utf-8
require 'aws-sdk'
res = Aws::S3::Resource.new
bucket = res.bucket('bucket01')
p bucket.url  # このバケツのURLを表示
puts 'Done.'

オブジェクト (ファイル, ディレクトリ) 一覧を取得する

このサンプルは、バケツ内のオブジェクト一覧を取得してその名前を一覧表示します。

#!/usr/bin/ruby
# coding: utf-8
require 'aws-sdk'
s3 = Aws::S3::Client.new
obj = s3.list_objects(bucket: 'bucket02')
obj.contents.each do |x|
  puts x.key
end
puts 'Done.'

S3 接続用モジュール

以下のサンプルは、環境変数が設定されていない場合も動作する S3 に接続するためのモジュールとその使用例です。

s3conn.rb モジュール

require 'inifile'
require 'aws-sdk'
module S3conn
 CREDENTIALS_FILE = '/home/ubuntu/.aws/config'
 # connect to S3
 def connect()
   if not (ENV.has_key?('AWS_ACCESS_KEY_ID') and ENV.has_key?('AWS_SECRET_ACCESS_KEY') and ENV.has_key?('AWS_REGION')) then
     conf = IniFile.load(CREDENTIALS_FILE)
     key_id = conf['default']['aws_access_key_id']
     secret_key = conf['default']['aws_secret_access_key']
     Aws.config[:region] = conf['default']['region']
     Aws.config[:credentials] = Aws::Credentials.new(key_id, secret_key)
   end
   s3 = Aws::S3::Client.new
 end
 module_function :connect
end

上のモジュールの使用例

#!/usr/bin/ruby
# coding: utf-8
require './s3conn.rb'
s3 = S3conn.connect
obj = s3.list_objects(bucket: 'big10be')
obj.contents.each do |x|
  puts x.key
end
puts 'Done.'

オブジェクトのACL

ACL は Access Control List の略で、あるオブジェクトのアクセス許可のリストです。これはオブジェクトの acl メソッドで取得できます。

#!/usr/bin/ruby
# coding: utf-8
require 'aws-sdk'
def nil2str(v)
 if v.nil? then
   v = 'nil'
 end
 return v
end

resource = Aws::S3::Resource.new
bucket = resource.bucket('tiny10be')
obj = bucket.object('data/test.js')
acl = obj.acl
puts acl.bucket_name
acl.grants.each do |g|
 puts g.grantee.display_name
 puts g.grantee.id
 puts nil2str(g.grantee.email_address)
 puts nil2str(g.grantee.type)
 puts nil2str(g.grantee.uri)
 puts g.permission
end

ファイルのアップロード

ファイルのアップロードは、通常 Object.upload_file メソッドを使います。ただし、巨大なファイルの場合は、分割してアップロードすることもできます。

#!/usr/bin/ruby
# coding: utf-8
require 'aws-sdk'
filename = '/home/ubuntu/temp/file1.txt'
res = Aws::S3::Resource.new
key = File.basename(filename)
res.bucket('tiny10be').object('temp/' + key).upload_file(filename)
puts "Done."

ファイルのダウンロード

ファイルのダウンロードは、Object.get メソッドを使って行います。このメソッドは、ファイルの中身だけでなく属性等も同時に取得します。

#!/usr/bin/ruby
# coding: utf-8
require 'aws-sdk'
filename = '/home/ubuntu/temp/test1.txt'
res = Aws::S3::Resource.new
obj = res.bucket('tiny10be').object('temp/FileUpload.cgi').get()
File.write(filename, obj.body)
puts "Done."

 

 


 このページの先頭  前の記事 次の記事

 開設 2014年12月   著作権 2014-2015 bonk.red  連絡先: こちらからメッセージを送ってください。(お仕事も大募集)