AWS Secrets Manager を使ってみた
https://gyazo.com/e70b4fc59e4a37c462788a65e3df2292
はじめに
APIキーや各種パスワードなどの管理をするためにAWS の Secret Manager を使ってみました。
本ブログでは API 経由でパスワードを取得するところまで。。
ちなみに、1シークレットあたり 0.5 ドル。
10,000 回の API コールあたり 0.05 ドルみたいです。(1ヶ月お試し期間あり)
シークレットを作る
コンソールから新しいシークレットを作成します。
https://gyazo.com/c408eca893b1667ba4831478730a11d6
RDS の username やパスワードも管理できるようですが、今回は APIキーにします。
キーバリューで保存できるので、テスト用に適当な値を入れます。
暗号化キーを選べるようですが、今回はデフォルトで。
https://gyazo.com/82cd529bc5b340817d6c57a253c2247f
シークレットの名前と説明を入力します。
https://gyazo.com/9cdbfbc917fbe27a577650b6beff7073
ローテートもできるようです。
AWS Lambda で専用関数も作れるらしいです。
これで保存すればシークレットが作成できます。
Gem を使って値を取得してみる
シークレットを作成したタイミングで、各言語のサンプルコードが表示されるのでそれを使用します。
IAM ロールを作る
SecretsManagerReadWrite ポリシーを持ったロールを作成します。
そしてアクセスキー、シークレットを取得します。
また、使用する環境の aws コマンドにアクセスキーを設定します。
サンプルコードをもとにクラスを作る
AWS から Gem も出ているのでそちらを使用します。
バージョンは 1.15 以上にしてください。
code:rb
require 'aws-sdk-secretsmanager'
require 'base64'
require 'json'
class AwsSecretManager
def self.get_secret(secret_name)
region_name = "ap-northeast-1"
client = Aws::SecretsManager::Client.new(region: region_name,
endpoint: endpoint_url)
begin
get_secret_value_response = client.get_secret_value(secret_id: secret_name)
rescue => e
# 例外処理は省略
raise
else
secret = if get_secret_value_response.secret_string
get_secret_value_response.secret_string
else
Base64.decode64(get_secret_value_response.secret_binary)
end
JSON.parse(secret)
end
end
end
複数のシークレットも取れるように、引数指定させました。
JSON で返却するので、キーを指定すれば取得できます。
code:rb
secrets = AwsSecretManager.get_secret('prod/test')
さいごに
例えば Twitter API キーなどを複数のアプリで使い回す時など、一元管理できて良さそうです。
一応、Capistrano でデプロイ時に取得するようにもしてみましたが、もう少し私の中でノウハウが必要かもしれません。