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 diffsebelum 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
| Perintah | Yang terjadi |
|---|---|
cdk synth | Menghasilkan template CloudFormation ke cdk.out/. Tidak menyentuh AWS. |
cdk diff | Membandingkan dengan stack yang sedang berjalan. Baca kolom replace. |
cdk deploy | Deploy. Menampilkan perubahan IAM untuk kamu setujui. |
cdk destroy | Hapus stack. Resource ber-RETAIN tetap tinggal. |
cdk watch | Deploy 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.