Tech Blog

การ Deploy ไปผิด Region ด้วย AWS CDK + PowerShell + SSO และการแก้ไขปัญหา

by Tech Writer
AWS CDK CloudFormation PowerShell

บทนำ

“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

สรุป

บทเรียนที่ได้จากความล้มเหลังนี้:

  1. Hardcode CDK env อย่างชัดเจน — อย่าพึ่งพา environment variables หรือค่าเริ่มต้น
  2. ตรวจสอบ region ด้วย cdk synth ก่อน deploy — การตรวจสอบ manifest region เป็นแนวป้องกันสุดท้าย
  3. ตรวจสอบว่า $env:AWS_DEFAULT_REGION ใน PowerShell มีค่าค้างอยู่หรือไม่ — ระวังสิ่งที่ค้างมาจากงานก่อนหน้า
  4. ถ้า deploy ไปผิด region ให้ cleanup ทันที — ปล่อยทิ้งไปถึงวันถัดไปจะทำให้ซับซ้อนยิ่งขึ้น

การรวมกันของ Windows + AWS SSO + CDK มีจุดที่ผิดพลาดได้หลายจุด แต่การทำให้การตรวจสอบ manifest ด้วย cdk synth เป็นนิสัยสามารถป้องกันการ deploy ผิด region ได้เกือบทั้งหมด


บทความที่เกี่ยวข้อง

การสร้างแอพ DVD Rental สำหรับผู้ใช้ควบคู่กับหน้าจัดการ — ภาพรวมโครงสร้าง Vue 3 + Spring Boot
การสร้างแอพจัดการ DVD Rental ด้วย Spring Boot + Thymeleaf บนฐานข้อมูลตัวอย่าง dvdrental

ส่งข้อความได้ตามสบาย

กรุณาส่งข้อความ หากมีคำปรึกษาด้านเทคนิค ความคิดเห็น หรือคำถาม