AWS DVA-C02
Esc
↑↓เลื่อน↵เปิดescปิด28 ผลลัพธ์
23

AWS CDK

เขียน Infrastructure as Code ด้วยภาษาโปรแกรมจริง แล้ว synthesize เป็น CloudFormation

Developer Tools & IaC 14 นาที 18 คำถาม

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) พร้อมกันในชุดเดียว
หมายเหตุ
หมายเหตุ: CDK ใช้ CloudFormation อยู่เบื้องหลัง ดังนั้นทุก resource ที่ deploy ผ่าน CDK จะถูกจัดการเป็น CloudFormation stack และเห็น drift detection, rollback, change set ได้ตามปกติของ CloudFormation
เคล็ดลับ
ข้อสอบมักถามว่า 'ต้องการเขียน IaC ด้วยภาษาโปรแกรม (เช่น Python/TypeScript) แทน YAML และให้ deploy ทั้ง infra + Lambda code ในชุดเดียว' คำตอบคือ AWS CDK เสมอ

02CDK vs CloudFormation vs SAM

นี่คือจุดที่ออกสอบบ่อยที่สุด ต้องแยกให้ออกว่าเครื่องมือไหนเหมาะกับงานแบบใด ทั้งสามตัวสุดท้ายแล้ว deploy ผ่าน CloudFormation ทั้งหมด

ประเด็นAWS CDKCloudFormation (raw)AWS SAM
รูปแบบที่เขียนภาษาโปรแกรม (TS, Python, Java, C#, Go)YAML / JSON templateYAML (ขยายจาก CFN)
โฟกัสทุกประเภท resource (infra + app)ทุกประเภท resourceServerless (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 engineSAM 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 ในเครื่อง
เคล็ดลับ
ตัวช่วยจำสำหรับข้อสอบ: ถ้าโจทย์บอก 'serverless + YAML + test Lambda locally' -> SAM | ถ้าบอก 'เขียนด้วยภาษาโปรแกรม / reuse component / infra ครบทุกอย่าง' -> CDK | ถ้าบอก 'control template ทุก property แบบ raw' -> CloudFormation

03ลำดับชั้น App -> Stack -> Construct

โครงสร้างของแอป CDK เป็นแบบ tree (construct tree) มี 3 ระดับหลักที่ต้องเข้าใจ

App
หน่วยบนสุดของ CDK application — root construct ที่บรรจุ Stacks หนึ่งหรือหลายตัว เมื่อรัน cdk synth จะสังเคราะห์ทุก stack ออกมาเป็น CloudFormation templates
Stack
หน่วย deploy ที่ map ตรงกับ CloudFormation stack หนึ่งตัว — resource ภายใน stack ถูก provision/อัปเดต/ลบไปด้วยกัน และกำหนด environment (account/region) ได้
Construct
หน่วยพื้นฐาน (building block) ของ CDK แทน AWS resource หนึ่งตัวหรือกลุ่ม resource ที่ประกอบกัน นำมาซ้อนกันเป็น construct tree ภายใน stack
typescript
import * 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();
หมายเหตุ
id ของ construct ต้อง unique ภายใน scope เดียวกันเท่านั้น (ไม่ต้อง unique ทั้งแอป) CDK ใช้ id นี้ในการ generate CloudFormation logical ID ให้อัตโนมัติ

04Constructs ระดับ L1, L2, L3

Constructs จาก AWS Construct Library แบ่งเป็น 3 ระดับตาม ระดับ abstraction ยิ่งสูงยิ่งง่าย (ต้องเขียนน้อย) แต่ปรับแต่งได้น้อยลง ยิ่งต่ำยิ่งคุมละเอียดได้มากแต่ต้องเขียนเยอะ นี่คือจุดออกสอบหลักของ CDK

L1 Constructs (CFN Resources)
Constructs ระดับต่ำสุด (ขึ้นต้นด้วย Cfn) map ตรง 1:1 กับ CloudFormation resource ต้องกำหนดทุก property เอง — ควบคุมละเอียดสุดแต่เขียนเยอะ
L2 Constructs (Curated / AWS-curated)
Constructs ที่ AWS curate มาให้ มี default ที่ปลอดภัย และ helper methods (เช่น bucket.grantRead()) ลด boilerplate — เป็นระดับที่ใช้บ่อยที่สุด
L3 Constructs (Patterns)
Patterns ที่รวมหลาย resource เป็นสถาปัตยกรรมสำเร็จรูป (เช่น ApplicationLoadBalancedFargateService) deploy ทั้งชุดได้ในไม่กี่บรรทัด
ระดับชื่อเรียกAbstractionลักษณะเด่น
L1CFN Resources (ขึ้นต้น Cfn)ต่ำสุด / ไม่มีแมป 1:1 กับ CFN resource ต้องตั้ง property เองทุกตัว
L2Curatedกลางมี defaults + helper methods (เช่น grantRead) ใช้บ่อยสุด
L3Patternsสูงสุดรวมหลาย resource เป็น architecture pattern สำเร็จรูป
ระวัง
กับดักข้อสอบ: ถ้าเจอชื่อ construct ขึ้นต้นด้วย `Cfn` (เช่น CfnBucket) นั่นคือ L1 เสมอ ไม่ใช่ L2 — อย่าสับสน L1 = ไม่มี default ต้องระบุ property เองครบ ส่วน helper อย่าง grantRead/grantWrite เป็นของ L2 ไม่ใช่ L1

05Construct 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 ทั่วไป
หมายเหตุ
CDK v1 สิ้นสุด support ตั้งแต่ 1 มิ.ย. 2023 — ปัจจุบันใช้ CDK v2 ที่รวมทุก module ไว้ใน 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 synthsynthesize โค้ดเป็น CloudFormation template (เก็บใน cdk.out) — default แสดงเป็น YAML, ใส่ --json ได้
cdk bootstrapเตรียม resource ที่จำเป็น (S3 bucket, ECR repo, IAM roles) ใน account/region ก่อน deploy ครั้งแรก
cdk deploydeploy stack ไปยัง AWS (synth ใหม่ก่อน deploy เสมอ)
cdk diffเปรียบเทียบ stack ปัจจุบันกับที่ deploy ไปแล้ว แสดงสิ่งที่จะเปลี่ยน
cdk destroyลบ stack ออกจาก AWS
cdk ls / cdk listแสดงรายการ stack ในแอป
bash
# สร้างโปรเจกต์ใหม่
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 destroy
เคล็ดลับ
จำให้แม่น: cdk synth = สร้าง CloudFormation template | cdk deploy = นำ stack ขึ้น AWS | cdk diff = ดูความต่างก่อน deploy ข้อสอบชอบสลับหน้าที่คำสั่งเหล่านี้มาหลอก

07CDK 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
bash
# bootstrap environment ปัจจุบัน (จาก profile/credentials)
cdk bootstrap

# ระบุ account/region ชัดเจน
cdk bootstrap aws://111122223333/us-east-1

# ระบุ profile
cdk bootstrap --profile prod aws://111122223333/ap-southeast-1
ระวัง
กับดักข้อสอบ: ถ้า deploy แล้วเจอ error ทำนอง 'environment ... has not been bootstrapped' หรือ 'need to perform a bootstrap' สาเหตุคือ ยังไม่ได้รัน `cdk bootstrap` ใน account/region นั้น — ต้อง bootstrap ก่อน ไม่ใช่ปัญหา IAM permission หรือ synth แต่อย่างใด และอย่าลืมว่าต้อง bootstrap แยกทุก account/region

08CDK 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) ที่เตรียมไว้แล้ว
typescript
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
});
หมายเหตุ
หมายเหตุ: เมื่อใช้ asset (เช่น fromAsset) template ที่ synth ออกมาจะอ้างถึง S3 location ของ asset ทำให้ต้อง bootstrap ก่อนถึงจะ deploy ได้สำเร็จ

09CDK Unit Testing

เนื่องจาก CDK เขียนด้วยภาษาโปรแกรม จึงเขียน unit test สำหรับ infrastructure ได้ ใช้ module assertions (aws-cdk-lib/assertions) ร่วมกับ test framework เช่น Jest (TypeScript) หรือ pytest (Python) มี 2 รูปแบบหลัก

Fine-grained assertions
ทดสอบว่า template ที่ synth ออกมามี resource/property ตามที่คาด (เช่น template.hasResourceProperties(...)) — ตรวจเฉพาะจุดที่สนใจ
Snapshot tests
เก็บ snapshot ของ CloudFormation template แล้วเทียบกับครั้งก่อน ถ้าต่างจะ fail ช่วยจับการเปลี่ยนแปลงที่ไม่ตั้งใจ
typescript
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);
});
เคล็ดลับ
ข้อสอบ: ถ้าโจทย์ถามว่าจะ test ว่า CDK สร้าง resource ที่ถูกต้องได้อย่างไร -> ใช้ module assertions ทำ fine-grained assertions (ตรวจ property เฉพาะจุด) หรือ snapshot tests (เทียบ template ทั้งก้อน)

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
ระวัง
ระวังคำลวง: CDK ไม่ได้แทนที่ CloudFormation — มันสร้าง CloudFormation template ขึ้นมาให้ และ CDK ไม่จำกัดเฉพาะ serverless (นั่นคือ SAM) แต่รองรับ resource ทุกชนิด

คำถามทบทวน

ทดสอบความเข้าใจหัวข้อ AWS CDK

18 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย

ทำแล้ว 0/18คะแนน 0
  1. 1.ทีมพัฒนาต้องการเขียน infrastructure ด้วยภาษา TypeScript และ Python แทนการเขียน CloudFormation YAML โดยตรง และต้องการ deploy ทั้ง VPC, ECS และ Lambda code ในชุดเดียว ควรใช้บริการใด?

  2. 2.ใน AWS CDK construct ที่มีชื่อ class ขึ้นต้นด้วย 'Cfn' (เช่น CfnBucket) จัดเป็นระดับใด?

  3. 3.นักพัฒนา deploy CDK stack เป็นครั้งแรกใน account/region ใหม่ แล้วได้ error ว่า environment ยังไม่ได้ bootstrapped ต้องทำอย่างไร?

  4. 4.คำสั่ง CDK ใดที่ใช้แปลงโค้ด CDK ให้เป็น CloudFormation template?

  5. 5.Construct ระดับใดใน CDK ที่มี helper methods เช่น bucket.grantRead(lambda) และมี sensible defaults พร้อม best-practice security?

  6. 6.เมื่อใช้ lambda.Code.fromAsset() เพื่อ bundle โค้ด Lambda ใน CDK โค้ดนั้นจะถูกอัปโหลดไปเก็บที่ใด?

  7. 7.ทีมต้องการ deploy เฉพาะ serverless application (Lambda + API Gateway + DynamoDB) ด้วย YAML ที่กระชับ และสามารถ test Lambda function บนเครื่อง local ได้ ควรใช้เครื่องมือใด?

  8. 8.ลำดับชั้นใน CDK app ที่ถูกต้องคือข้อใด และอะไรแมปเป็น 1 CloudFormation stack?

  9. 9.นักพัฒนาต้องการเขียน unit test เพื่อยืนยันว่า CDK stack สร้าง S3 bucket ที่เปิด versioning จริง ควรใช้สิ่งใด?

  10. 10.Construct ระดับ L3 ในข้อใดอธิบายได้ถูกต้อง?

  11. 11.cdk bootstrap สร้าง CloudFormation stack ชื่ออะไร และมี resource หลักใดบ้าง?

  12. 12.ก่อน deploy นักพัฒนาต้องการดูว่ามี resource อะไรเปลี่ยนแปลงบ้างเทียบกับที่ deploy ไปแล้ว ควรใช้คำสั่งใด?

  13. 13.ข้อใดอธิบายความสัมพันธ์ระหว่าง CDK และ CloudFormation ได้ถูกต้องที่สุด?

  14. 14.นักพัฒนาต้องการ test ว่า template ที่ CDK synth ออกมาไม่เปลี่ยนแปลงโดยไม่ตั้งใจระหว่างการแก้โค้ด ควรใช้เทคนิคใด?

  15. 15.องค์กรจะ deploy CDK stack เดียวกันไปยัง 2 account และ 3 region ต้อง bootstrap อย่างไร?

  16. 16.ภาษาใดต่อไปนี้ที่ AWS CDK รองรับสำหรับเขียน infrastructure?

  17. 17.ที่ใดที่สามารถค้นหาและนำ construct ที่สร้างโดยชุมชน/third-party มา reuse ในโปรเจกต์ CDK?

  18. 18.คำสั่งใดใช้สร้างโปรเจกต์ CDK ใหม่พร้อมระบุภาษา?