使用動態參考來指定範本值 - AWS CloudFormation

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用動態參考來指定範本值

動態參考提供了一種精簡且功能強大的方式,可讓您指定在其他服務 (例如 Systems Manager 參數存放區和堆疊範本) 中儲存和 AWS Secrets Manager管理的外部值。當您使用動態參考時, CloudFormation 會在堆疊和變更集合作業期間必要時擷取指定參考的值。

CloudFormation 目前支援下列動態參照模式:

  • ssm,適用於儲存在 AWS Systems Manager 參數存放區中的純文字值。

  • ssm-secure,適用於存放在 AWS Systems Manager 參數存放區的安全字串。

  • secretsmanager,針對儲存在中的完整機密或秘密值 AWS Secrets Manager。

使用動態參考時的考量

下列是您在使用動態參考時應給予的考量:

重要

我們強烈建議不要在作為資源主識別碼一部分的資源屬性中包含動態引用或任何敏感資料。

當動態參考參數包含在構成主資源標識符的屬性中時, CloudFormation 可以在主資源標識符中使用實際的純文本值。此資源 ID 可能會出現在任何衍生輸出或目的地中。

若要判斷哪些資源属性組成資源類型的主要識別碼,請參閱該資源的資源參考文件。在 Return values (傳回值) 區段中,Ref 函數傳回值表示組成資源類型主要識別碼的資源屬性。

  • 您在一個堆疊範本中最多可以包含 60 個動態參考。

  • 對於轉換,例如AWS::IncludeAWS::Serverless,在調用任何轉換之前 AWS CloudFormation 不會解析動態引用。而是將動態參考的常值字串 AWS CloudFormation 傳遞給轉換。當您使用範本來執行變更集時會解析動態參考 (包括插入所處理範本中的參考)。

  • 自訂資源中目前不支援安全值的動態參考,例如 ssm-securesecretsmanager

注意

請勿建立以反斜線 (\) 做為最終值的動態參考。 AWS CloudFormation 無法解析這些參照,這會導致資源失敗。

在堆疊範本中指定動態參考

動態參考遵守下列模式:

'{{resolve:service-name:reference-key}}''{{resolve:ssm:[a-zA-Z0-9_.\-/]+(:\d+)?}}'

service-name

指定在其中存放和管理值的服務。

必要。

目前,有效值包括:

  • ssm:Systems Manager 參數存放區純文字參數。

  • ssm-secure:Systems Manager 參數存放區安全字串參數。

    注意

    目前,cn-north-1cn-northwest-1區域中的「Systems Manager」不支援 SecureString 參數。

    如需詳細資訊,請參閱《AWS Systems Manager 使用者指南》中的 AWS Systems Manager 參數存放區

  • secretsmanager:Secrets Manager 秘密。

reference-key

參考金鑰。視動態參考的類型而定,參考金鑰可能由多個區段組成。

必要。

SSM 參數

在您的範本中,使用 ssm 動態參考來包含存放在 Systems Manager 參數存放區的 StringStringList 類型的值。

參考模式

對於 SSM 參數,reference-key 區段由參數名稱和版本編號組成。使用下列模式:

'{{resolve:ssm:parameter-name:version}}'

針對 parameter-name 和 version,您的參考必須遵守下列規則表達式模式:

'{{resolve:ssm:[a-zA-Z0-9_.-/]+:\\d+}}'

parameter-name

Systems Manager 參數存放區中的參數名稱。函數名稱區分大小寫。

必要。

version

整數,指定要使用的參數版本。如果您未指定確切的版本,則每當您建立或更新堆疊時,都 CloudFormation 會使用最新版本的參數。如需詳細資訊,請參閱《AWS Systems Manager 使用者指南》中的使用參數版本

選用。

範例

以下範例使用 ssm 動態參考,將 S3 儲存貯體的存取控制設為存放在 Systems Manager 參數存放區的參數值。如指定, CloudFormation 將使用第 2 版S3AccessControl參數進行堆疊和變更集合作業。

JSON

"MyS3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "AccessControl": "{{resolve:ssm:S3AccessControl:2}}" } }

YAML

MyS3Bucket: Type: 'AWS::S3::Bucket' Properties: AccessControl: '{{resolve:ssm:S3AccessControl:2}}'

若要指定存放在 Systems Manager 參數存放區的參數,您必須有存取權呼叫 GetParameters 以取得指定的參數。如需詳細資訊,請參閱《AWS Systems Manager 使用者指南》中的控制對 Systems Manager 參數的存取

使用 ssm 動態參考模式時應注意的其他考量:

  • 目前 CloudFormation 不支援跨帳戶 SSM 參數存取。

  • 對於自訂資源,請先 CloudFormation 解析ssm動態參考,然後再將請求傳送至自訂資源。如需詳細資訊,請參閱 自訂資源

  • CloudFormation 不支持在動態引用中使用參數標籤或公共參數。

    參數標籤是使用者定義的別名,可協助您管理不同版本的參數。如需詳細資訊,請參閱《AWS Systems Manager 使用者指南》中的標記參數

    public 參數是由服務提供供與該 AWS 服務搭配使用並儲存在 AWS Systems Manager 參數存放區中的參數。如需公有參數的範例,請參閱《Amazon Elastic Container Service 開發人員指南》中的擷取 Amazon ECS 最佳化 AMI 中繼資料

  • CloudFormation 目前不支援動態參考上的漂移偵測。對於尚未指定參數版本的 ssm 動態參考,我們建議您如果更新 SSM 中的參數版本,您也可以對包含 ssm 動態參考的任何堆疊執行堆疊更新操作,以便擷取最新的參數版本。

  • 若要驗證將在堆疊操作中使用的 ssm 動態參考版本,請為堆疊操作建立變更集。然後在 Template (範本) 索引標籤上檢閱已處理的範本

  • 參數區塊中不支援沒有版本的 SSM 參數,請改用 SSM 參數類型。如果您確實使用 SSM 參數,則必須指定要使用的 Systems Manager 參 AWS CloudFormation 數版本。

SSM 安全字串參數

使用動ssm-secure態參照模式來指定範本中的 AWS Systems Manager SecureString類型參數。對於ssm-secure動態參考, AWS CloudFormation 永遠不要儲存實際參數值。 AWS CloudFormation 在建立和更新堆疊和變更集作業期間存取參數值。目前,安全字串參數只能用於有支援 ssm-secure 動態參考模式的資源屬性

安全字串參數是需要以安全方式存放和參考的所有敏感資料。也就是說,您不想讓使用者以純文字更改或參考的資料,例如密碼或授權金鑰。如需有關安全字串的詳細資訊,請參閱《AWS Systems Manager 使用者指南》中的 Use secure string parameters (使用安全字串參數)。

安全字串參數值不會儲存在中 CloudFormation,也不會在任何 API 呼叫結果中傳回。

參考模式

對於 ssm-secure 動態參考,reference-key 區段由參數名稱和版本編號組成。使用下列模式:

'{{resolve:ssm-secure:parameter-name:version}}'

針對 parameter-name 和 version,您的參考必須遵守下列規則表達式模式:

'{{resolve:ssm-secure:[a-zA-Z0-9_.-/]+:\\d+}}'

parameter-name

Systems Manager 參數存放區中的參數名稱。函數名稱區分大小寫。

必要。

version

整數,指定要使用的參數版本。如果您未指定確切的版本,則每當您建立或更新堆疊時,都 AWS CloudFormation 會使用最新版本的參數。如需詳細資訊,請參閱《AWS Systems Manager 使用者指南》中的使用參數版本

選用。

範例

以下範例使用 ssm-secure 動態參考,將 IAM 使用者的密碼設為存放在 Systems Manager 參數存放區的安全字串。如指定, CloudFormation 將使用版本 10 的IAMUserPassword參數進行堆疊和變更集合作業。

JSON

"MyIAMUser": { "Type": "AWS::IAM::User", "Properties": { "UserName": "MyUserName", "LoginProfile": { "Password": "{{resolve:ssm-secure:IAMUserPassword:10}}" } } }

YAML

MyIAMUser: Type: AWS::IAM::User Properties: UserName: 'MyUserName' LoginProfile: Password: '{{resolve:ssm-secure:IAMUserPassword:10}}'

使用 ssm-secure 動態參考模式時應注意的其他考量:

  • CloudFormation 不會在任何 API 調用中返回安全字符串的實際參數值,而是返回文字動態引用。

  • CloudFormation 確實存儲文字動態引用,其中包含安全字符串的純文本參數名稱。

  • 對於變更集合, CloudFormation 比較常值動態參考字串。它不會解析和比較 ssm-secure 參考的實際值。

  • 自訂資源中目前不支援安全值的動態參考,例如 ssm-securesecretsmanager

  • 在 CloudFormation 必須復原堆疊更新的情況下,如果先前指定的安全字串參數版本不再可用,則該更新復原作業將會失敗。在這種情況下,請執行下列其中一項操作:

    • 使用 CONTINUE_UPDATE_ROLLBACK 略過資源。

    • 在 Systems Manager 參數存放區中重新建立安全字串參數,並更新它,直到參數版本達到範本中使用的版本。然後,使用 CONTINUE_UPDATE_ROLLBACK 而不略過資源。

  • 目前 AWS CloudFormation 不支援跨帳戶 SSM 參數存取。

  • CloudFormation 不支持在動態引用中使用參數標籤或公共參數。

    參數標籤是使用者定義的別名,可協助您管理不同版本的參數。如需詳細資訊,請參閱《AWS Systems Manager 使用者指南》中的標記參數

    public 參數是由服務提供供與該 AWS 服務搭配使用並儲存在 AWS Systems Manager 參數存放區中的參數。如需公有參數的範例,請參閱《Amazon Elastic Container Service 開發人員指南》中的擷取 Amazon ECS 最佳化 AMI 中繼資料

對安全字串支援動態參數模式的資源

目前支援 ssm-secure 動態參考模式的資源包括:

Secrets Manager 秘密

使用 secretsmanager 動態參考擷取存放於 Secrets Manager 中的全部秘密或秘密值,以用於您的範本中。秘密可能是資料庫憑證、密碼、第三方 API 金鑰或任意文字。您可以使用 Secrets Manage 集中存放或控制對這些秘密的存取,因此您可以將程式碼中的硬式編碼憑證 (包括密碼),取代為對 Secrets Manager 的 API 呼叫,以程式設計方式擷取秘密。如需詳細資訊,請參閱什麼是 AWS Secrets Manager?《AWS Secrets Manager 使用者指南》中。

將動態參考用於 Secrets Manager 秘密時的重要考量事項

使用動態參考在堆疊範本中指定 Secrets Manager 秘密時,您應該考慮下列重要的安全性考量:

  • 所有資源屬性中可以使用 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 以取得秘密。

參考模式

對於 Secrets Manager 秘密,reference-key 區段由幾個區段組成,包括秘密 ID、秘密數值金鑰、版本階段和版本 ID。使用下列模式:

{{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-stageversion-id,則預設為 AWSCURRENT 版本。

此區段可能不可包含冒號字元 (:)。

version-id

您要使用的秘密版本的唯一識別碼。如果您指定 version-id,則請不要指定 version-stage。如果您未指定 version-stageversion-id,則預設為 AWSCURRENT 版本。

此區段可能不可包含冒號字元 (:)。

範例

以下範例使用 secret-namejson-key 區段擷取存放在 MyRDSSecret 秘密中的使用者名稱和密碼值。在預設情況下,擷取的秘密版本是版本階段值為 AWSCURRENT 的版本。

JSON

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

YAML

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

指定下列區段會擷取SecretString的 MySecret。

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

指定下列區段會擷取的password值 MySecret。

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

指定下列區段會擷取SecretString另一個 AWS 帳戶中的節段。 MySecret 您必須指定完整的機密 ARN 才能存取其他 AWS 帳戶中的密碼。

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

指定下列區段會擷取另一個 AWS 帳戶中 MySecret 該區段的password值。您必須指定完整的機密 ARN 才能存取其他 AWS 帳戶中的密碼。

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

指定下列區段會擷取的AWSPREVIOUS版本password值 MySecret。

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