こんにちは、SCSK齋藤です。
2025年の11月に AWS CloudFormation に関するアップデートが来ました。その内容について検証してみたいと思います。
ドリフト対応変更セット
アップデートは、ドリフト対応変更セットというもので、これはテンプレートの内容と実際のインフラの状況を比較した上で、変更セットを立てるという内容です。
図解すると下記のようなイメージです。
これまでの変更セットは、現在のテンプレートと、新しいテンプレートを比較して差分を抽出します。
しかし、ドリフト対応変更セットは、それに加えて実際のインフラの状況も見た上で変更差分を抽出します。
試してみた
今回はLambda関数を定義したCloudFormationを使って、ドリフト対応変更セットとはどのようなものなのかみていきたいと思います。
①Python3.11のランタイムのLambdaをデプロイ
下記テンプレートをまずデプロイしてみます。
AWSTemplateFormatVersion: '2010-09-09'
Description: Simple CloudFormation Template to create one AWS Lambda function
Resources:
testlambda:
Type: AWS::Lambda::Function
Properties:
FunctionName: "test-lambda"
Handler: index.lambda_handler
Runtime: python3.13
Architectures:
- arm64
Role: !GetAttLambdaRole.Arn
Code:
ZipFile: |
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': 'Hello from Lambda!'
}
LambdaRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: "my-function-role"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service: "lambda.amazonaws.com"
Action: "sts:AssumeRole"
Policies:
- PolicyName: "MyPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
Resource: arn:aws:logs:ap-northeast-1:425086073817:*
- Effect: Allow
Action:
- logs:CreateLogStream
- logs:PutLogEvents
Resource:
- arn:aws:logs:ap-northeast-1:425086073817:log-group:/aws/lambda/test-lambda:*
上記をデプロイすることにより、Lambdaのランタイムは、3.11となります。
②マネジメントコンソールで、Python3.12にランタイムを変更します。
CloudFormationを用いずに、ランタイムを変更します。
この状態では、CloudFormation上はまだPython3.11のままです。
③CloudFormationを用いて、Python3.13にアップデートします。
ここからが本題です。
本ブログの①に記載したCloudFormationテンプレートをPython3.13に書き換えた上で実行します。
まず普通に変更セットを作成しようとします。
最初に、変更セットのタイプを指定しますが、そこでドリフト認識変更セットを選択します。
そして、新しいテンプレートをアップロードします。
この後の流れは、いつもの変更セット作成方法と同じため、変更セットの作成まで実施します。
変更セットを作成すると、下記のようなステータスとなり、「ドリフト済み」と表示されます。
JSONでも見てみますと、下記のようになります。(必要な部分のみピックアップしてます。)
beforeValueは、マネジメントコンソール上で変更した実際のインフラのランタイム設定ですね。afterValueは、新しいテンプレートのランタイムです。
その後にdriftと記載があり、previousValueは現在のテンプレート上のランタイムであるPython3.11です。
actualValueは、マネジメントコンソール上で変更した実際のインフラのランタイム設定であることがわかります。
この状態で変更セットを実行したら問題なくPython3.13にアップデートできました。
まとめ
今回はインフラの実際の状態を変更セットとして差分確認する機能を、簡単にですが検証しました。
JSON形式で見てみると、現在のテンプレートと、実際のインフラ、そして新しいテンプレートの内容が3つ分しっかりと比較できていることがわかりました。
この機能により、過去にマネジメントコンソール上で変更してしまった設定も、変更セット時にしっかりと気づくことができるようになったので、想定外のデプロイが起こってしまうといったことが少しでも減らせると考えております。









