Secrets Manager からシークレットまたはシークレット値を取得する
Secrets Manager は、データベース認証情報、パスワード、サードパーティー API キーなどのシークレットを安全に保存および管理できるようにするサービスです。Secrets Manager を使用すると、これらのシークレットへのアクセスを一元的に保存および制御できるため、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API 呼び出しに置き換えて、プログラムでシークレットを取得できます。詳細については、『AWS Secrets Manager ユーザーガイド』の「What is AWS Secrets Manager? ( とは?)」 を参照してください。
CloudFormation テンプレート内の Secrets Manager に保存されているシークレット全体またはシークレット値全体を使用するには、secretsmanager
動的参照を使用します。
考慮事項
secretsmanager
動的参照を使用する場合は、いくつかの重要なセキュリティ上の考慮事項に留意する必要があります。
-
secretsmanager
の動的な参照は、すべてのリソースプロパティで使用できます。secretsmanager
の動的な参照を使用することは、Secrets Manager ログも CloudFormation ログも解決済みのシークレットの値を保持してはならないことを示します。ただし、シークレット値は、それが使用されているリソースを持つサービスに表示されることがあります。シークレットデータが漏れるのを防ぐために、使用方法を確認します。 -
Secrets Manager でシークレットを更新しても、CloudFormation のシークレットは自動的に更新されません。CloudFormation で
secretsmanager
動的な参照を更新するには、動的な参照を含むリソースを更新するか、リソースの別のプロパティを更新することによって、secretsmanager
動的な参照を含むリソースを更新するスタック更新を実行する必要があります。たとえば、テンプレートで、AWS::RDS::DBInstance リソースの
MasterPassword
プロパティをsecretsmanager
動的な参照として指定し、テンプレートからスタックを作成するとします。後で Secrets Manager でそのシークレットの値を更新しますが、テンプレートのAWS::RDS::DBInstance
リソースは更新しません。この場合、スタックの更新を実行しても、MasterPassword
プロパティのシークレット値は更新されず、以前のシークレット値のままになります。また、Secrets Manager を使用して、セキュリティで保護されたサービスまたはデータベースのシークレットを自動的にローテーションすることを検討してください。詳細については、「AWS Secrets Manager シークレットのローテーション」を参照してください。
-
secretsmanager
などの安全な値の動的参照は、現在カスタムリソースではサポートされていません。
アクセス許可
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
のバージョンステージ値を含むバージョンです。
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 全体を取得する
次の動的リファレンスは、
の MySecret
SecretString
を取得します。
{{resolve:secretsmanager:
MySecret
}}
または:
{{resolve:secretsmanager:
MySecret
::::}}
シークレットの特定のバージョンから値を取得する
次の動的リファレンスは、
の MySecret
バージョンの AWSPREVIOUS
値を取得します。password
{{resolve:secretsmanager:
MySecret
:SecretString:password
:AWSPREVIOUS
}}
別の AWS アカウントからシークレットを取得する
次の動的リファレンスは、別の AWS アカウントにある
の MySecret
SecretString
を取得します。別の 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
}}