Claude Code × AWS CodePipeline: stage, artifact, approval, dan deploy aman
Rancang AWS CodePipeline dengan Claude Code: stage/action/artifact, CodeBuild, approval, S3, Lambda, dan cek kegagalan.
“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";
import * as ecs from "aws-cdk-lib/aws-ecs";
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.
Mulai dari bentuk minimum Source-Build-Test-Deploy
Untuk pemula, CodePipeline paling mudah dipahami sebagai jalur rilis. Pipeline adalah alur penuh. Stage adalah bagian seperti Source, Build, Test, atau Deploy. Action adalah tugas yang berjalan di dalam stage. Artifact adalah paket yang diberikan ke action berikutnya, misalnya source code atau folder dist dari CodeBuild.
Dokumentasi CodePipeline concepts memakai model yang sama. Saat meminta Claude Code membuat pipeline, jelaskan empat istilah ini agar hasilnya tidak terlalu luas dan lebih aman direview.
Pipeline pertama yang praktis adalah Source -> Build -> Test -> Approve -> Deploy. Panduan AWS menyebut pipeline perlu source stage dan minimal satu build atau deploy stage. Manual approval sebelum production memberi checkpoint manusia sebelum perubahan masuk ke user.
aws codepipeline create-pipeline --cli-input-json file://pipeline.json
aws codepipeline get-pipeline-state --name webapp-main
aws codepipeline start-pipeline-execution --name webapp-main
Contoh deploy S3/CloudFront dan Lambda
Untuk static site, CodeBuild membuat dist lalu S3 deploy action mengekstraknya ke bucket. CloudFront invalidation sebaiknya dipisah sebagai CodeBuild action atau Lambda invoke action berikutnya. Untuk Lambda, CodeBuild membuat package dan CloudFormation melakukan deploy template.
version: 0.2
env:
variables:
AWS_REGION: ap-northeast-1
S3_BUCKET: my-webapp-prod
CLOUDFRONT_DISTRIBUTION_ID: E1234567890ABC
phases:
install:
runtime-versions:
nodejs: 20
commands:
- npm ci
pre_build:
commands:
- npm test
- npm run lint
build:
commands:
- npm run build
post_build:
commands:
- aws s3 sync ./dist s3://$S3_BUCKET/ --delete --cache-control "public,max-age=300"
- aws cloudfront create-invalidation --distribution-id $CLOUDFRONT_DISTRIBUTION_ID --paths "/*"
artifacts:
base-directory: dist
files:
- "**/*"
Tiga contoh sudah cukup untuk banyak tim: static site Astro atau Next.js ke S3/CloudFront, API Lambda lewat CloudFormation, dan alur tim dengan staging otomatis tapi production perlu approval. Memisahkan contoh ini membuat artifact, IAM, dan rollback lebih mudah dibaca.
Cara melihat kegagalan
Jika Source gagal, cek ConnectionArn, branch, dan artifact format. Jika Build gagal, cek log CodeBuild, buildspec, environment variable, dan IAM. Jika Deploy gagal, cek nama input artifact, permission bucket S3, role CloudFormation, path package Lambda, dan region.
aws codepipeline get-pipeline-state --name webapp-main
aws codepipeline list-action-executions --pipeline-name webapp-main --max-results 5
aws logs tail /aws/codebuild/webapp-build --since 30m --follow
Kesalahan umum: menghasilkan BuildOutput tetapi Deploy membaca SourceOutput; service role CodeBuild kurang permission untuk S3, CloudFront, CloudFormation, atau Lambda; secret disimpan sebagai environment variable plaintext. AWS actions guide memisahkan Source, Build, Test, Deploy, Approval, dan Invoke, jadi review permission juga per action.
Prompt aman untuk Claude Code
Tambahkan CI/CD AWS CodePipeline + CodeBuild ke repository ini.
Tujuan: Source dari GitHub main, Build menjalankan npm ci/test/build, Test sebagai action terpisah, Manual approval sebelum production, Deploy ke S3 dan invalidasi CloudFront.
Batasan: jangan pakai AdministratorAccess, jangan pakai IAM wildcard luas, jangan deploy production tanpa approval, jangan simpan secret sebagai plaintext env var, jangan hapus pipeline atau bucket yang sudah ada.
Output: buildspec.yml, pipeline.json atau CDK stack, command diagnosis kegagalan, panduan operasi README.
Verifikasi: jelaskan setup saat ini sebelum mengubah, tampilkan diff, dokumentasikan aws codepipeline get-pipeline-state dan cara membaca log CodeBuild.
Prompt ini mengikuti Create a pipeline, stages, and actions dan Define CI/CD pipelines. Minta Claude Code menjelaskan konsep resmi yang dipakai agar review lebih cepat.
Catatan verifikasi gaya Masa dan langkah berikutnya
Kebiasaan kecil yang paling membantu adalah menamai artifact secara tetap: SourceOutput, BuildOutput, TestOutput. Dengan begitu, titik gagal cepat terlihat. Untuk pemula, versi JSON atau console lebih mudah dipahami sebelum semuanya diabstraksikan dengan CDK.
Topik ini terhubung dengan AWS IAM, AWS S3, dan AWS Lambda. Untuk belajar sendiri, mulai dari PDF gratis. Untuk tim, rancang buildspec, IAM, approval, rollback, dan diagnosis bersama; halaman training dan konsultasi Claude Code adalah langkah berikutnya.
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
PDF gratis: cheatsheet Claude Code
Masukkan email dan unduh satu halaman berisi command, kebiasaan review, dan workflow aman.
Kami menjaga datamu dan tidak mengirim spam.
Tentang penulis
Masa
Engineer yang berfokus pada workflow Claude Code praktis dan adopsi tim.
Artikel terkait
Workflow Obsidian ke CLAUDE.md untuk Claude Code
Ubah catatan kerja Obsidian menjadi operating note CLAUDE.md agar konteks tidak dijelaskan ulang.
Claude Code Revenue CTA Routing: dari artikel ke PDF, Gumroad, dan konsultasi
Workflow Claude Code untuk mengarahkan pembaca ke PDF gratis, Gumroad, atau konsultasi sesuai intent.
Aturan handoff tim Claude Code: bukti review, permission, rollback, dan jalur revenue
Format handoff Claude Code untuk tim: bukti, permission rule, rollback, PDF gratis, Gumroad, dan konsultasi.