

# 获取 Systems Manager Parameter Store 中的安全字符串值
<a name="dynamic-references-ssm-secure-strings"></a>

在 CloudFormation 中，您可以将密码和许可证密钥等敏感数据作为“安全字符串”存储在 Amazon Systems Manager Parameter Store 中，从而在不直接在模板中直接公开的情况下使用这些数据。有关 Parameter Store 的介绍，请参阅《Amazon Systems Manager 用户指南》中的 [Amazon Systems Manager Parameter Store](https://docs.amazonaws.cn/systems-manager/latest/userguide/systems-manager-parameter-store.html)**。

要在模板中使用 Parameter Store 安全字符串，请使用 `ssm-secure` 动态引用。CloudFormation 永远不会存储实际的安全字符串值，而是仅存储包含安全字符串的纯文本参数名称的明文动态引用。

在创建或更新堆栈期间，CloudFormation 会根据需要访问安全字符串值，而不会暴露实际值。安全字符串只能用于支持 `ssm-secure` 动态引用模式的资源属性。有关更多信息，请参阅 [对安全字符串支持动态参数模式的资源](#template-parameters-dynamic-patterns-resources)。

CloudFormation 不会在任何 API 调用中返回安全字符串的实际参数值，而是仅返回明文动态引用。在使用更改集比较更改时，CloudFormation 仅会比较明文动态引用字符串，而不会解析并比较实际的安全字符串值。

使用 `ssm-secure` 动态引用时，需要注意几个重要的事项：
+ CloudFormation 无法访问来自其他 Amazon Web Services 账户的 Parameter Store 值。
+ CloudFormation 不支持在动态引用中使用 Systems Manager 参数标签或公有参数。
+ 在 `cn-north-1` 和 `cn-northwest-1` 区域，Systems Manager 不支持安全字符串。
+ 自定义资源中目前不支持对安全值的动态引用，例如 `ssm-secure`。
+ 如果 CloudFormation 需要回滚堆栈更新，同时先前指定的安全字符串参数版本不再可用，则回滚操作将会失败。在这种情况下，您有两个选择：
  + 使用 `CONTINUE_UPDATE_ROLLBACK` 跳过资源。
  + 在 Systems Manager Parameter Store 中重新创建安全字符串参数，并更新它，直到参数版本达到模板中使用的版本。然后使用 `CONTINUE_UPDATE_ROLLBACK` 而不跳过该资源。

## 对安全字符串支持动态参数模式的资源
<a name="template-parameters-dynamic-patterns-resources"></a>

支持 `ssm-secure` 动态引用模式的资源包括：


| 资源 | 属性类型 | 属性 | 
| --- | --- | --- | 
| [AWS::DirectoryService::MicrosoftAD](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-microsoftad.html) |  | `Password` | 
| [AWS::DirectoryService::SimpleAD](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-simplead.html) |  | `Password` | 
| [AWS::ElastiCache::ReplicationGroup](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticache-replicationgroup.html) |  | `AuthToken` | 
| [AWS::IAM::User](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) | [LoginProfile](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html) | `Password` | 
| [AWS::KinesisFirehose::DeliveryStream](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-kinesisfirehose-deliverystream.html) | [RedshiftDestinationConfiguration](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html) | `Password` | 
| [AWS::OpsWorks::App](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-app.html) | [源](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-app-source.html) | `Password` | 
| [AWS::OpsWorks::Stack](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-stack.html) | [CustomCookbooksSource](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-stack-source.html) | `Password` | 
| [AWS::OpsWorks::Stack](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-stack.html) | [RdsDbInstances](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-stack-rdsdbinstance.html) | `DbPassword` | 
| [AWS::RDS::DBCluster](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html) |  | `MasterUserPassword` | 
| [AWS::RDS::DBInstance](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) |  | `MasterUserPassword` | 
| [AWS::Redshift::Cluster](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-redshift-cluster.html) |  | `MasterUserPassword` | 

## 引用模式
<a name="dynamic-references-ssm-secure-pattern"></a>

要在 CloudFormation 模板中引用 Systems Manager 参数存储中的安全字符串值，请使用以下 `ssm-secure` 引用模式。

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

您的引用必须遵循以下参数名称和版本的正则表达式模式：

```
{{resolve:ssm-secure:[a-zA-Z0-9_.\-/]+(:\d+)?}}
```

`parameter-name`  
 Parameter Store 中的参数的名称。参数名称区分大小写。  
必需。

`version`  
一个整数，指定要使用的参数的版本。如果您没有指定确切的版本，CloudFormation 将在创建或更新堆栈时使用参数的最新版本。有关更多信息，请参阅《Amazon Systems Manager 用户指南》中的[使用参数版本](https://docs.amazonaws.cn/systems-manager/latest/userguide/sysman-paramstore-versions.html)**。  
可选。

## 示例
<a name="dynamic-references-ssm-secure-example"></a>

以下示例使用 `ssm-secure` 动态引用将 IAM 用户的密码设置为存储在 Parameter Store 中的安全字符串。如指定的那样，CloudFormation 将使用 `{{IAMUserPassword}}` 参数的版本 {{`10`}} 进行堆栈和更改集操作。

### JSON
<a name="dynamic-references-ssm-secure-example.json"></a>

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

### YAML
<a name="dynamic-references-ssm-secure-example.yaml"></a>

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