Rails から Amazon Web Services を利用するときは AWS SDK for Ruby を使用する。その場合、アクセスキーやシークレットアクセスキーなどは環境変数に設定することが多い。しかし、開発用やテスト用にローカルの DynamoDB を利用するときのエンドポイントは環境変数で設定できず Aws.config
で設定する必要がある。そんなときいい感じに Aws.config
を環境別に設定する方法をメモっとく。
AWS SDK for Ruby を Gemfile に追加する
AWS SDK を導入するために gem 'aws-sdk-rails'
を Gemfile に追加する。
Gemfile
--- a/Gemfile
+++ b/Gemfile
@@ -26,6 +26,8 @@ gem 'jbuilder', '~> 2.5'
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'
+# Use AWS SDK for Ruby
+gem 'aws-sdk-rails'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
環境別設定ファイルを作成する
database.yml のように環境別の設定を記述する。依存している AWS に関わる環境変数も明示的に記述するといいと思う。
config/aws.yml
default: &default
access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %>
secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %>
region: <%= ENV["AWS_REGION"] %>
development:
<<: *default
endpoint: http://localhost:8000
test:
<<: *default
endpoint: http://localhost:8000
production:
<<: *default
イニシャライザファイルを作成する
あとはイニシャライザで Rails の起動時に設定を読み込む。Rails 4.2 から追加された Rails.application.config_for
が便利だ。
config/initializers/aws.rb
# Be sure to restart your server when you modify this file.
# Configure AWS SDK for Ruby.
Aws.config.update(Rails.application.config_for(:aws).symbolize_keys)
設定を Rails コンソールで確認する
Rails コンソールで確認すると設定が反映されていることがわかる。なお、Spring プリローダーが環境変数をキャッシュしているようなので、Spring プリローダーを一度停止してから実行するといい。
$ export AWS_ACCESS_KEY_ID=TESTKEY
$ export AWS_SECRET_ACCESS_KEY=TESTSECRET
$ export AWS_REGION=ap-northeast-1
$ bin/spring stop
$ rails c
> Aws.config
=> {:logger=>#<ActiveSupport::Logger:0x007f81e2598088 @progname=nil, @level=0, @default_formatter=#<Logger::Formatter:0x007f81e2598010 @datetime_format=nil>, @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x007f81e4c05108 @datetime_format=nil>, @logdev=#<Logger::LogDevice:0x007f81e2598ab0 @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#<File:/Users/takuya/Documents/Rails/bookshelf/log/development.log>, @mon_owner=nil, @mon_count=0, @mon_mutex=#<Thread::Mutex:0x007f81e259b620>>, @local_levels=#<Concurrent::Map:0x007f81e1c63f30 entries=0 default_proc=nil>>, :access_key_id=>"TESTKEY", :secret_access_key=>"TESTSECRET", :region=>"ap-northeast-1", :endpoint=>"http://localhost:8000"}
> exit