

# ドリフト対応変更セットの使用
<a name="drift-aware-change-sets"></a>

ドリフト対応変更セットは、スタックドリフトを安全な方法で特定および管理できる強化された CloudFormation 変更セットです。基盤となるサービスの AWS マネジメントコンソール、AWS CLI、または SDK を使用して、スタックリソースが CloudFormation の外部で変更されると、スタックは予想されるテンプレート設定からドリフトします。ドリフト対応変更セットは、テンプレートをスタックリソースの実際の状態と比較し、ドリフトされたリソースをテンプレート定義に合わせます。リソースのテンプレート定義が実際の状態と一致するように更新されると、ドリフト対応変更セットは、リソースを変更せずにリソースのドリフトステータスをリセットします。

ドリフト対応変更セットを使用するメリットは次のとおりです。
+ **ドリフトの上書きのプレビュー** – インシデント対応中に行われた重要な帯域外の変更をデプロイが元に戻すかどうかを検出します。
+ **体系的なドリフト調整** – ドリフトされたプロパティをテンプレート値で上書きするか、実際のリソースの状態に合わせてテンプレートを更新するかのいずれかで、ドリフトされたリソースを準拠したテンプレート定義と安全に調整します。
+ **拡張ロールバック機能** – デプロイが失敗した場合、リソースを以前のテンプレート状態ではなく、実際のデプロイ前の状態に復元します。
+ **[完全な可視性]** – 変更を行う前に、デプロイが実際のリソース設定にどのように影響するかを正確に確認します。

従来の変更セットは、新しいテンプレートとスタックの以前のテンプレートとの比較を提供しますが、スタックドリフトについては考慮しません。ドリフト対応変更セットは、次の間の 3 方向比較を提供することで、この問題を解決します。
+ **[実際の状態]** – リソースのライブ設定。CloudFormation は、基盤となるサービス API 経由で、変更セットの作成時にアカウントのリソースの設定を読み取ります。
+ **[以前のデプロイ状態]** – 前回の CloudFormation デプロイからテンプレートで定義された設定。
+ **必要な状態** – 新しいテンプレートで定義された設定。

ドリフト対応変更セットは、テンプレートでリソースが明示的に変更されていない場合でも、すべてのスタックリソースの実際の状態を必要な状態に合わせて更新します。

## 考慮事項
<a name="drift-aware-change-sets-considerations"></a>
+ **リソースタイプのサポート** – ドリフト対応変更セットは、何百ものリソースタイプの必要な状態と実際の状態との比較をサポートします。サポートされていないリソースタイプの場合、ドリフト対応変更セットは、以前のデプロイ状態と必要な状態との比較にフォールバックします。詳細については、「リソースタイプのサポートの制限」セクションを参照してください。
+ **書き込み専用プロパティ** – 機密データ (パスワード、シークレット) を含むプロパティの場合、ドリフト対応変更セットは、実際の値ではなく以前のデプロイ値と比較されます。
+ **AWS マネージドプロパティ** – ドリフト対応変更セットは、Auto Scaling グループの必要な容量など、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 クラスターの必要数などのプロパティの自動スケーリングを有効にする。
+ Auto Scaling グループの `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. 変更セットの詳細ページで、影響を受ける各リソースの実際のデプロイ、以前のデプロイ、および必要な状態を示す 3 方向比較を確認します。

1. 変更に満足したら、**[変更セットを実行する]** を選択します。

### ドリフト対応変更セットの確認
<a name="drift-aware-change-sets-console-review"></a>

コンソールでドリフト対応変更セットを表示すると、従来の変更セットと比較して強化された情報が表示されます。
+ **[スタックドリフトステータス]** – スタックが前回のデプロイからドリフトしたかどうかを示します。
+ **プロパティ比較** – 影響を受けるリソースの実際の状態と必要な状態の間の JSON 差分を示します。
+ **[ドリフトインジケータ]** – ドリフトした JSON 差分内のプロパティを明確にマークします。**[ドリフトを表示する]** をクリックして、プロパティの以前のデプロイ値を表示します。
+ **値ソースインジケータ** – プロパティの before 値が実際の状態からのものか以前のデプロイ状態からのものかを示します。

## ドリフト対応変更セットの使用 (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>

**ドリフト対応変更セットを作成するには**  
[create-change-set](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html) コマンドを `--deployment-mode REVERT_DRIFT` パラメータとともに使用して、ドリフト対応変更セットを作成します。

```
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` – プロパティの before 値が `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)について、実際の状態、以前のデプロイ状態、および必要な状態の 3 方向比較をサポートしますが、次のリソースタイプは除きます。
+ `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`

ドリフト対応変更セットは、3 方向比較をサポートしていないリソースの以前のデプロイ状態と必要な状態の比較にフォールバックします。