CloudFormationでSecrets Managerの秘匿情報を生成する
やりたいこと
Secrets Managerでシークレット情報を作成するにあたり、直接環境をいじりたくなかったのでどうにかCloudFormationで出来ないかと思って調べてみました。すると、どうやらランダムに生成してくれる設定があるようで、そのやり方を簡潔に残しておきたいと思います。
CloudFormation
AWSTemplateFormatVersion: "2010-09-09"
Resources:
SecretInformation:
Type: "AWS::SecretsManager::Secret"
Properties:
Name: "secret_for_something"
Description: "secret_for_something"
GenerateSecretString:
SecretStringTemplate: '{"secret_key": "password"}'
GenerateStringKey: secret_key
PasswordLength: 64
ExcludeCharacters: "\"@'%$#&().,{_?<≠^>[:;`+*!]}=~|¥/\\"
Tags:
- Key: "Name"
Value: "secret_for_something"
実行後
このファイルでスタックを作成すると、以下のようになります。
ちゃんとランダムの文字が生成されているのが確認できます。
コードの詳細
yml の中身を一つずつ見ていきたいと思います。
# 現在は2010-09-09のみ利用できます。
AWSTemplateFormatVersion: "2010-09-09"
# スタックに含めるリソースを書いていきます。
Resources:
# ロジカルID。一意のIDを指定。
SecretInformation:
# リソースのタイプ。
Type: "AWS::SecretsManager::Secret"
# リソースのプロパティ。ここで色々設定します。
Properties:
# シークレットの名前
Name: "secret_for_something"
# シークレットの説明
Description: "secret_for_something"
# ここが重要。
GenerateSecretString:
# key:valueのテンプレート
SecretStringTemplate: '{"secret_key": "password"}'
# 作成するシークレット情報のキー
GenerateStringKey: secret_key
# ランダム文字列の文字数
PasswordLength: 64
# 文字列に含めない、文字
ExcludeCharacters: "\"@'%$#&().,{_?<≠^>[:;`+*!]}=~|¥/\\"
# タグ
Tags:
- Key: "Name"
Value: "secret_for_something"
ポイント
GenerateSecretString
ランダム文字列生成をする場合は、GenerateSecretString
のセッションを追加します。そのセッションに色々書いていきます。
SecretStringTemplate & GenerateStringKey
テンプレートとキーを設定することができます。ここでの注意点としては、これらを書く場合は両方書く必要があります。片方しか書いていない場合は、スタックの展開に失敗します。
また、テンプレートはJSON形式で指定してあげます。仮に、以下のように書くとSecretStringTemplate
のキーの値がkey
なのに対して、GenerateStringKey
の値がsecret_key
で一致していないため、SecretStringTemplate
の方もシークレットとして作成されます。不必要なシークレットが作成されることになり混乱する可能性があるため、一致させておいたほうが良いでしょう。
SecretStringTemplate: '{"key": "value"}'
GenerateStringKey: secret_key
PasswordLength
生成する文字列の文字数を指定できます。
指定しない場合のデフォルト値は32
文字となっています。
ExcludeCharacters
文字列生成時に含めない文字を指定することができます。\
などはエスケープしてあげる必要があります。注意点としては、特殊文字を全部指定してしまうと、以下のエラーが出てスタック作成に失敗します。
All characters of the desired type have been excluded. (Service: AWSSecretsManager; Status Code: 400;....
1つも特殊文字を使いたくない場合は、ExcludePunctuation: true
を代わりに設定してあげます。
Discussion