雑記帳
2014-07-11 (Fri) [長年日記]
■ [AWS] AWS SDK for Rubyで新標準となったCredentials管理方法を使ってみる
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ファイルを用意する
UN*Xの場合は、~/.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を使ってるツールは、ぜひ対応して欲しい。