【初心者】RailsでAmazonAPIを使ってみよう！

アプリケーションを開発する際、外部APIを利用すると効率的に進められることがあるかと思います。

商品のAPIで言えば、**AmazonAPIや楽天API**が有名ですね。

僕はプログラミングスクールで楽天APIの利用方法を学びましたが、ポートフォリオにはAmazonAPIを利用します。

そのため、公式のGitHubなどを見ながらなんとか実装する必要がありました。

今回は、RailsのアプリケーションでAmazonAPIを利用するための設定方法をまとめます。

#0.参考

[amazon-ecs公式GitHub](https://github.com/jugend/amazon-ecs)

[Amazon Product Advertising APIで返却されたItemのXML構造](https://qiita.com/yatta47/items/8df1944dd868f8232f3f)

[amazonAPIを使って商品情報取得](https://www.alt-plus.jp/archives/950)

[【Rails】Amazon APIで書籍検索アプリ作成](https://qiita.com/tatsuki-m/items/043f14e7d4504277c947)

#1.Railsアプリケーション作成

任意のアプリケーション名（本記事では、「amazonapi」と命名）でRailsアプリケーションを作成します。

次に、データベースを作成します。

そして、無事Railsが起動していることを確認しましょう。

```
rails new amazonapi #任意のアプリケーション名で作成
rails db:create #データベース作成
rails server #アプリケーション起動確認
```

#2.Gemfileのインストール
2つのGemfileをインストールします。

まず、`amazon-ecs`はAmazonAPIを利用するためのGemfileになります。

次に、`dotenv-rails`は環境変数を管理するためのGeimfileで`.env`ファイルに変数を記載すると、プログラムが環境変数として認識してくれるようになります。

そして`bundle install`でインストール。

```
gem 'amazon-ecs'
gem 'dotenv-rails'
```

#3.環境変数の宣言

`initializers`という初期化設定用のフォルダに新たに`amazon_ecs.rb`というファイルを作成します。

意味合いとしてはざっくりと、**amazonAPIの設定は、詳しくは環境変数のファイルに書いてあるよ**と、というような宣言をしています。

具体的には`Amazon::Ecs`の`configure(設定)`を`options`という配列に代入します。

`options`の中身は、`[:AWS_access_key_id]`は`ENV(.envファイル）`の`AWS_ACCESS_KEY_ID`だよ、と宣言します。

以下、`[:AWS_secret_key]`と`[:associate_tag] `も同様です。

[amazon-ecs公式GitHub](https://github.com/jugend/amazon-ecs)をアレンジして、環境変数に.envファイルを用いる形ですね。

```config/initializers/amazon_ecs.rb
Amazon::Ecs.configure do |options|
  options[:AWS_access_key_id] = ENV['AWS_ACCESS_KEY_ID']
  options[:AWS_secret_key] = ENV['AWS_SECRET_KEY']
  options[:associate_tag] = ENV['ASSOCIATE_TAG']
end
```

#4.環境変数の設定

先ほど宣言した環境変数を具体的に記載するため新たに`.env`ファイルを作成します。

```ruby:.env
AWS_ACCESS_KEY_ID = アクセスキーID
AWS_SECRET_KEY = シークレットキー
ASSOCIATE_TAG = アソシエイトタグ（トラッキングID）
```

#5.gitignore追記

.envファイルは絶対にgitにあげてはならないので、gitにあげない設定をします。


```ruby:.gitignore
.env
```

#6.コンソールで確認

`ruby`というキーワードで、`jp(日本)`のamazon内の検索をします。

これまでの設定がうまくいっていれば、XML形式のデータがドバッと出力されます。

[amazon-ecs公式GitHub](https://github.com/jugend/amazon-ecs)の変数をアレンジして、`country`をukからjpに変えています。

```
res = Amazon::Ecs.item_search('ruby', :country => 'jp')
```
設定がうまくいっていないと、下記のようなエラーになりますので、アクセスキーIDやシークレットキーを再確認しましょう。

##エラー1
`Amazon::RequestError (HTTP Response: 403 Forbidden - Request must contain AWSAccessKeyId.)`

AWSAccessKeyId（アクセスキーID）が送信できていないエラーです。

##エラー2

`Amazon::RequestError (HTTP Response: 403 Forbidden - The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.)`

AWSAccessKeyId（アクセスキーID）とAWS Secret Access Key(シークレットキー)の組み合わせが正しくないというエラーです。

##エラー3

`HTTP Response: 503 Service Unavailable - AWS Access Key ID: XXXXXXXXXXXXXXX. You are submitting requests too quickly. Please retry your requests at a slower rate.`

検索条件（今回で言えば`('ruby', :country => 'jp')`）に誤りがある場合に出力されるエラーメッセージです。検索条件を変えながらうまく出力されるよう工夫してみましょう。

#7.取得できる値

```ruby:items_controller.rb
res.items.each do |item|
  item.get('ItemAttributes/Title'), #商品タイトル
  item.get('LargeImage/URL'), #商品画像URL
  item.get('DetailPageURL'), #商品詳細URL
  item.get('ASIN'), #商品にユニークなコード
  item.get('ItemAttributes/Brand'), #ブランド(メーカー)
  item.get('ItemAttributes/Manufacturer'), #ブランド(メーカー)
  item.get('ItemAttributes/Publisher'), #ブランド(メーカー)  
  item.get('ItemAttributes/Studio'), #ブランド(メーカー)
  item.get('OfferSummary/LowestNewPrice/FormattedPrice'), #参考(情報取得時点の実売)価格を¥表示)
  item.get('ItemAttributes/ListPrice/FormattedPrice'), #値引き前(情報取得時点の)価格を¥表示)

end

```

#RailsでAmazonAPIを使う方法まとめ

amazonAPIを実装するにあたって、環境変数の理解が深まりました。

今後は、amazonAPIからはどのような値が得られるのか、そしてアプリケーションではどのように使うのかといったところを学んでいきたいと思います。