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.
“GitHub Actions sudah cukup, kenapa harus pakai AWS CodePipeline?”—pertanyaan yang sering saya dengar.
Jawabannya ada pada integrasi mendalam dengan sumber daya AWS. Push ke ECR, deploy ke ECS, update stack CloudFormation—ketika semua ini harus berjalan secara native di dalam AWS, CodePipeline + CodeBuild adalah kombinasi yang paling mulus.
Dalam pekerjaan saya mengelola pipeline yang menggabungkan beberapa layanan AWS, dan sejak Claude Code mulai menghasilkan buildspec.yml, kode CDK, dan kebijakan IAM sekaligus hanya dengan mendeskripsikan kebutuhan pipeline, waktu untuk membangun pipeline baru berkurang menjadi seperempat.
Struktur Dasar CodePipeline / CodeBuild
CodePipeline (Orchestrator)
│
├─ Stage Source: Ambil kode dari GitHub / CodeCommit
├─ Stage Build: Build, test, buat image Docker dengan CodeBuild
├─ Stage Test: Pengujian integrasi, pemindaian keamanan (opsional)
└─ Stage Deploy: Deploy ke ECS / Elastic Beanstalk / S3
CodeBuild menjalankan perintah yang ditulis dalam buildspec.yml. Anggap saja sebagai padanan steps: di GitHub Actions.
Langkah 1: Hasilkan buildspec.yml Secara Otomatis
claude -p "
Hasilkan buildspec.yml untuk CodeBuild dengan persyaratan berikut.
[Isi Build]
- Lingkungan Node.js 20
- Instalasi dengan npm ci
- Build TypeScript (npm run build)
- Jalankan pengujian unit (npm test)
- Bangun image Docker dan push ke ECR
- Tag image: CODEBUILD_RESOLVED_SOURCE_VERSION (Git SHA)
- Juga berikan tag latest secara bersamaan
[Pemindaian Keamanan]
- Jalankan pemindaian Trivy setelah push image ECR
- Gagalkan build jika ditemukan kerentanan HIGH/CRITICAL
[Artefak]
- Keluarkan imagedefinitions.json (untuk deploy ECS)
"
buildspec.yml yang dihasilkan:
version: 0.2
env:
variables:
AWS_DEFAULT_REGION: ap-southeast-1
ECR_REPO_NAME: myapp
parameter-store:
ECR_REGISTRY: /myapp/ecr-registry
phases:
install:
runtime-versions:
nodejs: 20
commands:
- echo "Menginstal dependensi..."
- npm ci
pre_build:
commands:
- echo "Menjalankan pengujian..."
- npm test
- echo "Masuk ke Amazon ECR..."
- aws ecr get-login-password | docker login --username AWS --password-stdin $ECR_REGISTRY
- IMAGE_TAG=$CODEBUILD_RESOLVED_SOURCE_VERSION
- IMAGE_URI=$ECR_REGISTRY/$ECR_REPO_NAME:$IMAGE_TAG
build:
commands:
- echo "Kompilasi TypeScript..."
- npm run build
- echo "Membangun image Docker..."
- docker build -t $IMAGE_URI -t $ECR_REGISTRY/$ECR_REPO_NAME:latest .
post_build:
commands:
- echo "Push image ke ECR..."
- docker push $IMAGE_URI
- docker push $ECR_REGISTRY/$ECR_REPO_NAME:latest
- echo "Memindai image untuk kerentanan..."
- |
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy:latest image \
--exit-code 1 \
--severity HIGH,CRITICAL \
$IMAGE_URI
- echo "Membuat imagedefinitions.json..."
- printf '[{"name":"app","imageUri":"%s"}]' $IMAGE_URI > imagedefinitions.json
artifacts:
files:
- imagedefinitions.json
reports:
test-reports:
files:
- "coverage/junit.xml"
file-format: JUNITXML
Langkah 2: Bangun Seluruh Pipeline dengan CDK
claude -p "
Implementasikan CodePipeline berikut dalam CDK TypeScript di lib/pipeline-stack.ts.
[Konfigurasi Pipeline]
- Source: GitHub (cabang main dari owner/repo)
- Build: CodeBuild (menggunakan buildspec.yml di atas)
- Deploy: Deployment Blue/Green ke layanan ECS
[Notifikasi]
- Beri tahu Slack via SNS saat pipeline gagal
- Beri tahu Slack juga saat deployment berhasil
[Penyimpanan Artefak]
- Bucket S3 (enkripsi dan versioning diaktifkan)
"
// lib/pipeline-stack.ts
import * as cdk from "aws-cdk-lib";
import * as codepipeline from "aws-cdk-lib/aws-codepipeline";
import * as codepipeline_actions from "aws-cdk-lib/aws-codepipeline-actions";
import * as codebuild from "aws-cdk-lib/aws-codebuild";
import * as s3 from "aws-cdk-lib/aws-s3";
import * as iam from "aws-cdk-lib/aws-iam";
import * as sns from "aws-cdk-lib/aws-sns";
export class PipelineStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Bucket S3 penyimpanan artefak
const artifactBucket = new s3.Bucket(this, "ArtifactBucket", {
versioned: true,
encryption: s3.BucketEncryption.S3_MANAGED,
removalPolicy: cdk.RemovalPolicy.RETAIN,
});
// Definisi artefak
const sourceOutput = new codepipeline.Artifact("SourceOutput");
const buildOutput = new codepipeline.Artifact("BuildOutput");
// Proyek CodeBuild
const buildProject = new codebuild.PipelineProject(this, "BuildProject", {
buildSpec: codebuild.BuildSpec.fromSourceFilename("buildspec.yml"),
environment: {
buildImage: codebuild.LinuxBuildImage.STANDARD_7_0,
privileged: true, // Diperlukan untuk build Docker
},
environmentVariables: {
AWS_ACCOUNT_ID: { value: this.account },
},
});
// Berikan izin akses ECR
buildProject.addToRolePolicy(new iam.PolicyStatement({
actions: [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
],
resources: ["*"],
}));
// Pipeline
const pipeline = new codepipeline.Pipeline(this, "Pipeline", {
pipelineName: "myapp-pipeline",
artifactBucket,
stages: [
{
stageName: "Source",
actions: [
new codepipeline_actions.GitHubSourceAction({
actionName: "GitHub_Source",
owner: "your-org",
repo: "your-repo",
branch: "main",
oauthToken: cdk.SecretValue.secretsManager("github-token"),
output: sourceOutput,
}),
],
},
{
stageName: "Build",
actions: [
new codepipeline_actions.CodeBuildAction({
actionName: "Build_and_Test",
project: buildProject,
input: sourceOutput,
outputs: [buildOutput],
}),
],
},
{
stageName: "Deploy",
actions: [
new codepipeline_actions.EcsDeployAction({
actionName: "Deploy_to_ECS",
service: ecs.FargateService.fromFargateServiceAttributes(
this, "EcsService", {
cluster: ecs.Cluster.fromClusterArn(
this, "Cluster",
`arn:aws:ecs:${this.region}:${this.account}:cluster/myapp-cluster`
),
serviceName: "myapp-service",
}
),
input: buildOutput,
}),
],
},
],
});
// Notifikasi kegagalan
const alertTopic = new sns.Topic(this, "AlertTopic");
pipeline.notifyOnAnyStageStateChange("PipelineNotification", alertTopic, {
events: [
codepipeline.PipelineNotificationEvents.PIPELINE_EXECUTION_FAILED,
codepipeline.PipelineNotificationEvents.PIPELINE_EXECUTION_SUCCEEDED,
],
});
}
}
Langkah 3: Konfigurasi Laporan Hasil Pengujian
claude -p "
Saya ingin mengirim hasil pengujian ke CodeBuild Reports di CodeBuild
agar dapat memeriksa laporan kualitas per PR.
- Framework pengujian: Vitest
- Laporan coverage: Istanbul (format lcov)
- Tambahkan bagian reports ke buildspec.yml
- Definisikan juga grup laporan dengan CDK
"
# Bagian reports dari buildspec.yml
reports:
UnitTestResults:
files:
- "test-results/junit.xml"
file-format: JUNITXML
CodeCoverage:
files:
- "coverage/lcov.info"
file-format: CLOVERXML
Langkah 4: Desain Pipeline Multi-Lingkungan
claude -p "
Rancang pipeline deployment bertahap CDK untuk 3 lingkungan: dev → staging → prod.
- dev: auto-deploy saat push ke cabang main
- staging: deploy setelah dev berhasil, dengan persetujuan manual
- prod: deploy setelah staging berhasil, dengan persetujuan manual
- Beri tahu Slack saat deployment setiap lingkungan selesai
"
// Tambahkan gate persetujuan manual untuk staging → prod
{
stageName: "Approve_Staging",
actions: [
new codepipeline_actions.ManualApprovalAction({
actionName: "Approve_Deploy_to_Staging",
notificationTopic: alertTopic,
additionalInformation: "Setujui deployment ke Staging?",
}),
],
},
{
stageName: "Deploy_Staging",
actions: [
new codepipeline_actions.EcsDeployAction({
actionName: "Deploy_to_Staging",
service: stagingService,
input: buildOutput,
}),
],
},
4 Jebakan Umum
1. Lupa privileged: true di CodeBuild
Membangun image Docker memerlukan privileged: true. Tanpa ini akan muncul error Cannot connect to the Docker daemon.
2. Izin Token OAuth GitHub Tidak Cukup
Source GitHub memerlukan scope repo. Hanya menggunakan public_repo tidak bisa untuk repositori privat.
3. Region Bucket S3 Artefak
Pipeline dan bucket S3 artefak harus berada di region yang sama. Pipeline lintas region memerlukan konfigurasi tambahan.
4. Format imagedefinitions.json untuk Aksi Deploy ECS
Deployment ECS memerlukan format yang tepat:
[{"name": "nama-container", "imageUri": "uri-image"}]
Nama container harus sama persis dengan nama container dalam definisi tugas.
Ringkasan
| Tugas | Kontribusi Claude Code |
|---|---|
| Generasi buildspec.yml | Dihasilkan lengkap dengan build, test, Docker, dan pemindaian keamanan |
| Pipeline CDK | Auto-hasilkan semua stage dari Source→Build→Deploy |
| Desain multi-lingkungan | Rancang deployment bertahap dengan gate persetujuan manual |
| Laporan pengujian | Otomatiskan konfigurasi CodeBuild Reports |
Konfigurasi CodePipeline mungkin terlihat kompleks, tapi cukup beri tahu Claude Code “saya ingin pipeline seperti ini” dan ia akan menghasilkan buildspec.yml maupun kode CDK sekaligus. Mulailah dengan mencoba buildspec.yml terlebih dahulu.
Artikel Terkait
- Claude Code × AWS ECS/Fargate Panduan Lengkap
- Claude Code × AWS CloudFormation/CDK Panduan Lengkap
- Claude Code × AWS IAM 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 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.
Claude Code × AWS ECS/Fargate Panduan Lengkap | Otomatisasi Deployment Container
Otomatisasi deployment AWS ECS/Fargate dengan Claude Code. Dari task definition, konfigurasi service, Blue/Green deployment, hingga infrastruktur CDK — berdasarkan pengalaman nyata Masa.