AWS CDKでドリフトの検出と確認ができるようになったのでClaude Codeと組み合わせてドリフトの解消までしてみた
AWS CDKで簡単にドリフトの検出と確認をしたい
こんにちは、のんピ(@non____97)です。
皆さんはAWS CDKで簡単にドリフトの検出と確認をしたいなと思ったことはありますか? 私はあります。
私は普段AWS CDKを使ってリソースの管理をしています。その時、都度ドリフトが発生していないか確認するためにマネジメントコンソールからドリフトの検出をしていました。画面遷移も多くなかなか手間です。
AWS CDKを使っている以上、可能な限りインターフェイスはAWS CDKに集約したいです。
今回、cdk drift
を用いてAWS CDKでドリフトの検出と確認ができるようになりました。
cdk drift
はAWS CDK CLI v2.1017.0から使えるようになっています。
ドリフトの検出と表示を一気にやってくれるので、非常に便利そうです。
実際に試してみました。
やってみた
リソースのデプロイ
検証用に以下のようにVPCとサブネット等々のリソースをデプロイします。
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
export class DriftTestStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new cdk.aws_ec2.Vpc(this, "Vpc", {
enableDnsHostnames: true,
enableDnsSupport: true,
natGateways: 0,
maxAzs: 2,
subnetConfiguration: [
{
name: "Public",
subnetType: cdk.aws_ec2.SubnetType.PUBLIC,
cidrMask: 27,
mapPublicIpOnLaunch: true,
},
{
name: "Isolated",
subnetType: cdk.aws_ec2.SubnetType.PRIVATE_ISOLATED,
cidrMask: 27,
},
],
gatewayEndpoints: {
S3: {
service: cdk.aws_ec2.GatewayVpcEndpointAwsService.S3,
},
},
});
}
}
リソースの変更
デプロイ完了後、リソースの変更を行います。
今回はVPCのDNS設定とNAU設定を変更しました。
ちなみに、ドリフト検出できるリソースは全てではありません。
2025/6/24時点では以下リソースタイプについてはドリフト検出はできません。
- AWS::ACMPCA::Certificate
- AWS::ACMPCA::CertificateAuthorityActivation
- AWS::ApiGateway::Stage
- AWS::ApiGateway::UsagePlanKey
- AWS::ApplicationAutoScaling::ScalingPolicy
- AWS::AuditManager::Assessment
- AWS::AutoScaling::AutoScalingGroup
- AWS::Backup::BackupSelection
- AWS::Bedrock::KnowledgeBase
- AWS::Cognito::LogDeliveryConfiguration
- AWS::Cognito::UserPool
- AWS::Cognito::UserPoolUser
- AWS::EC2::EIPAssociation
- AWS::EC2::SubnetRouteTableAssociation
- AWS::ECS::Cluster
- AWS::ECS::ClusterCapacityProviderAssociations
- AWS::EKS::Cluster
- AWS::EKS::Nodegroup
- AWS::EMR::Step
- AWS::ElasticBeanstalk::Environment
- AWS::ElasticLoadBalancingV2::ListenerRule
- AWS::Evidently::Feature
- AWS::FMS::Policy
- AWS::KMS::Alias
- AWS::KMS::Key
- AWS::KMS::ReplicaKey
- AWS::KafkaConnect::Connector
- AWS::KinesisFirehose::DeliveryStream
- AWS::RDS::DBInstance
- AWS::S3::BucketPolicy
- AWS::S3::MultiRegionAccessPointPolicy
- AWS::SSM::Document
- AWS::SecretsManager::ResourcePolicy
- AWS::ServiceCatalog::CloudFormationProvisionedProduct
- AWS::ServiceCatalogAppRegistry::ResourceAssociation
参考 : Resource type support - AWS CloudFormation
ドリフトの検出と確認
それでは、ドリフトの検出と確認をします。
> cdk diff
start: Building DriftTestStack Template
success: Built DriftTestStack Template
start: Publishing DriftTestStack Template (<AWSアカウントID>-us-east-1)
success: Published DriftTestStack Template (<AWSアカウントID>-us-east-1)
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Stack DriftTestStack
There were no differences
✨ Number of stacks with differences: 0
> cdk drift
✨ Synthesis time: 4.17s
Stack DriftTestStack
Modified Resources
[~] AWS::EC2::VPC Vpc Vpc8378EB38
├─ [~] /EnableDnsSupport
├─ [-] true
└─ [+] false
└─ [~] /EnableDnsHostnames
├─ [-] true
└─ [+] false
1 resource has drifted from their expected configuration
✨ Number of resources with drift: 1 (7 unchecked)
デプロイ済みのスタックと現在のコードからsynthした情報との差分を確認するcdk diff
では検出されていませんが、デプロイ済みのスタックと実リソースとの差分を確認するcdk drift
では検出できました。
見た目も分かりやすくて良いですね。
なお、NAUの有効化はそもそもAWS CDK側で明示的に有効化していなかったため、実リソースを無効化したとしてもドリフトとして検出されていません。
マネジメントコンソールからも確認しておきましょう。
VPCでドリフトが発生していますね。
詳細を確認すると、以下のとおりです。
テンプレートとなるJSON全体が表示されているため、すっきりみたい場合はcdk drift
から確認する方が良さそうです。
ドリフトの解消
せっかくドリフトを簡単に確認できるようになったので、Claude Codeくんにドリフトの解消をしてもらいましょう。
私はMFA入力の手間を省くために1Password CLIのAWS CLIやAWS CDKをプラグインを使い、Touch IDで認証情報を渡すようにしています。概要は以下記事をご覧ください。
この時、Claude Codeで実行中に発生する1Password CLIのTouch ID要求と相性が悪く、スムーズにいかないことがありました。
回避方法として、一度、一時認証情報を環境変数および、環境変数ファイルに落とし、その認証情報をAWS CLIやAWS CDKの操作をするようにしています。
この時のCLAUDE.mdは以下のとおりです。
## AWS Authentication
### Claude Code Session Limitations
- Each Bash command runs in isolated session
- Environment variables don't persist between commands
### Solution: Environment File Method
```bash
# Create .aws_env (NEVER commit)
eval $(aws configure export-credentials --format env) && \
echo "export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" > .aws_env && \
echo "export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> .aws_env && \
echo "export AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >> .aws_env
# Add to .gitignore
echo ".aws_env" >> .gitignore
# Usage
source .aws_env && aws sts get-caller-identity
これで、Claude Codeに指示を出してみます。
より、処理が複雑な方が良いかなと思ったので、さらにサブネットのパブリックIPアドレスの自動割り当ての設定の無効化と、一サブネットの削除を実施しました。
実施後のドリフト結果は以下のとおりです。
> cdk drift
✨ Synthesis time: 4.19s
Stack DriftTestStack
Modified Resources
[~] AWS::EC2::VPC Vpc Vpc8378EB38
├─ [~] /EnableDnsSupport
├─ [-] true
└─ [+] false
└─ [~] /EnableDnsHostnames
├─ [-] true
└─ [+] false
[~] AWS::EC2::Subnet Vpc/PublicSubnet1/Subnet VpcPublicSubnet1Subnet5C2D37C4
└─ [~] /MapPublicIpOnLaunch
├─ [-] true
└─ [+] false
Deleted Resources
[-] AWS::EC2::Subnet Vpc/IsolatedSubnet2/Subnet VpcIsolatedSubnet2Subnet16364B91
3 resources have drifted from their expected configuration
✨ Number of resources with drift: 3 (7 unchecked)
こちらに対して以下のようなプロンプトでドリフト解消を行わせます。
@drift.log に記載されているように、AWS CDKでデプロイしたリソースでドリフトが発生しています。
ドリフトの修正をしてください。
ドリフト修正の観点は以下のとおりです。
- 現在のAWS CDKのコードを正とし、実リソースの設定を変更する
- 実リソースが削除されている場合は、AWS CDKのコードを一時的に修正して、再度作成をしてください
- AWS CDKの操作は awslabs.cdk-mcp-server のMCPサーバーを使用する
- cdk-nag など修正に直接的な関係がない操作を行なってはならない
- AWS CDKを介さずに実リソースの操作はする際にはAWS CLIを用いる
drift.log
にはcdk drift
の実行結果を貼り付けています。
実行すると、以下のようにリソースの修正を行なってくれています。
途中、サブネットの削除によるドリフト解消については手こずっていました。最終的には一時的にリソースを削除し、再作成をすることでドリフト解消を行なっています。
ドリフトが発生していないリソース丸ごと一時的に削除しているので、ちょっと乱暴ではありますね。
とはいえ、結果としてドリフトは解消されています。
手元でもドリフトが解消されたことを確認しました。
> cdk drift
✨ Synthesis time: 4.09s
Stack DriftTestStack
No drift detected
✨ Number of resources with drift: 0 (7 unchecked)
ドリフトの検出と確認の手間が減った
AWS CDKでドリフトの検出と確認ができるようになったアップデートを紹介しました。
ドリフトの検出と確認の手間が減ったのはシンプルに嬉しいですね。生成系AIにも情報を渡しやすいです。
また、簡単に検出と確認ができるようになったので、CIの中に組み込みやすくなりましたね。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部 コンサルティング部の のんピ(@non____97)でした!