CloudFormationでSecrets Managerの秘匿情報を生成する


やりたいこと

Secrets Managerでシークレット情報を作成するにあたり、直接環境をいじりたくなかったのでどうにかCloudFormationで出来ないかと思って調べてみました。すると、どうやらランダムに生成してくれる設定があるようで、そのやり方を簡潔に残しておきたいと思います。

CloudFormation

SecretsManager.yml
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 の中身を一つずつ見ていきたいと思います。

SecretsManager.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 を代わりに設定してあげます。