share facebook facebook2 twitter menu hatena pocket slack

2014.07.17 THU

AWS SDK for Rubyで新標準となったCredentials管理方法を使ってみる

磯辺 和彦

WRITTEN BY磯辺 和彦

cloudpack磯辺です。

A New and Standardized Way to Manage Credentials in the AWS SDKsというblogの記事があったので、早速試してみた*1

credentialsファイルがない状態で、下記のコマンドを実行すと、エラーが発生する。

% ruby -raws-sdk -e 'puts AWS.config.credentials'
/Users/isobe/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/aws-sdk-1.46.0/lib/aws/core/credential_providers.rb:135:in `credentials':  (AWS::Errors::MissingCredentialsError)
Missing Credentials.

Unable to find AWS credentials.  You can configure your AWS credentials
a few different ways:

* Call AWS.config with :access_key_id and :secret_access_key

* Export AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to ENV

* On EC2 you can run instances with an IAM instance profile and credentials
  will be auto loaded from the instance metadata service on those
  instances.

* Call AWS.config with :credential_provider.  A credential provider should
  either include AWS::Core::CredentialProviders::Provider or respond to
  the same public methods.

= Ruby on Rails

In a Ruby on Rails application you may also specify your credentials in
the following ways:

* Via a config initializer script using any of the methods mentioned above
  (e.g. RAILS_ROOT/config/initializers/aws-sdk.rb).

* Via a yaml configuration file located at RAILS_ROOT/config/aws.yml.
  This file should be formated like the default RAILS_ROOT/config/database.yml
  file.

  from /Users/isobe/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/aws-sdk-1.46.0/lib/aws/core/credential_providers.rb:62:in `access_key_id'
  from /Users/isobe/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/aws-sdk-1.46.0/lib/aws/core/configuration.rb:263:in `block in credentials'
  from /Users/isobe/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/aws-sdk-1.46.0/lib/aws/core/configuration.rb:262:in `each'
  from /Users/isobe/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/aws-sdk-1.46.0/lib/aws/core/configuration.rb:262:in `credentials'
  from -e:1:in `<main>'

credentialsファイルを用意する

UNXの場合は、~/.aws/credentialsを作成し、下記のような内容を追記する。2

$ cat ~/.aws/credentials
[default]
aws_access_key_id = AKxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[account1]
aws_access_key_id = AKyyyyyyyyyyyyyyyyyy
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

さっきと同じコマンドを実行するとどうなるか。

% ruby -raws-sdk -e 'puts AWS.config.credentials'
{:access_key_id=>"AKxxxxxxxxxxxxxxxxxx", :secret_access_key=>"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}

~/.aws/credentialsファイルの、defaultセクションに記載のアクセスキーIDと、シークレットアクセスキーが入るようになっている。

これは、AWS::Core::CredentialProviders::DefaultProviderの働きとなる。使用されているCredentialProviderは、AWS.config.credentials_providerで確認できる。

% ruby -raws-sdk -e 'puts AWS.config.credentials_provider'
#<AWS::Core::CredentialProviders::DefaultProvider:0x007fa1e298ec80>

AWS CLIでは、–profileオプションを使って、別のプロファイルに切り替えることができる。これを、AWS SDK for Rubyで実現するには、下記のようにすればよい。

% ruby -raws-sdk -e 'puts AWS.config(credential_provider: AWS::Core::CredentialProviders::SharedCredentialFileProvider.new(profile_name: "account1")).credentials'
{:access_key_id=>"AKyyyyyyyyyyyyyyyyyy", :secret_access_key=>"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"}

SharedCredentialFileProvider.newの引数に、:profile_nameをキーとしてプロファイル名を渡すと、~/.aws/credentialsからそのセクションを探して使ってくれるようになる。

AWS SDKを使ってるツールは、ぜひ対応して欲しい。

*1 AWS CLIでは、1.3.13から、AWS SDK for Rubyでは、1.40.0からサポートされている。

*2 ちなみに、AWS CLIでは、以前は~/.aws/configを参照していた。こちらに含まれている、認証情報以外の設定(デフォルトのregionなど)は、そのまま利用できる。

元記事は、こちら

磯辺 和彦

磯辺 和彦

cloudpackに参加して以来、設計・構築・運用・開発・セキュリティなど様々な経験を経て、現在は主に社内インフラ関連を担当中。WEB+DB Press Vol.85に記事書きました。