AWS CDK
เขียน Infrastructure as Code ด้วยภาษาโปรแกรมจริง แล้ว synthesize เป็น CloudFormation
01AWS CDK คืออะไร (ภาพรวม)
AWS Cloud Development Kit (CDK) คือ framework สำหรับเขียน Infrastructure as Code (IaC) โดยใช้ ภาษาโปรแกรมจริง แทนการเขียน template เปล่า ๆ คุณเขียนโครงสร้าง infrastructure (เช่น Lambda, S3, DynamoDB, VPC) ด้วยภาษาที่คุ้นเคย แล้ว CDK จะทำการ synthesize โค้ดเหล่านั้นออกมาเป็น CloudFormation template (JSON/YAML) เพื่อนำไป deploy ต่อ
- ภาษาที่รองรับ: TypeScript, JavaScript, Python, Java, C#/.NET, และ Go
- ผลลัพธ์สุดท้ายคือ CloudFormation template เสมอ (CDK เป็นแค่ตัวสร้าง template ขึ้นมา ไม่ใช่ deployment engine ใหม่)
- ได้ประโยชน์จากภาษาโปรแกรม: ใช้ loop, condition, function, class, การ reuse code (component), autocomplete จาก IDE และ type checking
- เหมาะมากกับการ deploy ทั้ง infrastructure (เช่น VPC, IAM) และ application code (เช่น Lambda, Docker container) พร้อมกันในชุดเดียว
02CDK vs CloudFormation vs SAM
นี่คือจุดที่ออกสอบบ่อยที่สุด ต้องแยกให้ออกว่าเครื่องมือไหนเหมาะกับงานแบบใด ทั้งสามตัวสุดท้ายแล้ว deploy ผ่าน CloudFormation ทั้งหมด
| ประเด็น | AWS CDK | CloudFormation (raw) | AWS SAM |
|---|---|---|---|
| รูปแบบที่เขียน | ภาษาโปรแกรม (TS, Python, Java, C#, Go) | YAML / JSON template | YAML (ขยายจาก CFN) |
| โฟกัส | ทุกประเภท resource (infra + app) | ทุกประเภท resource | Serverless (Lambda, API GW, DynamoDB) |
| ผลลัพธ์ | synth -> CloudFormation template | เป็น template โดยตรง | transform -> CloudFormation template |
| จุดเด่น | ใช้ logic ภาษาโปรแกรม, reuse, L2/L3 abstraction | ควบคุมละเอียดทุก property | เขียน serverless สั้น กระชับ + local testing |
| Local testing | ทดสอบ unit test ของ infra ได้ | ไม่มี local engine | SAM CLI (sam local) รัน Lambda/API ในเครื่องได้ |
- SAM = serverless-focused (เน้น Lambda/serverless) เขียนเป็น YAML และมี SAM CLI สำหรับทดสอบ Lambda บนเครื่อง local (sam local invoke / sam local start-api)
- CDK = ครอบคลุมทุก resource และเขียนด้วยภาษาโปรแกรม เหมาะกับ infra ที่ซับซ้อน (เช่น VPC + ECS + IAM) หรือทีมที่ถนัด coding
- CDK สามารถใช้ร่วมกับ SAM CLI ได้ คือ synth template ออกมาแล้วใช้ sam local เพื่อ test Lambda ในเครื่อง
03ลำดับชั้น App -> Stack -> Construct
โครงสร้างของแอป CDK เป็นแบบ tree (construct tree) มี 3 ระดับหลักที่ต้องเข้าใจ
cdk synth จะสังเคราะห์ทุก stack ออกมาเป็น CloudFormation templatesimport * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
class MyStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Construct: scope=this, id='MyBucket', props={...}
new s3.Bucket(this, 'MyBucket', {
versioned: true,
encryption: s3.BucketEncryption.S3_MANAGED,
});
}
}
const app = new cdk.App(); // App = root
new MyStack(app, 'MyStack'); // Stack
app.synth();04Constructs ระดับ L1, L2, L3
Constructs จาก AWS Construct Library แบ่งเป็น 3 ระดับตาม ระดับ abstraction ยิ่งสูงยิ่งง่าย (ต้องเขียนน้อย) แต่ปรับแต่งได้น้อยลง ยิ่งต่ำยิ่งคุมละเอียดได้มากแต่ต้องเขียนเยอะ นี่คือจุดออกสอบหลักของ CDK
bucket.grantRead()) ลด boilerplate — เป็นระดับที่ใช้บ่อยที่สุดApplicationLoadBalancedFargateService) deploy ทั้งชุดได้ในไม่กี่บรรทัด| ระดับ | ชื่อเรียก | Abstraction | ลักษณะเด่น |
|---|---|---|---|
| L1 | CFN Resources (ขึ้นต้น Cfn) | ต่ำสุด / ไม่มี | แมป 1:1 กับ CFN resource ต้องตั้ง property เองทุกตัว |
| L2 | Curated | กลาง | มี defaults + helper methods (เช่น grantRead) ใช้บ่อยสุด |
| L3 | Patterns | สูงสุด | รวมหลาย resource เป็น architecture pattern สำเร็จรูป |
CfnBucket) นั่นคือ L1 เสมอ ไม่ใช่ L2 — อย่าสับสน L1 = ไม่มี default ต้องระบุ property เองครบ ส่วน helper อย่าง grantRead/grantWrite เป็นของ L2 ไม่ใช่ L105Construct Library & Construct Hub
- AWS Construct Library = library มาตรฐานที่มาพร้อม CDK (ใน v2 รวมอยู่ใน package เดียวคือ
aws-cdk-lib) บรรจุ L1/L2/L3 constructs ที่ stable พร้อมใช้งาน production - constructs เป็น base class ที่ทุก construct extends และเป็นส่วนหนึ่งของ Construct Programming Model (CPM) ซึ่งใช้ได้กับ CDK for Terraform (CDKtf) และ CDK for Kubernetes (CDK8s) ด้วย
- Construct Hub (constructs.dev) = ที่รวม construct จากชุมชน/third-party ให้ค้นหาและนำมา reuse ได้
- คุณสามารถสร้าง custom construct ของตัวเองด้วย composition (ประกอบ construct ระดับล่างหลายตัวเข้าด้วยกัน) แล้ว publish/share ให้ทีมอื่นใช้ได้เหมือน library ทั่วไป
aws-cdk-lib เดียว (ยกเว้น construct ที่ยัง experimental จะแยก module ต่างหาก)06CDK CLI Commands
CDK CLI (หรือ CDK Toolkit) ติดตั้งผ่าน npm (npm install -g aws-cdk) ทุกคำสั่งขึ้นต้นด้วย cdk นี่คือคำสั่งที่ต้องจำสำหรับสอบ
| คำสั่ง | หน้าที่ |
|---|---|
| cdk init | สร้างโปรเจกต์ CDK ใหม่ (ระบุ --language เช่น typescript, python) |
| cdk synth | synthesize โค้ดเป็น CloudFormation template (เก็บใน cdk.out) — default แสดงเป็น YAML, ใส่ --json ได้ |
| cdk bootstrap | เตรียม resource ที่จำเป็น (S3 bucket, ECR repo, IAM roles) ใน account/region ก่อน deploy ครั้งแรก |
| cdk deploy | deploy stack ไปยัง AWS (synth ใหม่ก่อน deploy เสมอ) |
| cdk diff | เปรียบเทียบ stack ปัจจุบันกับที่ deploy ไปแล้ว แสดงสิ่งที่จะเปลี่ยน |
| cdk destroy | ลบ stack ออกจาก AWS |
| cdk ls / cdk list | แสดงรายการ stack ในแอป |
# สร้างโปรเจกต์ใหม่
mkdir my-cdk-app && cd my-cdk-app
cdk init app --language typescript
# เตรียม environment (ทำครั้งแรกต่อ account/region)
cdk bootstrap
# ดู template ที่ synth ออกมา
cdk synth
# ดูความเปลี่ยนแปลงก่อน deploy
cdk diff
# deploy ขึ้น AWS
cdk deploy
# ลบทิ้ง
cdk destroy07CDK Bootstrapping (CDKToolkit Stack)
Bootstrapping คือกระบวนการเตรียม resource พื้นฐานที่ CDK ต้องใช้ในการ deploy ก่อนที่จะ deploy app stack ใด ๆ ได้ ทำผ่านคำสั่ง cdk bootstrap
cdk bootstrapจะสร้าง CloudFormation stack ชื่อ CDKToolkit ขึ้นมาใน account/region นั้น- Resource ที่สร้างขึ้นได้แก่ S3 bucket (เก็บ assets เช่น Lambda code bundle, file ขนาดใหญ่), ECR repository (เก็บ Docker image ที่ build), และ IAM roles (สำหรับ deploy/publish assets)
- ต้อง bootstrap แยกแต่ละ environment คือแยกตาม account + region (ทุก account/region combination ที่จะ deploy ต้อง bootstrap ของตัวเอง)
- ทำครั้งเดียวต่อ environment ก็เพียงพอ ไม่ต้องทำซ้ำทุก deploy
# bootstrap environment ปัจจุบัน (จาก profile/credentials)
cdk bootstrap
# ระบุ account/region ชัดเจน
cdk bootstrap aws://111122223333/us-east-1
# ระบุ profile
cdk bootstrap --profile prod aws://111122223333/ap-southeast-108CDK Assets (Lambda Code & Docker Image)
Assets คือไฟล์หรือข้อมูลภายนอกที่ CDK รวม (bundle) เข้าไปในการ deploy เช่น โค้ด Lambda, Docker image, หรือไฟล์ static ต่าง ๆ CDK จะอัปโหลด assets เหล่านี้ไปเก็บที่ resource ที่สร้างตอน bootstrap
- Lambda code / file assets -> CDK bundle และอัปโหลดไปที่ S3 bucket ของ CDKToolkit
- Docker image assets -> CDK build image แล้ว push ไปที่ ECR repository ของ CDKToolkit
- ตอน synth/deploy, CDK จะคำนวณ hash ของ asset เพื่อตรวจว่ามีการเปลี่ยนแปลงหรือไม่ (ถ้าไม่เปลี่ยนก็ไม่ upload ซ้ำ)
- นี่คือเหตุผลที่ต้อง bootstrap ก่อน — เพราะ assets ต้องมีที่เก็บ (S3/ECR) ที่เตรียมไว้แล้ว
import * as lambda from 'aws-cdk-lib/aws-lambda';
// Lambda code asset -> อัปโหลดไป S3 ของ CDKToolkit
new lambda.Function(this, 'MyFn', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'), // โฟลเดอร์โค้ด = asset
});09CDK Unit Testing
เนื่องจาก CDK เขียนด้วยภาษาโปรแกรม จึงเขียน unit test สำหรับ infrastructure ได้ ใช้ module assertions (aws-cdk-lib/assertions) ร่วมกับ test framework เช่น Jest (TypeScript) หรือ pytest (Python) มี 2 รูปแบบหลัก
template.hasResourceProperties(...)) — ตรวจเฉพาะจุดที่สนใจimport { Template } from 'aws-cdk-lib/assertions';
import * as cdk from 'aws-cdk-lib';
import { MyStack } from '../lib/my-stack';
test('S3 bucket created with versioning', () => {
const app = new cdk.App();
const stack = new MyStack(app, 'TestStack');
const template = Template.fromStack(stack);
// fine-grained assertion
template.hasResourceProperties('AWS::S3::Bucket', {
VersioningConfiguration: { Status: 'Enabled' },
});
template.resourceCountIs('AWS::S3::Bucket', 1);
});10สรุปจุดออกสอบ DVA-C02
- CDK = เขียน IaC ด้วยภาษาโปรแกรม (TS/Python/Java/C#/Go) แล้ว synth เป็น CloudFormation template
- **L1 (Cfn*) = ไม่มี default, L2 (curated) = มี default + helper เช่น grantRead, L3 (patterns) = architecture สำเร็จรูป**
- cdk synth สร้าง template | cdk bootstrap เตรียม S3/ECR/IAM (CDKToolkit stack) | cdk deploy ขึ้น AWS
- ต้อง bootstrap แยกทุก account/region ก่อน deploy ครั้งแรก
- Assets: Lambda code -> S3, Docker image -> ECR (ของ CDKToolkit)
- SAM = serverless + YAML + local test | CDK = ภาษาโปรแกรม + ครอบคลุมทุก resource | ทั้งคู่ deploy ผ่าน CloudFormation
- Testing: module assertions -> fine-grained assertions + snapshot tests
คำถามทบทวน
ทดสอบความเข้าใจหัวข้อ AWS CDK
18 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย
1.ทีมพัฒนาต้องการเขียน infrastructure ด้วยภาษา TypeScript และ Python แทนการเขียน CloudFormation YAML โดยตรง และต้องการ deploy ทั้ง VPC, ECS และ Lambda code ในชุดเดียว ควรใช้บริการใด?
2.ใน AWS CDK construct ที่มีชื่อ class ขึ้นต้นด้วย 'Cfn' (เช่น CfnBucket) จัดเป็นระดับใด?
3.นักพัฒนา deploy CDK stack เป็นครั้งแรกใน account/region ใหม่ แล้วได้ error ว่า environment ยังไม่ได้ bootstrapped ต้องทำอย่างไร?
4.คำสั่ง CDK ใดที่ใช้แปลงโค้ด CDK ให้เป็น CloudFormation template?
5.Construct ระดับใดใน CDK ที่มี helper methods เช่น bucket.grantRead(lambda) และมี sensible defaults พร้อม best-practice security?
6.เมื่อใช้ lambda.Code.fromAsset() เพื่อ bundle โค้ด Lambda ใน CDK โค้ดนั้นจะถูกอัปโหลดไปเก็บที่ใด?
7.ทีมต้องการ deploy เฉพาะ serverless application (Lambda + API Gateway + DynamoDB) ด้วย YAML ที่กระชับ และสามารถ test Lambda function บนเครื่อง local ได้ ควรใช้เครื่องมือใด?
8.ลำดับชั้นใน CDK app ที่ถูกต้องคือข้อใด และอะไรแมปเป็น 1 CloudFormation stack?
9.นักพัฒนาต้องการเขียน unit test เพื่อยืนยันว่า CDK stack สร้าง S3 bucket ที่เปิด versioning จริง ควรใช้สิ่งใด?
10.Construct ระดับ L3 ในข้อใดอธิบายได้ถูกต้อง?
11.cdk bootstrap สร้าง CloudFormation stack ชื่ออะไร และมี resource หลักใดบ้าง?
12.ก่อน deploy นักพัฒนาต้องการดูว่ามี resource อะไรเปลี่ยนแปลงบ้างเทียบกับที่ deploy ไปแล้ว ควรใช้คำสั่งใด?
13.ข้อใดอธิบายความสัมพันธ์ระหว่าง CDK และ CloudFormation ได้ถูกต้องที่สุด?
14.นักพัฒนาต้องการ test ว่า template ที่ CDK synth ออกมาไม่เปลี่ยนแปลงโดยไม่ตั้งใจระหว่างการแก้โค้ด ควรใช้เทคนิคใด?
15.องค์กรจะ deploy CDK stack เดียวกันไปยัง 2 account และ 3 region ต้อง bootstrap อย่างไร?
16.ภาษาใดต่อไปนี้ที่ AWS CDK รองรับสำหรับเขียน infrastructure?
17.ที่ใดที่สามารถค้นหาและนำ construct ที่สร้างโดยชุมชน/third-party มา reuse ในโปรเจกต์ CDK?
18.คำสั่งใดใช้สร้างโปรเจกต์ CDK ใหม่พร้อมระบุภาษา?