การ Deploy ไปผิด Region ด้วย AWS CDK + PowerShell + SSO และการแก้ไขปัญหา
บทนำ
“Deploy สำเร็จแล้ว!” — เราคิดแบบนั้น แต่ CloudFormation stack ถูกสร้างใน us-east-1 (N. Virginia) ไม่ใช่ ap-northeast-1 (Tokyo)
นี่คือบันทึกความล้มเหลวกับ AWS CDK + Windows PowerShell + AWS SSO และการแก้ไขในภายหลัง
การตั้งค่า
- OS: Windows 11
- Shell: PowerShell 5.1
- AWS auth: AWS SSO (IAM Identity Center)
- CDK version: 2.x
- Target region: ap-northeast-1 (Tokyo)
สิ่งที่เกิดขึ้น
# รันคำสั่ง CDK deploy
cdk deploy --profile myproject-dev
เมื่อตรวจสอบในภายหลัง CloudFormation stack อยู่ใน us-east-1 ไม่ใช่ Tokyo
การวิเคราะห์สาเหตุ
สาเหตุ 1: ไม่ได้กำหนดค่า CDK env
// cdk/lib/app-stack.ts
const app = new cdk.App();
new AppStack(app, 'DvdRentalStack', {
// ไม่ได้ระบุ env
});
เมื่อไม่ได้ระบุ env CDK จะ resolve region จาก environment variables หรือการตั้งค่าเริ่มต้น ขณะ deploy
// วิธีที่ถูกต้อง
new AppStack(app, 'DvdRentalStack', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: 'ap-northeast-1', // ระบุอย่างชัดเจน
}
});
สาเหตุ 2: Environment variable ของ AWS ใน PowerShell ยังค้างอยู่
Environment variable us-east-1 จากงานก่อนหน้ายังถูกตั้งค่าอยู่
# Environment variable ที่ยังค้างอยู่
$env:AWS_DEFAULT_REGION # = "us-east-1"
CDK ให้ความสำคัญกับ environment variables มากกว่าการตั้งค่า profile ดังนั้นแม้จะตั้งค่า Tokyo ใน profile ก็ยังชี้ไปที่ us-east-1
สาเหตุ 3: ข้ามการตรวจสอบด้วย cdk synth
# ควรจะรันสิ่งนี้ก่อน deploy
cdk synth --profile myproject-dev
การตรวจสอบว่า ap-northeast-1 ปรากฏใน output ของ cdk synth จะช่วยให้พบปัญหาก่อน deploy
การแก้ไขปัญหา
จำเป็นต้องลบ stack ใน region ที่ผิดและสร้างใหม่ใน region ที่ถูกต้อง
ขั้นตอนที่ 1: ตรวจสอบ stack ใน region ที่ผิด
# ตรวจสอบ stacks ใน us-east-1
aws cloudformation describe-stacks `
--region us-east-1 `
--profile myproject-dev `
--query "Stacks[?StackName=='DvdRentalStack'].{Name:StackName,Status:StackStatus}"
ขั้นตอนที่ 2: ลบ stack ใน region ที่ผิด
aws cloudformation delete-stack `
--stack-name DvdRentalStack `
--region us-east-1 `
--profile myproject-dev
รอให้การลบเสร็จสิ้น:
aws cloudformation wait stack-delete-complete `
--stack-name DvdRentalStack `
--region us-east-1 `
--profile myproject-dev
ขั้นตอนที่ 3: Deploy ไปยัง region ที่ถูกต้อง
ล้าง environment variables และตั้งค่า Tokyo region อย่างชัดเจน:
# ล้าง environment variables ที่ผิด
Remove-Item Env:AWS_DEFAULT_REGION -ErrorAction SilentlyContinue
Remove-Item Env:AWS_REGION -ErrorAction SilentlyContinue
# ตรวจสอบ region ใน synth output ก่อน deploy
cdk synth --profile myproject-dev | Select-String "ap-northeast-1"
# Deploy หลังการยืนยัน
cdk deploy --profile myproject-dev
มาตรการป้องกัน
มาตรการ 1: ระบุ CDK env อย่างชัดเจนเสมอ
new AppStack(app, 'DvdRentalStack', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: 'ap-northeast-1', // hardcode เป็น Tokyo
}
});
มาตรการ 2: รัน cdk synth เสมอก่อน deploy
# ปฏิบัติตามขั้นตอนนี้เสมอ
cdk synth --profile myproject-dev # ← ตรวจสอบ region
cdk diff --profile myproject-dev # ← ตรวจสอบการเปลี่ยนแปลง
cdk deploy --profile myproject-dev # ← deploy
มาตรการ 3: Export credentials จาก PowerShell SSO อย่างชัดเจน
การตั้งค่า credentials ชั่วคราวจาก AWS SSO เป็นตัวแปร PowerShell ช่วยขจัดความกำกวมในการ resolve profile
# SSO login
aws sso login --profile myproject-dev
# รับและ export credentials ชั่วคราว
$creds = aws sts get-session-token --profile myproject-dev | ConvertFrom-Json
$env:AWS_ACCESS_KEY_ID = $creds.Credentials.AccessKeyId
$env:AWS_SECRET_ACCESS_KEY = $creds.Credentials.SecretAccessKey
$env:AWS_SESSION_TOKEN = $creds.Credentials.SessionToken
$env:AWS_DEFAULT_REGION = "ap-northeast-1"
# ตอนนี้คำสั่ง cdk ใช้ env vars แทน profile
cdk deploy
สรุป
บทเรียนที่ได้จากความล้มเหลังนี้:
- Hardcode CDK
envอย่างชัดเจน — อย่าพึ่งพา environment variables หรือค่าเริ่มต้น - ตรวจสอบ region ด้วย
cdk synthก่อน deploy — การตรวจสอบ manifest region เป็นแนวป้องกันสุดท้าย - ตรวจสอบว่า
$env:AWS_DEFAULT_REGIONใน PowerShell มีค่าค้างอยู่หรือไม่ — ระวังสิ่งที่ค้างมาจากงานก่อนหน้า - ถ้า deploy ไปผิด region ให้ cleanup ทันที — ปล่อยทิ้งไปถึงวันถัดไปจะทำให้ซับซ้อนยิ่งขึ้น
การรวมกันของ Windows + AWS SSO + CDK มีจุดที่ผิดพลาดได้หลายจุด แต่การทำให้การตรวจสอบ manifest ด้วย cdk synth เป็นนิสัยสามารถป้องกันการ deploy ผิด region ได้เกือบทั้งหมด
บทความที่เกี่ยวข้อง
→ การสร้างแอพ DVD Rental สำหรับผู้ใช้ควบคู่กับหน้าจัดการ — ภาพรวมโครงสร้าง Vue 3 + Spring Boot
→ การสร้างแอพจัดการ DVD Rental ด้วย Spring Boot + Thymeleaf บนฐานข้อมูลตัวอย่าง dvdrental