AWS CDKでドリフトの検出と確認ができるようになったのでClaude Codeと組み合わせてドリフトの解消までしてみた

AWS CDKでドリフトの検出と確認ができるようになったのでClaude Codeと組み合わせてドリフトの解消までしてみた

ドリフトの検出と確認の手間が減った
Clock Icon2025.06.24

AWS CDKで簡単にドリフトの検出と確認をしたい

こんにちは、のんピ(@non____97)です。

皆さんはAWS CDKで簡単にドリフトの検出と確認をしたいなと思ったことはありますか? 私はあります。

私は普段AWS CDKを使ってリソースの管理をしています。その時、都度ドリフトが発生していないか確認するためにマネジメントコンソールからドリフトの検出をしていました。画面遷移も多くなかなか手間です。

AWS CDKを使っている以上、可能な限りインターフェイスはAWS CDKに集約したいです。

今回、cdk driftを用いてAWS CDKでドリフトの検出と確認ができるようになりました。

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/ref-cli-cmd-drift.html

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設定を変更しました。

1.DNS設定とNAU設定の変更.png

ちなみに、ドリフト検出できるリソースは全てではありません。

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側で明示的に有効化していなかったため、実リソースを無効化したとしてもドリフトとして検出されていません。

マネジメントコンソールからも確認しておきましょう。

2.ドリフト一覧.png

VPCでドリフトが発生していますね。

詳細を確認すると、以下のとおりです。

3.ドリフトの詳細.png

テンプレートとなるJSON全体が表示されているため、すっきりみたい場合はcdk driftから確認する方が良さそうです。

ドリフトの解消

せっかくドリフトを簡単に確認できるようになったので、Claude Codeくんにドリフトの解消をしてもらいましょう。

私はMFA入力の手間を省くために1Password CLIのAWS CLIやAWS CDKをプラグインを使い、Touch IDで認証情報を渡すようにしています。概要は以下記事をご覧ください。

https://dev.classmethod.jp/articles/1password-shell-plugin-for-aws/

この時、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の実行結果を貼り付けています。

実行すると、以下のようにリソースの修正を行なってくれています。

5.実行中.png

途中、サブネットの削除によるドリフト解消については手こずっていました。最終的には一時的にリソースを削除し、再作成をすることでドリフト解消を行なっています。

6.ドリフトの解消.png

ドリフトが発生していないリソース丸ごと一時的に削除しているので、ちょっと乱暴ではありますね。

とはいえ、結果としてドリフトは解消されています。

手元でもドリフトが解消されたことを確認しました。

>  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)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.