← Semua pembelajaran / AWS untuk AI Engineer
Fase 2 · IaC & CI/CD

AWS CDK — memulai

CDK membiarkanmu mendefinisikan resource AWS dengan Python, lalu men-generate CloudFormation dari situ. Bagi yang datang dari learn-python, ini terasa seperti pulang.

Intisari

  • Pasang CLI-nya lewat npm (aws-cdk), tapi kode infrastrukturmu tetap Python.
  • Alur harian: cdk synth → cdk diff → cdk deploy.
  • cdk diff sebelum deploy adalah kebiasaan yang menyelamatkan — ia menunjukkan resource mana yang akan diganti.
  • Satu app berisi satu atau banyak stack; stack adalah unit deploy.
  • CDK menghasilkan IAM policy paling sempit secara otomatis lewat metode grant_* — pakai itu, jangan tulis policy manual.

Memulai proyek

npm install -g aws-cdk          # CLI-nya Node, kodenya tetap Python
cdk --version

mkdir infra && cd infra
cdk init app --language python

uv venv && uv pip install -r requirements.txt
cdk bootstrap                   # sekali per akun+region — dibahas di materi berikutnya
cdk deploy

Stack pertama

from aws_cdk import (
    Duration, Stack, RemovalPolicy,
    aws_lambda as lambda_,
    aws_sqs as sqs,
    aws_apigatewayv2 as apigw,
)
from constructs import Construct


class TanyaBedrockStack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        antrean = sqs.Queue(
            self, "AntreanIngest",
            visibility_timeout=Duration.seconds(180),
            removal_policy=RemovalPolicy.RETAIN,
        )

        fungsi = lambda_.Function(
            self, "FungsiTanya",
            runtime=lambda_.Runtime.PYTHON_3_13,
            handler="app.handler",
            code=lambda_.Code.from_asset("../src"),
            timeout=Duration.seconds(30),
            memory_size=1024,
            environment={
                "MODEL_ID": "anthropic.claude-3-5-haiku-20241022-v1:0",
                "ANTREAN_URL": antrean.queue_url,
            },
        )

        # CDK menulis IAM policy paling sempit untuk hubungan ini — otomatis.
        antrean.grant_send_messages(fungsi)

Baris terakhir itu inti nilai CDK. grant_send_messages menghasilkan policy yang mengizinkan persis sqs:SendMessage pada persis ARN antrean itu, lalu menempelkannya ke role fungsi. Kamu tidak menulis JSON, tidak menyalin ARN, dan tidak tergoda menulis "Resource": "*" karena buru-buru.

Izin Bedrock

Bedrock belum punya metode grant_* untuk semua kasus, jadi di sini kamu memang menulis policy — tapi tetap dalam Python, dan tetap bisa dihitung dari variabel:

from aws_cdk import aws_iam as iam

MODEL_ID = "anthropic.claude-3-5-haiku-20241022-v1:0"

fungsi.add_to_role_policy(iam.PolicyStatement(
    actions=["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"],
    resources=[f"arn:aws:bedrock:{self.region}::foundation-model/{MODEL_ID}"],
))

Perintah yang dipakai tiap hari

PerintahYang terjadi
cdk synthMenghasilkan template CloudFormation ke cdk.out/. Tidak menyentuh AWS.
cdk diffMembandingkan dengan stack yang sedang berjalan. Baca kolom replace.
cdk deployDeploy. Menampilkan perubahan IAM untuk kamu setujui.
cdk destroyHapus stack. Resource ber-RETAIN tetap tinggal.
cdk watchDeploy otomatis saat file berubah — enak saat mengembangkan, jangan dipakai ke production.

Banyak lingkungan

import aws_cdk as cdk

app = cdk.App()

TanyaBedrockStack(app, "TanyaBedrock-Dev",
                  env=cdk.Environment(account="111111111111", region="us-east-1"))

TanyaBedrockStack(app, "TanyaBedrock-Prod",
                  env=cdk.Environment(account="222222222222", region="us-east-1"))

app.synth()

Kelas yang sama, dua stack. Karena ini Python biasa, perbedaan antar lingkungan cukup jadi parameter konstruktor — bukan dua berkas YAML yang perlahan menyimpang satu sama lain.

Latihan: ubah semua yang kamu buat manual di Fase 1 (Lambda, antrean SQS, HTTP API) jadi satu stack CDK. Jalankan cdk diff, baca keluarannya sampai paham setiap baris, lalu deploy. Hapus resource manual yang lama supaya tidak ada dua sumber kebenaran.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.