Use Cases

Claude Code × AWS CloudFormation/CDK Panduan Lengkap | Generate Infrastruktur sebagai Kode Secara Otomatis

Percepat Infrastructure as Code AWS dengan Claude Code. Kode yang berfungsi untuk template CloudFormation, stack CDK TypeScript, dan desain multi-stack — berdasarkan pengalaman produksi nyata Masa.

“Saya benci harus klik-klik di AWS Console setiap kali ingin menyiapkan infrastruktur” — jika Anda pernah merasakannya, Anda tidak sendirian. CloudFormation dan CDK membuat infrastruktur dapat direproduksi melalui kode, tetapi menulis template tersebut membutuhkan waktu.

Saya mengelola infrastruktur situs ini (Cloudflare Pages + Workers + D1) dengan Claude Code, dan untuk infrastruktur AWS di produksi saya juga membiarkan Claude Code menghasilkan template CloudFormation/CDK. Template yang dulu butuh berjam-jam kini selesai dalam 1/5 waktu.


CloudFormation vs CDK: Mana yang Dipilih?

CloudFormation: Layanan native AWS yang mendeskripsikan infrastruktur dalam JSON/YAML
CDK (Cloud Development Kit): Framework yang mendeskripsikan infrastruktur dalam TypeScript/Python
                              lalu mensintesisnya ke CloudFormation
PerbandinganCloudFormationCDK
BahasaJSON / YAMLTypeScript, Python, Java, dll.
Type SafetyTidak adaSangat baik (sepenuhnya type-safe dengan TypeScript)
ReusabilitasRendah (copy-paste)Tinggi (diabstraksi dengan class & fungsi)
Kurva BelajarRendahSedang
Kompatibilitas Claude CodeSangat baikLuar biasa

Untuk proyek baru, CDK TypeScript sangat direkomendasikan. Kompatibilitasnya dengan Claude Code luar biasa dan dikombinasikan dengan pelengkapan tipe menghasilkan kode berkualitas tinggi.


Langkah 1: Mengubah Resource AWS yang Ada ke CloudFormation

Pola yang berguna saat Anda ingin mengkodifikasi environment AWS yang sudah ada.

claude -p "
Ubah setup AWS berikut menjadi template CloudFormation (YAML).

[Setup saat ini]
- VPC: 10.0.0.0/16, 2 subnet publik, 2 subnet privat
- EC2: t3.medium, Amazon Linux 2023, di subnet publik
- RDS: MySQL 8.0, db.t3.micro, di subnet privat
- ALB: HTTPS (sertifikat ACM), forwarding ke EC2
- Security Groups: izinkan 443 dari ALB, izinkan 3306 dari EC2 ke RDS

[Persyaratan]
- Environment (dev/staging/prod) dapat diubah via parameter
- Prefix nama resource dengan nama environment
- Tampilkan nama DNS ALB di CloudFormation Outputs
"

Template CloudFormation yang dihasilkan (kutipan):

AWSTemplateFormatVersion: "2010-09-09"
Description: "Web Application Infrastructure"

Parameters:
  Environment:
    Type: String
    AllowedValues: [dev, staging, prod]
    Default: dev
  DBPassword:
    Type: String
    NoEcho: true  # Sembunyikan password

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Sub "${Environment}-vpc"

  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub "${Environment}-public-1"

  # Security Group ALB
  ALBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ALB Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0

Outputs:
  ALBDnsName:
    Value: !GetAtt ApplicationLoadBalancer.DNSName
    Export:
      Name: !Sub "${Environment}-alb-dns"

Langkah 2: Membangun Stack Serverless dengan CDK

Dengan CDK, kita menulis dalam TypeScript sehingga penggunaan ulang logika menjadi mudah.

# Inisialisasi proyek CDK
mkdir my-infra && cd my-infra
npx cdk init app --language typescript

claude -p "
Implementasikan setup serverless berikut dalam CDK TypeScript di lib/my-infra-stack.ts.

[Setup]
- API Gateway (REST API) + Lambda (Node.js 20)
- Tabel DynamoDB (PAY_PER_REQUEST)
- Bucket S3 (privat, versioning diaktifkan)
- CloudFront (origin S3, dukungan domain kustom)
- Teruskan nama tabel DynamoDB dan nama bucket S3 sebagai variabel environment Lambda
- Attach otomatis IAM role dengan hak minimum ke Lambda

Beri tag yang sesuai pada semua resource,
dan aktifkan deletion protection di produksi (NODE_ENV=production).
"

Kode CDK yang dihasilkan:

// lib/my-infra-stack.ts
import * as cdk from "aws-cdk-lib";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as apigateway from "aws-cdk-lib/aws-apigateway";
import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
import * as s3 from "aws-cdk-lib/aws-s3";
import * as cloudfront from "aws-cdk-lib/aws-cloudfront";
import * as origins from "aws-cdk-lib/aws-cloudfront-origins";

export class MyInfraStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const isProd = process.env.NODE_ENV === "production";

    // Tabel DynamoDB
    const table = new dynamodb.Table(this, "AppTable", {
      partitionKey: { name: "PK", type: dynamodb.AttributeType.STRING },
      sortKey: { name: "SK", type: dynamodb.AttributeType.STRING },
      billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
      pointInTimeRecovery: true,
      deletionProtection: isProd,
      removalPolicy: isProd ? cdk.RemovalPolicy.RETAIN : cdk.RemovalPolicy.DESTROY,
    });

    // Bucket S3
    const bucket = new s3.Bucket(this, "AssetsBucket", {
      versioned: true,
      blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
      encryption: s3.BucketEncryption.S3_MANAGED,
      deletionProtection: isProd,
      removalPolicy: isProd ? cdk.RemovalPolicy.RETAIN : cdk.RemovalPolicy.DESTROY,
    });

    // Fungsi Lambda
    const apiLambda = new lambda.Function(this, "ApiLambda", {
      runtime: lambda.Runtime.NODEJS_20_X,
      handler: "index.handler",
      code: lambda.Code.fromAsset("src/lambda"),
      environment: {
        TABLE_NAME: table.tableName,
        BUCKET_NAME: bucket.bucketName,
        NODE_ENV: process.env.NODE_ENV ?? "development",
      },
      timeout: cdk.Duration.seconds(30),
      memorySize: 512,
    });

    // Berikan izin minimum ke Lambda
    table.grantReadWriteData(apiLambda);
    bucket.grantReadWrite(apiLambda);

    // API Gateway
    const api = new apigateway.RestApi(this, "AppApi", {
      restApiName: "MyApp API",
      defaultCorsPreflightOptions: {
        allowOrigins: apigateway.Cors.ALL_ORIGINS,
        allowMethods: apigateway.Cors.ALL_METHODS,
      },
    });

    api.root.addProxy({
      defaultIntegration: new apigateway.LambdaIntegration(apiLambda),
    });

    // CloudFront
    const distribution = new cloudfront.Distribution(this, "Distribution", {
      defaultBehavior: {
        origin: new origins.S3Origin(bucket),
        viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
      },
    });

    // Output
    new cdk.CfnOutput(this, "ApiUrl", { value: api.url });
    new cdk.CfnOutput(this, "CloudFrontUrl", { value: distribution.distributionDomainName });
  }
}

Langkah 3: Memperbarui Stack yang Ada dan Memeriksa Perbedaan

# Periksa perbedaan sebelum deployment
npx cdk diff

# Minta Claude Code menjelaskan perbedaannya
claude -p "
Baca output cdk diff ini dan jelaskan dalam Bahasa Indonesia apa yang berubah.
Perhatikan khusus perubahan pada security group dan kebijakan IAM.

$(npx cdk diff 2>&1)
"

Langkah 4: Merancang Arsitektur Multi-Stack

Infrastruktur skala produksi dikelola dengan membaginya ke beberapa stack.

claude -p "
Rancang setup multi-stack berikut dalam CDK TypeScript.

[Strategi pembagian stack]
- NetworkStack: VPC, subnet, security group
- DatabaseStack: RDS, ElastiCache (bergantung pada NetworkStack)
- ApplicationStack: ECS, ALB, AutoScaling (bergantung pada NetworkStack, DatabaseStack)
- MonitoringStack: CloudWatch dashboard, alarm, notifikasi SNS

Sertakan dependensi antar stack dan cara menggunakan CfnOutput / Fn.importValue.
"
// bin/app.ts
import * as cdk from "aws-cdk-lib";
import { NetworkStack } from "../lib/network-stack";
import { DatabaseStack } from "../lib/database-stack";
import { ApplicationStack } from "../lib/application-stack";
import { MonitoringStack } from "../lib/monitoring-stack";

const app = new cdk.App();
const env = { account: process.env.CDK_ACCOUNT, region: "ap-southeast-1" };

const network = new NetworkStack(app, "NetworkStack", { env });
const database = new DatabaseStack(app, "DatabaseStack", { env, vpc: network.vpc });
const application = new ApplicationStack(app, "ApplicationStack", {
  env,
  vpc: network.vpc,
  database: database.cluster,
});
new MonitoringStack(app, "MonitoringStack", {
  env,
  alb: application.alb,
  database: database.cluster,
});

Langkah 5: Serahkan Debugging CloudFormation/CDK ke Claude Code

Claude Code juga bisa membantu mengatasi kegagalan deployment.

claude -p "
CDK deploy gagal dengan error berikut.
Jelaskan penyebab dan cara memperbaikinya:

$(npx cdk deploy 2>&1 | tail -30)
"

Pola kegagalan umum:

  • ROLLBACK_COMPLETE: Deployment sebelumnya gagal, stack rusak → jalankan cdk destroy lalu deploy ulang
  • UPDATE_ROLLBACK_FAILED: Konflik dengan perubahan manual → selesaikan secara manual di AWS Console
  • Resource already exists: Tabrakan nama dengan resource yang ada → ganti nama resource atau import

4 Jebakan yang Sering Terjadi

1. Melewati deletion protection dengan cdk destroy

Di environment development, resource akan tersisa setelah cdk destroy jika tidak mengatur removalPolicy: DESTROY. Di produksi, gunakan RETAIN untuk mencegah penghapusan yang tidak disengaja.

2. Mengabaikan deteksi drift CloudFormation

Saat Anda mengubah resource secara manual di AWS Console, CloudFormation tidak sinkron dengan kenyataan (drift). Jalankan deteksi drift di CloudFormation Console sebulan sekali.

3. Menulis rahasia langsung di template

# Buruk: password tertinggal di template
DBPassword: "mysecretpassword"

# Baik: ambil dari Secrets Manager atau Parameter Store
DBPassword: !Sub "{{resolve:secretsmanager:prod/db-password}}"

4. Mengabaikan penerapan versi CDK yang tetap

Jika versi CDK tidak selaras di tim dalam package.json, akan muncul perbedaan. Commit package-lock.json untuk memastikan semua menggunakan versi yang sama.


Ringkasan

TugasKontribusi Claude Code
Pembuatan CloudFormationYAML lengkap hanya dengan mendeskripsikan kebutuhan
Implementasi CDKKode infrastruktur type-safe dalam TypeScript
Desain stackArsitektur dependensi multi-stack
Penjelasan diffOutput cdk diff dijelaskan dalam Bahasa Indonesia
DebuggingPenyebab dan solusi dari log error

Infrastructure as Code adalah sesuatu yang semua orang tahu harus dilakukan tapi terus ditunda. Dengan Claude Code, cukup deskripsikan “setup AWS yang saya butuhkan” dan template sudah jadi — hambatan untuk mengadopsi IaC berkurang secara dramatis.

Artikel Terkait

Referensi

#claude-code #aws #cloudformation #cdk #iac #typescript

Tingkatkan alur kerja Claude Code kamu

50 template prompt yang sudah teruji, siap copy-paste ke Claude Code sekarang juga.

Gratis

PDF Gratis: Cheatsheet Claude Code dalam 5 Menit

Cukup masukkan emailmu dan kami akan langsung mengirim cheatsheet PDF A4 satu halaman.

Kami menjaga data pribadimu dengan aman dan tidak pernah mengirim spam.

Masa

Tentang Penulis

Masa

Engineer yang aktif menggunakan Claude Code. Mengelola claudecode-lab.com, media teknologi 10 bahasa dengan lebih dari 2.000 halaman.