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
| Perbandingan | CloudFormation | CDK |
|---|---|---|
| Bahasa | JSON / YAML | TypeScript, Python, Java, dll. |
| Type Safety | Tidak ada | Sangat baik (sepenuhnya type-safe dengan TypeScript) |
| Reusabilitas | Rendah (copy-paste) | Tinggi (diabstraksi dengan class & fungsi) |
| Kurva Belajar | Rendah | Sedang |
| Kompatibilitas Claude Code | Sangat baik | Luar 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 destroylalu 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
| Tugas | Kontribusi Claude Code |
|---|---|
| Pembuatan CloudFormation | YAML lengkap hanya dengan mendeskripsikan kebutuhan |
| Implementasi CDK | Kode infrastruktur type-safe dalam TypeScript |
| Desain stack | Arsitektur dependensi multi-stack |
| Penjelasan diff | Output cdk diff dijelaskan dalam Bahasa Indonesia |
| Debugging | Penyebab 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
- Claude Code × AWS Lambda Panduan Lengkap
- Claude Code × AWS IAM Panduan Lengkap
- Claude Code × AWS DynamoDB Panduan Lengkap
Referensi
Tingkatkan alur kerja Claude Code kamu
50 template prompt yang sudah teruji, siap copy-paste ke Claude Code sekarang juga.
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.
Tentang Penulis
Masa
Engineer yang aktif menggunakan Claude Code. Mengelola claudecode-lab.com, media teknologi 10 bahasa dengan lebih dari 2.000 halaman.
Artikel Terkait
Claude Code × Amazon Bedrock Panduan Lengkap | Menjalankan Claude di Produksi dengan AWS
Panduan lengkap menggunakan Amazon Bedrock dengan Claude Code. Dari autentikasi IAM, streaming, integrasi Lambda, implementasi RAG, hingga optimasi biaya — berdasarkan pengalaman produksi nyata Masa.
Claude Code × AWS CodePipeline/CodeBuild Panduan Lengkap | Bangun Pipeline CI/CD Secara Otomatis
Bangun CI/CD secara otomatis dengan AWS CodePipeline & CodeBuild menggunakan Claude Code. Contoh kode nyata untuk desain pipeline, generasi buildspec.yml, otomatisasi pengujian, dan infrastruktur CDK.
Claude Code × AWS CloudWatch Panduan Lengkap | Analisis Log, Pengaturan Alarm & Otomatisasi Dashboard
Tingkatkan efisiensi AWS CloudWatch dengan Claude Code. Kode praktis untuk analisis pola log, konfigurasi alarm otomatis, dashboard metrik, dan investigasi insiden.