AWS SDK for Ruby V2


AWS SDK for Ruby V2 が2014/09/26にリリースされた。
と思ったら2015/02/05にはResourcesインターフェイスを含めた最初の安定版がリリースされた。もうpreじゃない。
主にV1との違いについて気になったことを書き連ねてみた。

リポジトリはここ。
https://github.com/aws/aws-sdk-core-ruby
APIドキュメントはここ。
http://docs.aws.amazon.com/sdkforruby/api/frames.html

# インストール

こちらの公式ブログにバージョンの差異についてまとめられているので一読することをお勧めする。
あと、V1前提のライブラリ作者向けにV1の使用を明示することを推奨(強)している。

[Upcoming Stable Release of AWS SDK for Ruby - Version 2](http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2)

## gem install aws-sdk

gemコマンドでインストールする時に、こうしている人が多いと思う。
しかし、V2も `aws-sdk` でリリースされるようなので、ある日しれっとV2がインストールされることになる→なった(2015/02/05)。

V1をインストールするには `-v` でバージョンを指定する。
`aws-sdk` と `aws-sdk-v1` というgemがインストールされる。

```bash
gem install aws-sdk -v '~>1'
```

V2をインストールするのにバージョン指定は不要だが、V3が出たときに同じことになるので指定したほうがいいと思う。
`aws-sdk` と `aws-sdk-core` と `aws-sdk-resources` というgemがインストールされる。

```bash
gem install aws-sdk -v '~>2'
```

## Gemfile

Gemfileにこう書いている人もまた多いと思う。

```ruby:Gemfile
gem 'aws-sdk'
```

### V1

V1で固定したいなら明示する。

```ruby:Gemfile
gem 'aws-sdk', '~>1'
```

```ruby:ruby
require 'aws-sdk'
```

ただし、冒頭で書いたようにライブラリの場合はその利用者が `require 'aws-sdk'` を使う選択肢を残すため、V1の利用を明示することが推奨されている。

> If you maintain a gem that has a dependency on version 1 of aws-sdk, I strongly recommend that you replace it with a dependency on aws-sdk-v1. This allows end users to require version 2 of aws-sdk.

```ruby:ruby
require 'aws-sdk-v1'
```

### V2

V2の場合もV1と同様。

```ruby:Gemfile
gem 'aws-sdk', '~>2'
```

```ruby:ruby
require 'aws-sdk'
```

### V1&V2

どうでもいいがトップレベルの名前空間が違うのでV1とV2は同居できる(`AWS` → `Aws`)。
同居させる場合はこのように書く。段階的な移行が出来るのかもしれない。
前提として `aws-sdk` → `aws-sdk-resources` → `aws-sdk-core` と芋づる式に require されるようになっている。
新規ユーザでV1使う人いるのかって話だけど・・・

#### 既存ユーザ向け(V1メイン)

```ruby:Gemfile
gem 'aws-sdk', '~> 1'
gem 'aws-sdk-resources', '~> 2'
```

```ruby:ruby
require 'aws-sdk' # v1
require 'aws-sdk-resources'
```

#### 新規ユーザ向け(V2メイン)

```ruby:Gemfile
gem 'aws-sdk-v1'
gem 'aws-sdk', '~> 2'
```

```ruby:ruby
require 'aws-sdk-v1'
require 'aws-sdk' # v2
```

[Upcoming Stable Release of AWS SDK for Ruby - Version 2](http://ruby.awsblog.com/post/TxFKSK2QJE6RPZ/Upcoming-Stable-Release-of-AWS-SDK-for-Ruby-Version-2)

## 依存関係

V1では `nokogiri` に依存していたのでgemのインストールに時間がかかっていたが、
V2では `nokogiri` 不要になったようなのでサクッとインストールできるようになった。

代わりに `multi_json` と `multi_xml` が入る。
ラッパーなので別途パーサが必要。デフォルトでは `json` と `rexml` が使われるので `oj` `ox` をインストールしておいたほうがいい。
特に `rexml` は pure ruby で遅そうだし、APIの戻り値はXMLなので `ox` は必須と思う。

# API

基本的にクラスは `Aws::XXX::Client` しかない。
例えば `Aws::S3.new` は deprecated でV2リリース時には消える。
代わりに `Aws::S3::Client` の使用が推奨されている。

そんなこともあろうかとV1の頃から `AWS::XXX::Client` しか使ってない人は比較的ラクに移行できるかもしれない。

## Resource Interfaces

一応V1のようなインターフェイスも用意されている。
使うならaws.rbで何のAPIがどれだけ呼び出されるか確認しながら開発するといいと思う。

```ruby:ruby
s3 = Aws::S3::Resource.new
```

ちなみにV2からはメモ化が不要になった。
V1よりは良くなってきていると思う。

[Ruby SDK Version 2 and Memoization](http://ruby.awsblog.com/post/Tx2I4U7QAOJYNDY/Ruby-SDK-Version-2-and-Memoization)

## APIバージョン

V1では `AWS::EC2::Client::V20140501` のようにAPIバージョンごとのクライアントが用意されており、
コンストラクタに `:api_version` を渡すことでバージョンを切り替えることが出来た(もしくは直接使う)。

V2からはバージョンごとのクライアントはなくなりバージョンは固定になった模様。
同時に `:api_version` は使えなくなった。

## DynamoDB

V1とV2でデフォルトの `:api_version` が変わっているので、
V1でも `:api_version` に `2012-08-10` を指定して使ったほうがいいかも。