Secrets Manager からシークレットまたはシークレット値を取得する - AWS CloudFormation

Secrets Manager からシークレットまたはシークレット値を取得する

Secrets Manager は、データベース認証情報、パスワード、サードパーティー API キーなどのシークレットを安全に保存および管理できるようにするサービスです。Secrets Manager を使用すると、これらのシークレットへのアクセスを一元的に保存および制御できるため、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API 呼び出しに置き換えて、プログラムでシークレットを取得できます。詳細については、『AWS Secrets Manager ユーザーガイド』の「What is AWS Secrets Manager? ( とは?)」 を参照してください。

CloudFormation テンプレート内の Secrets Manager に保存されているシークレット全体またはシークレット値全体を使用するには、secretsmanager 動的参照を使用します。

ベストプラクティス

CloudFormation テンプレートで Secrets Manager の動的参照を使用する場合は、次のベストプラクティスに従ってください。

  • CloudFormation テンプレートにバージョンレス参照を使用する – Secrets Manager に認証情報を保存し、適切なシークレットローテーションワークフローをサポートするために version-stage または version-id パラメータを指定せずに動的参照を使用します。

  • 自動ローテーションの活用 – Secrets Manager の自動ローテーション機能を使用して、認証情報管理のためのバージョンレスの動的参照を行います。これにより、テンプレートを変更することなく、認証情報が定期的に更新されます。詳細については、「AWS Secrets Manager シークレットのローテーション」を参照してください。

  • バージョン付き参照の使用は控えめにする – テストやロールバックなどの特定のシナリオでは、明示的な version-stage または version-id パラメータのみを指定します。

考慮事項

secretsmanager 動的参照を使用する場合は、次のような重要な考慮事項に留意する必要があります。

  • CloudFormation は、以前のデプロイで使用されたシークレットのバージョンを追跡しません。動的な参照を実装する前に、シークレット管理戦略を慎重に計画してください。可能な場合はバージョンレス参照を使用して、自動シークレットローテーションを活用します。バージョンがない動的参照からバージョン付きの動的参照に移行する場合など、動的参照設定に変更を加えるときは、リソースの更新をモニタリングして検証します。

  • Secrets Manager のシークレット値のみを更新しても、CloudFormation は自動的に新しい値を取得しません。CloudFormation は、リソースの作成時または動的参照を含むリソースを変更する更新時にのみシークレット値を取得します。

    例えば、テンプレートに、MasterPassword プロパティが Secrets Manager 動的参照に設定されている AWS::RDS::DBInstance リソースが含まれているとします。このテンプレートからスタックを作成したら、Secrets Manager でシークレットの値を更新します。ただし、MasterPassword プロパティは古いパスワード値を保持します。

    新しいシークレット値を適用するには、CloudFormation テンプレートで AWS::RDS::DBInstance リソースを変更し、スタックの更新を実行する必要があります。

    今後この手動プロセスを回避するには、Secrets Manager を使用してシークレットを自動的にローテーションすることを検討してください。

  • secretsmanager などの安全な値の動的参照は、現在カスタムリソースではサポートされていません。

  • secretsmanager の動的な参照は、すべてのリソースプロパティで使用できます。secretsmanager の動的な参照を使用することは、Secrets Manager ログも CloudFormation ログも解決済みのシークレットの値を保持してはならないことを示します。ただし、シークレット値は、それが使用されているリソースを持つサービスに表示されることがあります。シークレットデータが漏れるのを防ぐために、使用方法を確認します。

アクセス許可

Secrets Manager に保存されているシークレットを指定するには、シークレットに対して GetSecretValue を呼び出すためのアクセス許可が必要です。

リファレンスパターン

CloudFormation テンプレートで Secrets Manager シークレットを参照するには、次の secretsmanager 参照パターンを使用します。

{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
secret-id

シークレット名またはシークレット ARN。

AWS アカウントのシークレットにアクセスするには、シークレット名を指定するだけです。別の AWS アカウントのシークレットにアクセスするには、そのシークレットの完全な ARN を指定します。

必須。

secret-string

SecretString はサポートされる唯一の値です。デフォルトは SecretString です。

json-key

値を取得するペアのキー名を指定します。json-key を指定しない場合、CloudFormation はシークレットテキスト全体を取得します。

このセグメントにはコロン文字 (:) を含めることはできません。

version-stage

使用するシークレットのバージョンのステージングラベル。シークレットマネージャーは、ステージングラベルがローテーション処理中にさまざまなバージョンを追跡するために使用されます。version-stage を使用する場合は、version-id を指定することはできません。version-stage または version-id、を指定しない場合、デフォルトでは AWSCURRENT というラベルの付いたバージョンが取得されます。

このセグメントにはコロン文字 (:) を含めることはできません。

version-id

使用したいシークレットのバージョンの固有識別子を指定します。version-id を指定した場合は、version-stage を指定しないでください。version-stage または version-id を指定しない場合、次にデフォルトでは AWSCURRENT というバージョンが取得されます。

このセグメントにはコロン文字 (:) を含めることはできません。

シークレットからユーザー名とパスワードの値を取得する

次の AWS::RDS::DBInstance の例では、MySecret に保存されているユーザー名とパスワードの値を取得します。この例では、バージョンレスの動的参照に推奨されるパターンを示します。このパターンは、AWSCURRENT バージョンを自動的に使用し、テンプレートの変更を必要とせずに Secrets Manager のローテーションワークフローをサポートします。

JSON

{ "MyRDSInstance": { "Type": "AWS::RDS::DBInstance", "Properties": { "DBName": "MyRDSInstance", "AllocatedStorage": "20", "DBInstanceClass": "db.t2.micro", "Engine": "mysql", "MasterUsername": "{{resolve:secretsmanager:MySecret:SecretString:username}}", "MasterUserPassword": "{{resolve:secretsmanager:MySecret:SecretString:password}}" } } }

YAML

MyRDSInstance: Type: AWS::RDS::DBInstance Properties: DBName: MyRDSInstance AllocatedStorage: '20' DBInstanceClass: db.t2.micro Engine: mysql MasterUsername: '{{resolve:secretsmanager:MySecret:SecretString:username}}' MasterUserPassword: '{{resolve:secretsmanager:MySecret:SecretString:password}}'

SecretString 全体を取得する

次の動的リファレンスは、 MySecretSecretString を取得します。

{{resolve:secretsmanager:MySecret}}

または:

{{resolve:secretsmanager:MySecret::::}}

シークレットの特定のバージョンから値を取得する

次の動的リファレンスは、 MySecretAWSPREVIOUS バージョンの password 値を取得します。

{{resolve:secretsmanager:MySecret:SecretString:password:AWSPREVIOUS}}

別の AWS アカウントからシークレットを取得する

次の動的リファレンスは、別の AWS アカウントにある MySecretSecretString を取得します。別の AWS アカウントのシークレットにアクセスするには、完全なシークレット ARN を指定する必要があります。

{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret}}

次の動的リファレンスは、別の AWS アカウントにある MySecretpassword 値を取得します。別の AWS アカウントのシークレットにアクセスするには、完全なシークレット ARN を指定する必要があります。

{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret:SecretString:password}}