

# 使用偏差感知更改集
<a name="drift-aware-change-sets"></a>

偏差感知更改集是增强的 CloudFormation 更改集，使您能够以安全的方式识别和管理堆栈偏差。在 CloudFormation 之外使用底层服务的 AWS 管理控制台、AWS CLI 或 SDK 更改堆栈资源时，堆栈会偏离预期的模板配置。偏差感知更改集将模板与堆栈资源的实际状态进行比较，并使偏差的资源与其模板定义保持一致。当资源的模板定义更新为与其实际状态相匹配时，偏差感知更改集会在不修改资源的情况下重置资源的偏差状态。

使用偏差感知更改集的好处包括：
+ **预览偏差覆盖**：检测部署是否会恢复在事件响应期间所做的关键带外更改。
+ **系统的偏差协调**：通过使用模板值覆盖偏差的属性或更新模板以匹配实际资源状态，将偏差的资源与合规的模板定义安全地对齐。
+ **增强的回滚功能**：如果部署失败，请将资源恢复到部署前的实际状态，而不是以前的模板状态。
+ **完全可见性**：在进行更改之前，请确切了解您的部署将如何影响实际的资源配置。

传统的更改集可以将您当前的模板与堆栈之前的模板进行对比，但并未考虑到堆栈的偏差情况。偏差感知更改集通过提供以下三种比较来解决此问题：
+ **实际状态**：资源的实时配置。在创建更改集时，CloudFormation 将通过底层服务 API 读取您账户中的资源配置。
+ **之前的部署状态**：在您上次进行 CloudFormation 部署所用的模板中定义的配置。
+ **所需状态**：在新模板中定义的配置。

偏差感知更改集能够将所有堆栈资源的实际状态更新至与期望状态一致的状态，即便该资源在模板中并未被明确更改。

## 注意事项
<a name="drift-aware-change-sets-considerations"></a>
+ **资源类型支持**：偏差感知更改集支持将数百种资源类型的所需状态与实际状态进行对比。对于不支持的资源类型，偏差感知更改集会回退到将之前的部署状态与所需状态进行对比。请参阅支持的资源类型部分了解详细信息。
+ **只写属性**：对于包含敏感数据（密码、机密）的属性，将偏差感知更改集与之前的部署值而不是实际值进行比较。
+ **AWS 托管属性**：偏差感知更改集会保留 AWS 服务对托管属性所做的带外更改，例如自动扩缩组的所需容量。请参阅 AWS 托管的属性部分了解详细信息。
+ **外部标签键**：偏差感知更改集不会移除或修改模板中未指定的标签键，从而防止与基于属性的访问权限控制（ABAC）系统发生冲突。
+ **替换偏差的资源**：偏差感知更改集不支持对不可变属性的偏差协调处理。
+ **跨堆栈连接**：某些资源类型（例如 `AWS::IAM::Policy`）可能会影响其他资源类型的实际状态，例如 `AWS::IAM::Role`。偏差感知更改集可以处理堆栈中资源的连接。如果通过连接来自其他堆栈的辅助资源来修改资源，则偏差感知更改集会将修改检测为偏差，并可以恢复连接。常用的可连接资源包括 `AWS::IAM::Policy`、`AWS::IAM::ManagedPolicy`、`AWS::EC2::SecurityGroupIngress` 和 `AWS::EC2::SecurityGroupEgress`。

## AWS 托管属性
<a name="aws-managed-properties"></a>

您可以为活动的 AWS 管理配置特定的资源属性。例如，您可以允许 Amazon Relational Database Service（Amazon RDS）自动升级 Amazon RDS 表的次要引擎版本。这些更改可能会在 CloudFormation 中显示为堆栈偏差。偏差感知更改集会识别出 AWS 托管属性预计会出现偏差，如果您未在其模板中修改该属性，则保留其实际值不变。AWS 托管属性的热门示例包括：
+ 启用 Amazon RDS 表的 `AutoMinorVersionUpgrade` 属性以允许自动更新引擎版本。
+ 使用 `AWS::ApplicationAutoScaling::ScalableTarget` 资源为 Amazon DynamoDB 表的读/写容量单位和 Amazon Elastic Container Service 集群的所需数量之类的属性启用自动扩缩功能。
+ 对自动扩缩组使用 `AWS::AutoScaling::ScalingPolicy`。

偏差感知更改集阐明了标识为 AWS 托管的属性。有关详细信息，请参阅 AWS CLI 一节。

## 使用偏差感知更改集（控制台）
<a name="drift-aware-change-sets-console"></a>

您可以通过 CloudFormation 控制台使用与传统更改集相同的工作流来创建和管理偏差感知更改集，并且还可以选择不同的部署模式。

### 创建偏差感知更改集
<a name="drift-aware-change-sets-console-create"></a>

**要创建偏差感知更改集（控制台）**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在**堆栈**页面上，选择要更新的堆栈。

1. 选择**堆栈操作**，然后选择**为当前堆栈创建更改集**。

1. 在**创建更改集**页面上，对于**更改集类型**，选择**偏差感知更改集**。

1. 选择**创建更改集**。

1. 在更改集详细信息页面上，审核显示每个受影响资源的实际状态、先前部署状态和所需状态的三向比较。

1. 如果您对更改感到满意，请选择**执行更改集**。

### 查看偏差感知更改集
<a name="drift-aware-change-sets-console-review"></a>

当您在控制台中查看偏差感知更改集时，您会看到与传统更改集相比的增强信息：
+ **堆栈偏差状态**：指示堆栈是否已与其上次部署产生偏差。
+ **属性比较**：显示受影响资源的实际状态和所需状态之间的 JSON 差异。
+ **偏差指标**：清晰地标出 JSON 差异中出现偏差的属性。单击**查看偏差**以查看某个属性的先前部署值。
+ **值源指示**：显示属性的值是来自实际状态还是先前的部署状态。

## 使用偏差感知更改集（AWS CLI）
<a name="drift-aware-change-sets-cli"></a>

通过在 **create-change-set** 命令中添加 `--deployment-mode REVERT_DRIFT` 参数，您可以使用 AWS CLI 创建和管理偏差感知更改集。

### 创建偏差感知更改集
<a name="drift-aware-change-sets-cli-create"></a>

**要创建偏差感知更改集**  
使用带有 `--deployment-mode REVERT_DRIFT` 参数的 [create-change-set](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html) 命令来创建偏差感知更改集。

```
aws cloudformation create-change-set \
  --stack-name my-stack \
  --change-set-name my-drift-aware-changeset \
  --template-body file://updated-template.yaml \
  --deployment-mode REVERT_DRIFT \
  --capabilities CAPABILITY_IAM
```

### 查看偏差感知更改集
<a name="drift-aware-change-sets-cli-review"></a>

**要查看偏差感知更改集的详细信息**  
使用 [describe-change-set](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html) 命令查看偏差感知更改集的详细信息：

```
aws cloudformation describe-change-set \
  --change-set-name my-drift-aware-changeset \
  --stack-name my-stack
```

响应包括偏差感知更改集的增强信息：
+ `StackDriftStatus`：显示堆栈是否已出现偏差（`DRIFTED`、`IN_SYNC`、`NOT_CHECKED` 或 `UNKNOWN`）。
+ `ResourceDriftStatus`：显示每个资源（`DELETED`、`MODIFIED`、`IN_SYNC` 或 `NOT_CHECKED`）的偏差状态。
+ `BeforeValueFrom`：表示某个属性的“之前”值是来自 `ACTUAL_STATE` 还是 `PREVIOUS_DEPLOYMENT_STATE`。
+ `Drift`：包含某个属性的偏差详细信息，包括 `PreviousValue`、`ActualValue` 和 `DriftDetectionTimestamp`。
+ `ResourceDriftIgnoredProperties`：包含更改集不会恢复偏差的资源的属性以及忽略偏差的原因。

有关更多信息，请参阅《AWS CloudFormation API 参考》**中的 [DescribeChangeSet](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeChangeSet.html)。

### 执行偏差感知更改集
<a name="drift-aware-change-sets-cli-execute"></a>

**要执行偏差感知更改集**  
查看更改集后，使用 [execute-change-set](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/execute-change-set.html) 命令应用更改：

```
aws cloudformation execute-change-set \
  --change-set-name my-drift-aware-changeset \
  --stack-name my-stack
```

如果部署失败，CloudFormation 会将资源回滚到实际的部署前状态，并保留自上次部署以来所做的带外更改。

## 支持的资源类型
<a name="drift-aware-change-sets-supported-resources"></a>

偏差感知更改集支持对所有支持偏差检测的[资源类型](resource-import-supported-resources.md)的实际状态、先前的部署状态和所需状态进行三向比较，但以下资源类型除外：
+ `AWS::SageMaker::MlflowTrackingServer`
+ `AWS::Route53Resolver::FirewallRuleGroup`
+ `AWS::MediaLive::Multiplexprogram`
+ `AWS::VpcLattice::ResourceConfiguration`
+ `AWS::S3::StorageLensGroup`
+ `AWS::Bedrock::AgentAlias`
+ `AWS::MSK::Cluster`
+ `AWS::RDS::DBProxy`
+ `AWS::Redshift::ClusterParameterGroup`
+ `AWS::QBusiness::Index`
+ `AWS::NetworkManager::CoreNetwork`
+ `AWS::IAM::OIDCProvider`
+ `AWS::Organizations::ResourcePolicy`
+ `AWS::SNS::TopicInlinePolicy`
+ `AWS::Route53::KeySigningKey`
+ `AWS::DataZone::PolicyGrant`
+ `AWS::Transfer::Certificate`
+ `AWS::SageMaker::ImageVersion`
+ `AWS::Neptune::DBParameterGroup`
+ `AWS::ODB::CloudVmCluster`
+ `AWS::RolesAnywhere::TrustAnchor`
+ `AWS::Detective::Graph`
+ `AWS::Maester::DocumentType`
+ `AWS::SageMaker::ModelPackageGroup`
+ `AWS::S3Express::BucketPolicy`
+ `AWS::Panorama::PackageVersion`
+ `AWS::S3Tables::TableBucketPolicy`

对于不支持三向比较的资源，偏差感知更改集会回退到资源的先前部署状态和所需状态的比较。