本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
從 Secrets Manager 取得秘密或秘密值
Secrets Manager 是一項服務,可讓您安全地存放和管理秘密,例如資料庫登入資料、密碼和第三方 API 金鑰。您可以使用 Secrets Manage 集中存放或控制對這些秘密的存取,因此您可以將程式碼中的硬式編碼憑證 (包括密碼),取代為對 Secrets Manager 的 API 呼叫,以程式設計方式擷取秘密。如需詳細資訊,請參閱AWS Secrets Manager 《 使用者指南》中的什麼是 AWS Secrets Manager?。
若要使用儲存在 CloudFormation 範本中 Secrets Manager 中的整個秘密或秘密值,請使用secretsmanager
動態參考。
考量事項
使用secretsmanager
動態參考時,請注意幾個重要的安全考量事項:
-
所有資源屬性中可以使用
secretsmanager
動態參考。使用secretsmanager
動態參考表明 Secrets Manager 和 CloudFormation Logs 都不應存留任何已解析的秘密值。但是,秘密值在服務的資源中使用時,秘密值就可能出現在此服務中。檢閱您的使用情況,以避免洩露秘密資料。 -
在 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
-
要使用的秘密版本之預備標籤。Secrets Manager 在輪換程序期間使用預備標籤來追蹤不同版本。如果您使用
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
下列動態參考會擷取 SecretString
的
。MySecret
{{resolve:secretsmanager:
MySecret
}}
或使用:
{{resolve:secretsmanager:
MySecret
::::}}
從特定版本的秘密擷取值
下列動態參考會擷取
版本 AWSPREVIOUS
的值password
。MySecret
{{resolve:secretsmanager:
MySecret
:SecretString:password
:AWSPREVIOUS
}}
從另一個 擷取秘密 AWS 帳戶
下列動態參考會擷取另一個 中 SecretString
的 AWS 帳戶。您必須指定完整的秘密 ARN,才能存取另一個秘密 AWS 帳戶。MySecret
{{resolve:secretsmanager:
arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret
}}
下列動態參考會擷取另一個 中 MySecret
的值 AWS 帳戶。您必須指定完整的秘密 ARN,才能存取另一個秘密 AWS 帳戶。password
{{resolve:secretsmanager:
arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret
:SecretString:password
}}