Use Cases

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

TugasKontribusi Claude Code
Generasi buildspec.ymlDihasilkan lengkap dengan build, test, Docker, dan pemindaian keamanan
Pipeline CDKAuto-hasilkan semua stage dari Source→Build→Deploy
Desain multi-lingkunganRancang deployment bertahap dengan gate persetujuan manual
Laporan pengujianOtomatiskan 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

Referensi

#claude-code #aws #codepipeline #codebuild #cicd #devops

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.