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

AWS Fundamentals: CLI, SDK & IAM

CLI Profiles, SDK, IMDS, Credentials Chain, Exponential Backoff และ SigV4 สำหรับ DVA-C02

Foundations & Identity 22 นาที 20 คำถาม

01AWS SDK Overview - เรียก API แบบ Programmatic

AWS SDK (Software Development Kit) คือชุดเครื่องมือสำหรับเรียก AWS API จากภายในโค้ดแอปพลิเคชันแบบ programmatic แทนการคลิกใน Console หรือพิมพ์คำสั่ง CLI ทำให้แอปสามารถสร้าง, อ่าน, จัดการ resource บน AWS ได้โดยตรง

  • มีให้ใช้หลายภาษา: Java, Python (boto3), JavaScript/Node.js, .NET, Go, Ruby, PHP, C++
  • ต้องระบุ default region เสมอ (ถ้าไม่ระบุบางภาษาจะ default เป็น us-east-1)
  • ต้องจัดการ credentials เพื่อให้ SDK รู้ว่าใครเป็นผู้เรียก (มักผ่าน credentials provider chain)
  • AWS CLI สร้างขึ้นบน AWS SDK for Python (boto3) - นี่คือเกร็ดที่ออกสอบได้
หมายเหตุ
ใช้ SDK เมื่อต้องการฝังการเรียก AWS API ลงในแอปพลิเคชันของคุณ ส่วน CLI เหมาะกับงาน scripting/automation บน command line

02EC2 Instance Metadata Service (IMDS)

EC2 Instance Metadata Service (IMDS) ให้ EC2 instance เรียกดูข้อมูลของตัวเองได้โดยไม่ต้องใช้ IAM permission ใดๆ เข้าถึงผ่าน URL พิเศษ (link-local address) ที่ http://169.254.169.254/latest/meta-data ซึ่งเข้าถึงได้จากภายใน instance เท่านั้น เข้าจากภายนอกไม่ได้

  • /latest/meta-data/ - ข้อมูล instance เช่น instance-id, hostname, AMI id, security groups
  • /latest/user-data - ข้อมูล user data ที่ใส่ตอน launch (เช่น bootstrap script)
  • /latest/meta-data/iam/security-credentials/<role-name> - ดึง IAM Role credentials
  • สิ่งที่สำคัญที่สุดสำหรับ developer: ดึง IAM role credentials ได้โดยไม่ต้องใส่ access key ในโค้ดเลย
bash
# IMDSv1 - เรียกตรงๆ (legacy)
curl http://169.254.169.254/latest/meta-data/

# ดึงชื่อ role ที่ attach อยู่
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/

# ดึง temporary credentials ของ role นั้น (คืนค่าเป็น JSON: AccessKeyId, SecretAccessKey, Token)
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/MyEC2Role
ระวัง
กับดักข้อสอบ: IMDS ดึง temporary credentials ของ IAM Role ได้ แต่ดึง IAM policy ที่ผูกกับ role ไม่ได้ และ credentials เหล่านี้ rotate อัตโนมัติ ห้ามเข้าใจผิดว่าเป็น access key ถาวร

03IMDSv1 vs IMDSv2 (Token-based)

AWS แนะนำให้ใช้ IMDSv2 ซึ่งปลอดภัยกว่าด้วยการเป็น token-based ต้องขอ session token ก่อนแล้วจึงนำไปใช้ใน request เพื่อป้องกันการโจมตีแบบ SSRF (Server-Side Request Forgery)

ประเด็นIMDSv1IMDSv2
วิธีเรียกGET ตรงๆ ได้เลยต้อง PUT ขอ token ก่อน แล้วใช้ token ใน GET
Tokenไม่ต้องใช้ต้องมี session token (มี TTL)
ความปลอดภัยต่ำกว่า เสี่ยง SSRFสูงกว่า ป้องกัน SSRF ได้
URL169.254.169.254169.254.169.254 (เดียวกัน)
ProtocolHTTPHTTP (เหมือนกัน)
bash
# IMDSv2 - Step 1: ขอ token (PUT) พร้อมกำหนด TTL
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \
  -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")

# IMDSv2 - Step 2: ใช้ token ใน GET request ทุกครั้ง
curl http://169.254.169.254/latest/meta-data/profile \
  -H "X-aws-ec2-metadata-token: $TOKEN"
เคล็ดลับ
จำข้อสอบ: IMDSv2 = PUT เพื่อขอ token ก่อน -> ใช้ token (header X-aws-ec2-metadata-token) ใน GET ความแตกต่างไม่ใช่ HTTPS หรือ URL แต่เป็น token-based เพื่อกัน SSRF

04AWS CLI Named Profiles

Named Profiles ช่วยให้จัดการหลายชุด credentials/หลายบัญชีบนเครื่องเดียวได้ โดยเก็บใน 2 ไฟล์: ~/.aws/credentials (เก็บ access key) และ ~/.aws/config (เก็บ region/output) แล้วเลือกใช้ผ่าน flag --profile

ini
# ~/.aws/credentials
[default]
aws_access_key_id = AKIA_DEFAULT_XXXX
aws_secret_access_key = wJalrXUtnXXXX

[prod-account]
aws_access_key_id = AKIA_PROD_XXXX
aws_secret_access_key = abc123XXXX

# ~/.aws/config
[default]
region = us-east-1
output = json

# หมายเหตุ: profile ที่ไม่ใช่ default ต้องขึ้นต้นด้วยคำว่า profile
[profile prod-account]
region = ap-southeast-1
output = json
bash
# ใช้ profile เฉพาะ
aws s3 ls --profile prod-account

# ตั้งค่า profile ใหม่แบบ interactive
aws configure --profile prod-account
หมายเหตุ
จุดที่คนพลาด: ในไฟล์ ~/.aws/config สำหรับ profile ที่ไม่ใช่ default ต้องเขียนหัวข้อเป็น [profile name] (มีคำว่า profile นำหน้า) แต่ในไฟล์ ~/.aws/credentials ใช้แค่ [name]

05AWS CLI with MFA

เมื่อ policy บังคับ MFA สำหรับการเรียก API ต้องขอ temporary credentials ที่ผ่าน MFA ก่อน โดยใช้คำสั่ง aws sts get-session-token พร้อมระบุ MFA device และ token code

bash
aws sts get-session-token \
  --serial-number arn:aws:iam::123456789012:mfa/my-user \
  --token-code 123456 \
  --duration-seconds 3600

# ผลลัพธ์ที่ได้ (นำไปตั้งเป็น temporary credentials):
# {
#   "Credentials": {
#     "AccessKeyId": "ASIA...",
#     "SecretAccessKey": "...",
#     "SessionToken": "...",      <-- ต้องใช้ SessionToken ด้วย
#     "Expiration": "2026-06-09T..."
#   }
# }
  • --serial-number = ARN ของ MFA device (หรือ serial number สำหรับ hardware token)
  • --token-code = รหัส 6 หลักจากแอป MFA (เช่น Google Authenticator)
  • ผลลัพธ์มี SessionToken ที่ต้องใส่ด้วยเสมอเมื่อใช้ temporary credentials
  • temporary credentials เริ่มต้นด้วย ASIA (ต่างจาก long-term key ที่ขึ้นต้น AKIA)
เคล็ดลับ
เกร็ดสอบ: temporary credentials จาก STS จะมี SessionToken เสมอ ถ้าลืมตั้ง AWS_SESSION_TOKEN จะเจอ error แม้ access key ถูกต้อง

06Default Credentials Provider Chain

เมื่อ SDK/CLI ต้องการ credentials มันจะค้นหาตาม ลำดับ (chain) ที่กำหนดไว้ และใช้ชุดแรกที่เจอ การเข้าใจลำดับนี้สำคัญมากเพราะเป็นกับดักข้อสอบยอดนิยม

  • 1. Command line options (เช่น --region, --profile) [สำหรับ CLI]
  • 2. Environment variables - AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
  • 3. CLI credentials/config file - ~/.aws/credentials และ ~/.aws/config
  • 4. Container credentials - สำหรับ ECS tasks (task role)
  • 5. EC2 Instance Profile credentials - ผ่าน IMDS (ลำดับสุดท้าย)
ระวัง
กับดักข้อสอบสุดคลาสสิก: ถ้า EC2 instance มี IAM Role attached แต่มี environment variables ตั้ง credentials ของ IAM user ไว้ด้วย -> SDK จะใช้ environment variables ก่อน (ลำดับสูงกว่า) ไม่ใช่ instance role! ถ้า env vars สิทธิ์ไม่พอจะเจอ AccessDenied ทั้งที่ role มีสิทธิ์
เคล็ดลับ
แนวทางที่ปลอดภัยที่สุดบน EC2/ECS/Lambda คือ ใช้ IAM Roles อย่าใส่ access key ใน env vars หรือไฟล์ เพราะ role ให้ temporary credentials ที่ rotate อัตโนมัติและไม่มี secret ค้างในระบบ

07Exponential Backoff, Retries & Service Quotas

เมื่อ API call ล้มเหลวด้วย throttling (เช่น ProvisionedThroughputExceededException, ThrottlingException) หรือ 5xx Server Error ควร retry ด้วย Exponential Backoff คือเพิ่มเวลา wait แบบทวีคูณ ในแต่ละครั้งที่ retry (เช่น 1s, 2s, 4s, 8s...) พร้อมเพิ่ม jitter (ค่า random) เพื่อกระจาย load

ประเภท Errorตัวอย่างควร Retry?
4xx Client Error400 Bad Request, 403 AccessDeniedไม่ retry (แก้ที่ฝั่ง client)
Throttling (มักเป็น 4xx)ThrottlingException, ProvisionedThroughputExceededretry ด้วย exponential backoff
5xx Server Error500, 503 Service Unavailableretry ด้วย exponential backoff
  • SDK ทำ exponential backoff ให้อัตโนมัติ สำหรับ throttling และ 5xx (built-in retry) ปรับ max attempts ได้
  • ถ้าเรียก API โดยตรง (ไม่ผ่าน SDK) ต้อง implement backoff + jitter เอง
  • 4xx client errors ทั่วไปไม่ควร retry เพราะ retry ไปก็ผิดเหมือนเดิม (ยกเว้น throttling)
  • jitter ช่วยกัน thundering herd (client หลายตัว retry พร้อมกัน)
  • ถ้าชน limit จริงต่อเนื่อง -> ขอ Service Limit Increase ผ่าน Service Quotas console/API
ระวัง
กับดักข้อสอบ: อย่าเลือกคำตอบที่ retry ทุก error รวมถึง 4xx หรือ retry ทันทีรัวๆ คำตอบที่ถูกคือ exponential backoff + jitter เฉพาะ throttling/5xx เท่านั้น

08AWS Signature Version 4 (SigV4)

AWS Signature v4 (SigV4) คือกระบวนการ ลงนาม (sign) HTTP request ด้วย AWS credentials ทุกครั้งที่เรียก AWS API จุดประสงค์คือพิสูจน์ ตัวตน (authentication) ของผู้เรียก และยืนยันว่า request ไม่ถูกแก้ไขระหว่างทาง (integrity)

  • ทำไมต้อง sign: เพื่อให้ AWS รู้ว่าใครเป็นคนเรียกและป้องกันการปลอมแปลง request
  • ใช้ AWS CLI หรือ SDK -> SigV4 signing ทำให้อัตโนมัติ (transparent) ไม่ต้อง sign เอง
  • ส่ง signature ได้ 2 ทาง: ผ่าน Authorization HTTP header หรือผ่าน query string (เช่น X-Amz-Signature ใน S3 pre-signed URL)
  • จำเป็นต้อง sign เองเฉพาะกรณีเรียก API ด้วย raw HTTP (เช่น curl, Postman) โดยไม่ผ่าน SDK/CLI
http
# ตัวอย่าง SigV4 ผ่าน Authorization header
Authorization: AWS4-HMAC-SHA256
  Credential=AKIAIOSFODNN7EXAMPLE/20260609/us-east-1/s3/aws4_request,
  SignedHeaders=host;range;x-amz-date,
  Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024

# หรือผ่าน query string (S3 pre-signed URL)
# https://bucket.s3.amazonaws.com/key?X-Amz-Algorithm=AWS4-HMAC-SHA256
#   &X-Amz-Credential=...&X-Amz-Signature=...
เคล็ดลับ
เกร็ดสอบ: ถ้าโจทย์ถามว่าจะเรียก AWS API จาก HTTP client ทั่วไป (ไม่ใช่ SDK) ต้องทำอะไร -> คำตอบคือ sign request ด้วย SigV4 ส่วนเมื่อใช้ SDK/CLI การ sign เป็นอัตโนมัติอยู่แล้ว

คำถามทบทวน

ทดสอบความเข้าใจหัวข้อ AWS Fundamentals: CLI, SDK & IAM

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

ทำแล้ว 0/20คะแนน 0
  1. 1.แอปพลิเคชันรันบน EC2 instance และต้องเรียกใช้ AWS API (เช่น S3) วิธีที่เป็น best practice ที่สุดในการจัดการ credentials คืออะไร?

  2. 2.URL ที่ใช้สำหรับเข้าถึง EC2 Instance Metadata Service (IMDS) คือข้อใด?

  3. 3.ความแตกต่างหลักระหว่าง IMDSv1 และ IMDSv2 คืออะไร?

  4. 4.ลำดับของ Default Credentials Provider Chain ใน AWS SDK for Java เริ่มต้นค้นหา credentials จากที่ใดก่อน?

  5. 5.Developer รันแอปบน EC2 ที่มี IAM Role attached แต่ก็ตั้งค่า environment variables AWS_ACCESS_KEY_ID และ AWS_SECRET_ACCESS_KEY ของ IAM user ที่มีสิทธิ์น้อยไว้ด้วย แอปจะใช้ credentials ชุดใด?

  6. 6.แอปพลิเคชันที่เขียนกับ DynamoDB ได้รับ error 'ProvisionedThroughputExceededException' (throttling) แนวทางที่ถูกต้องที่สุดในการจัดการคืออะไร?

  7. 7.ในการทำ retry กับ AWS API errors ข้อใดถูกต้องเกี่ยวกับ Exponential Backoff?

  8. 8.Developer ต้องการใช้ AWS CLI กับหลายบัญชี/หลาย credentials บนเครื่องเดียว วิธีที่เหมาะสมคือ?

  9. 9.องค์กรบังคับใช้ MFA สำหรับการเรียก API ผ่าน CLI Developer ต้องทำอย่างไรเพื่อรับ temporary credentials ที่ผ่าน MFA?

  10. 10.AWS Signature Version 4 (SigV4) ทำหน้าที่อะไรในการเรียก AWS API?

  11. 11.เมื่อใช้ AWS CLI หรือ SDK การลงนาม SigV4 ถูกดำเนินการอย่างไร?

  12. 12.การส่ง SigV4 signature ไปกับ HTTP request ทำได้ผ่านช่องทางใด?

  13. 13.แอปเรียก API บ่อยมากจนชน Service Quota (เช่น API rate limit) ทำให้เกิด throttling อย่างต่อเนื่อง วิธีแก้ระยะยาวที่ถูกต้องคือ?

  14. 14.ข้อใดอธิบาย AWS SDK ได้ถูกต้องที่สุด?

  15. 15.Developer ต้องการดึง IAM Role credentials ที่ attach กับ EC2 ผ่าน IMDS path ใด?

  16. 16.การเพิ่ม jitter (random delay) ในกลยุทธ์ Exponential Backoff มีประโยชน์อย่างไร?

  17. 17.กรณีใดที่ Developer จำเป็นต้องทำ SigV4 signing เองด้วยมือ (manually)?

  18. 18.ในไฟล์ AWS CLI configuration การตั้งค่า region และ output format โดยทั่วไปอยู่ในไฟล์ใด และ access keys อยู่ในไฟล์ใด?

  19. 19.แอปบน EC2 ใช้ IMDSv2 ต้องทำขั้นตอนใดก่อนจะ GET ดึง metadata?

  20. 20.แอปได้รับ error 'ThrottlingException' จาก AWS service ขณะที่ใช้ AWS SDK แต่ไม่ได้ตั้งค่า retry เพิ่มเติม จะเกิดอะไรขึ้น?