Use Cases (Diperbarui: 1/6/2026)

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.

Claude Code × AWS CodePipeline: stage, artifact, approval, dan deploy aman

“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

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
Gratis

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.

Masa

Tentang penulis

Masa

Engineer yang berfokus pada workflow Claude Code praktis dan adopsi tim.