はじめに
こんにちは。Terraform教徒のハヤブサです。
私は純粋なるTerraform教徒なので、特段理由がなければIaCツールにはTerraformを使用するのですが、とある機会でCloudFormationを使った時に、CloudFormationのドリフトの扱いに衝撃を受けました。
Terraformの場合、コード管理下のリソースをコンソールなどから手動変更した場合(ドリフトを起こした場合)、次回のデプロイ時に、コードの状態を正として、ドリフトを自動解消(手動変更した設定を消し込む)する動きをします。
逆にCloudFormationの場合、ドリフトが起きてる状況でデプロイを行っても、ドリフトを自動解消する動きはしません。
これは、CloudFormationがTerraformに比べて劣ってるというわけではなく、ドリフトの扱いの違いによるものです。
Terraformのドリフトの扱い
Terraformはコードを絶対の正とし、ドリフト絶対許さないマンです。
手動で変更した設定を消されたくなかったら、後で必ずコードに反映するんだぞ!絶対だぞ!
※ダチョウ倶楽部的なフリではなく
この扱いは、全てのインフラリソースをコードで管理するというベストプラクティスの遵守の観点では、非常に強力な仕様です。
その反面、手動変更した設定のコード取り込みが漏れてしまうと、意図しない設定消込を引き起こす危険があります。
CloudFormationのドリフトの扱い
CloudFormationは実際の設定を正とし、ドリフト許したるマンです。
しゃあないな〜
気が向いたら、コードに反映するんやで〜
この扱いは、手動での設定変更が頻繁に発生しうる運用現場であっても、意図しない設定消込の恐れがない点、Terraformには無いメリットです。
その反面、ドリフトに寛容すぎるので、コードの状態と実際の状態がズレまくりなカオスを引き起こしやすいデメリットがあります。
新機能 ドリフト認識変更セット
そんな中、2025年の年末にCloudFormationの新機能として、ドリフト認識変更セットの追加が発表されました。
このドリフト認識変更セットですが、Terraformと同様にコードの状態を正として、ドリフトを自動解消してくれる機能です。
Terraformのように問答無用でドリフトを自動解消するのではなく、オプションとして指定するものなので、意図しない設定消込を引き起こす危険も低いです。
今回は、このドリフト認識変更セットを試してみようと思います。
試してみた
以下のCloudFormationテンプレートを使って、バージョニングが有効なS3バケットを作成します。
AWSTemplateFormatVersion: '2010-09-09'
Description: Simple S3 bucket for drift detection testing
Resources:
DriftTestBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub 'drift-test-${AWS::AccountId}-${AWS::Region}'
VersioningConfiguration:
Status: Enabled
作成したS3バケットのバージョニングをコンソールから無効化します。

S3バケットを管理しているCloudFormation Stackで、標準変更セット(従来)を作成します。

標準変更セットはドリフトを考慮しないので、テンプレート上の設定と実際の設定にズレが出ていますが、リソースの変更に差分は発生しません。
次はS3バケットを管理しているCloudFormation Stackで、ドリフト認識変更セット(新機能)を作成します。

ドリフト認識変更セットはドリフトを考慮するので、テンプレート上の設定と実際の設定のズレを検知し、リソースの変更に差分が発生します。

この変更セットを適用すると、S3バケットに対してアップデートが走り、テンプレート上の設定を正とし、S3バケットのバージョニングが有効化されることが確認できました。


さいごに
ドリフト認識変更セットですが、CloudFormationの課題であったドリフトの解消に一役買ってくれそうですね!
私もCloudFormationを使う際は、この機能を是非活用しようと思います!