👏

Claude CodeでCDKする。cloudshellで

に公開

いや、いうても2日前くらいに契約したド素人やがな..しかもCodexが流行り始めたこの時期にClaude Codeかよ。ここではいいとか悪いとかは書かない。単純にclaude codeがどう作用するかを見るだけの記事。

install

これ自体はcurlの系統のinstallで入る。npmよりいいんじゃないかね?

curl -fsSL https://claude.ai/install.sh | bash

的な。怖いのは容量だけやね。

作業dir切る

~ $ mkdir claude-cdk
~ $ cd claude-cdk/

cdk init...を手で引いてもいいけど

これもclaudeにやらせてみよう。

claude


ディレクトリが信頼できんのか?みたいな確認


エージェント待機中

このディレクトリで AWS CDK のプロジェクトを初期化してください。

- 言語は TypeScript を選択すること
- エントリーポイントを`bin/app.ts` に変更すること


プロンプトを入力


cdk init app --language typescriptの実行確認


エントリーポイントを変更するぞ確認


それに伴う変更


完了

確認


git差分

gitオペレーション

cdk自体がgit管理を前提としたイニシャライズをしているのでこれを利用する。


gitアカウントをセット

とかして

git add . して git commitしてください。
commit messageは英語で

とかすると


commit message、ここには大抵Co-Authored-By: Claude <noreply@anthropic.com>が付く


完了

このようになるわけだ

ローカルのcdkを更新する

グローバルのcdkを更新するのが面倒なんでローカルのcdkを更新する。まあこれは

npm install --save-dev aws-cdk@latest

みたいなのを打たせてもいいが、20USDのプランだと勿体ないのでこんなのは自分で打っていいかも


ローカルのバージョンがグローバルの 2.1021.0 と比較して 2.1029.0 まで上がった

たとえばcdk diffさせる

cdk diffしてください

とかすると


最近ある典型的なエラー

とかになることがあるので、ここで

/init "日本語で作成してください"

とかする


錬金中...

すると

# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## プロジェクト概要

このプロジェクトは AWS CDK v2 を使用した TypeScript プロジェクトです。AWS リソースをコードで定義・デプロイするためのインフラストラクチャ as Code (IaC) プロジェクトです。

...(省略)

## 重要な注意点

### AWS 認証
- AWS 認証情報が必要(AWS CLI、環境変数、IAM ロールなど)
- `cdk diff``cdk deploy` 実行時に AWS アカウントが必要
- 環境固有の設定は `bin/app.ts` でスタック定義時に指定可能

### CDK 機能フラグ
- `cdk.json` で多数の最新機能フラグが有効化済み
- CDK v2 の最新機能を利用可能

### デプロイメント
- 初回デプロイ前に `cdk bootstrap` が必要
- `cdk diff` で変更内容を確認してからデプロイすること

こんなのが出てくる

これを

@@ -2,6 +2,9 @@
 
 This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
 
+- このプロジェクトでは **すべての CDK コマンドは `npx cdk` を使用してください**。  
+- `cdk` という短縮エイリアスやグローバルインストールは使用禁止です。
+
 ## プロジェクト概要
 
 このプロジェクトは AWS CDK v2 を使用した TypeScript プロジェクトです。AWS リソースをコードで定義・デプロイするためのインフラストラクチャ as Code (IaC) プロジ

とかかましてさらに

cdk diffしてください

といえば


npx cdk diffに変更された`

ということでCLAUDE.md で前提の条件を変更できる

ちょっとやってみよか?

https://zenn.dev/catatsumuri/articles/1be7f443ab010b#vpc-stack.tsを作成する

ここでやってきたようなのをAIに任せたらどないなるっちゅーねん。

の前に


git差分

とりあえず簡単にAIつかってプログラムするなら最低限git差分をある程度小まめに確認しておかないと取り返しがつかない事になるかもしれん。

作る

以下はclaude codeへのプロンプト

VPCを作成する

- VPCスタックは分割する。既存の雛形は削除してok
- NAT Gatewayは作らない
- パブリックサブネットのみ
- AZは2つに分散

とかをぶっこむ


やらっせる


コード生成は差分がずばっと出てくる、がここで確認するのはちょっと面倒くさい


既存の変更はまあまあわかりやすいけど


テストもアップデートされる


npm testしていいかと聞かれる


書き直し


完了


git差分

とまあこんな感じで出てくるけど要するに

lib/vpc-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { Construct } from 'constructs';

export class VpcStack extends cdk.Stack {
  public readonly vpc: ec2.Vpc;

  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    this.vpc = new ec2.Vpc(this, 'VPC', {
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
      maxAzs: 2,
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: 'public-subnet',
          subnetType: ec2.SubnetType.PUBLIC,
        }
      ],
      natGateways: 0,
      enableDnsHostnames: true,
      enableDnsSupport: true,
    });

    new cdk.CfnOutput(this, 'VpcId', {
      value: this.vpc.vpcId,
      description: 'VPC ID',
    });

    new cdk.CfnOutput(this, 'PublicSubnetIds', {
      value: this.vpc.publicSubnets.map(subnet => subnet.subnetId).join(','),
      description: 'Public Subnet IDs',
    });
  }
}

これだよねっていう話。これをみる限り、省略可能なオプションも片っ端から書いているのでコード量は多めだ。IaCの場合とりあえず動くからどうというのではかなりきついので出力してきたコードを理解しないとけない。

lib/vpc-stack.ts について主要な動作やオプションについてコメントを日本語で与えてください
さらにcdk diffして、どのような変更があるかをレポートください

とかすると


コメントが与えられた

などが出てくるので理解や、あるいは学習に役に立つだろう。

さらに


レポート出力

deploy

実際にデプロイし、デプロイ後の構成を README.md にまとめてください。既存のREADME.mdは全て消してかまいません

とかすれば


確認無しモードでdeployしているnpx cdk deploy --require-approval never


やらっせる

ただまあ

道具は使いようやな。本当にdeployまで引かせていいの? しかも --require-approval never でとか。

ちなみに

AIが書いたREADME.md


Welcome to your CDK TypeScript project

This is a blank project for CDK development with TypeScript.

The cdk.json file tells the CDK Toolkit how to execute your app.

Useful commands

  • npm run build compile typescript to js
  • npm run watch watch for changes and compile
  • npm run test perform the jest unit tests
  • npx cdk deploy deploy this stack to your default AWS account/region
  • npx cdk diff compare deployed stack with current state
  • npx cdk synth emits the synthesized CloudFormation template
    claude-cdk $ cat README.md

AWS CDK VPC プロジェクト

このプロジェクトは AWS CDK v2 を使用して、シンプルなパブリック VPC 構成を作成します。

デプロイ済み構成

VPC 情報

  • VPC ID: vpc-05927d229410d194f
  • CIDR ブロック: 10.0.0.0/16
  • DNS ホスト名: 有効
  • DNS 解決: 有効
  • 状態: available

サブネット構成

サブネット ID アベイラビリティゾーン CIDR ブロック パブリック IP 割り当て
subnet-0d53b61998e978651 ap-northeast-1a 10.0.0.0/24 有効
subnet-0d77eca05a7a4f041 ap-northeast-1c 10.0.1.0/24 有効

ネットワーク構成

  • インターネットゲートウェイ: igw-05a0a02f371c60f4a
  • NAT ゲートウェイ: なし(パブリックサブネットのみ)
  • アベイラビリティゾーン: 2つ(ap-northeast-1a, ap-northeast-1c)

プロジェクト構造

claude-cdk/
├── bin/
│   └── app.ts                    # CDK アプリケーションのエントリーポイント
├── lib/
│   └── vpc-stack.ts              # VPC スタック定義
├── test/
│   └── claude-cdk.test.ts        # Jest 単体テスト
├── cdk.out/                      # CDK 合成出力ディレクトリ
├── CLAUDE.md                     # Claude Code 向けガイド
├── package.json                  # NPM 設定とスクリプト
├── tsconfig.json                 # TypeScript 設定
├── jest.config.js                # Jest テスト設定
└── cdk.json                      # CDK 設定ファイル

開発コマンド

ビルドとテスト

npm run build      # TypeScript を JavaScript にコンパイル
npm run watch      # ファイル変更を監視して自動コンパイル
npm test           # Jest 単体テストを実行

CDK 操作

npx cdk synth      # CloudFormation テンプレートを合成・表示
npx cdk diff       # デプロイ済みスタックと現在の状態を比較
npx cdk deploy     # AWS アカウントにスタックをデプロイ
npx cdk destroy    # デプロイしたスタックを削除

デプロイメント詳細

デプロイ結果

  • デプロイ時間: 約67秒
  • 作成されたリソース数: 16個
  • CloudFormation スタック名: VpcStack
  • スタック ARN: arn:aws:cloudformation:ap-northeast-1:****:stack/VpcStack/f86d5a70-8e1c-11f0-a85a-06146e8089c5

作成されたリソース一覧

ネットワークリソース

  • AWS::EC2::VPC
  • AWS::EC2::Subnet × 2(パブリックサブネット)
  • AWS::EC2::RouteTable × 2
  • AWS::EC2::SubnetRouteTableAssociation × 2
  • AWS::EC2::Route × 2(デフォルトルート)
  • AWS::EC2::InternetGateway
  • AWS::EC2::VPCGatewayAttachment

セキュリティ・カスタムリソース

  • Custom::VpcRestrictDefaultSG(デフォルトセキュリティグループ制限)
  • AWS::IAM::Role(カスタムリソース用)
  • AWS::Lambda::Function(カスタムリソース処理用)

出力値

  • VpcId: vpc-05927d229410d194f
  • PublicSubnetIds: subnet-0d53b61998e978651,subnet-0d77eca05a7a4f041

技術仕様

使用技術

  • AWS CDK: v2.1029.0
  • TypeScript: v5.6.3
  • Node.js: LTS版推奨
  • Jest: v29.7.0(テストフレームワーク)

AWS リージョン

  • デプロイ先: ap-northeast-1(東京リージョン)

設計方針

  • パブリックサブネットのみでシンプルな構成
  • NAT ゲートウェイなしでコスト効率化
  • 2つのアベイラビリティゾーンで可用性確保
  • DNS 機能有効でサービス連携対応

次のステップ

この VPC 基盤上に以下のリソースを追加することができます:

  1. EC2 インスタンス: パブリックサブネットに配置
  2. Application Load Balancer: 複数 AZ に分散配置
  3. RDS データベース: 将来プライベートサブネット追加時
  4. セキュリティグループ: アプリケーション固有の通信制御
  5. 追加サービス: Lambda、ECS、EKS など

トラブルシューティング

よくある問題

  • AWS 認証エラー: AWS CLI の設定を確認
  • 権限不足: IAM ユーザー・ロールの権限を確認
  • リージョン間違い: CDK のデフォルトリージョンを確認

サポート

Discussion