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 の例では、 に保存されているユーザー名とパスワードの値を取得します。この例では、バージョンレスの動的参照に推奨されるパターンを示します。このパターンは、MySecretAWSCURRENT バージョンを自動的に使用し、テンプレートの変更を必要とせずに 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::::}}
シークレットの特定のバージョンから値を取得する
次の動的リファレンスは、 の MySecret バージョンの AWSPREVIOUS 値を取得します。password
{{resolve:secretsmanager:MySecret:SecretString:password:AWSPREVIOUS}}
別の AWS アカウントからシークレットを取得する
次の動的リファレンスは、別の AWS アカウントにある の MySecretSecretString を取得します。別の AWS アカウントのシークレットにアクセスするには、完全なシークレット ARN を指定する必要があります。
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret}}
次の動的リファレンスは、別の AWS アカウントにある の MySecret 値を取得します。別の AWS アカウントのシークレットにアクセスするには、完全なシークレット ARN を指定する必要があります。password
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret:SecretString:password}}