การอนุญาต: IAM, ตัวอนุญาต Lambda และ Cognito
รักษาความปลอดภัยปลายทาง API ด้วยลายเซ็น IAM SigV4 ตัวอนุญาต Lambda กำหนดเอง หรือตัวอนุญาตจากกลุ่มผู้ใช้ Amazon Cognito
การอนุญาต: IAM, ตัวอนุญาต Lambda และ Cognito เป็นบทเรียน Cloud & IT Cert Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cloud & IT Cert Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cloud & IT Cert Prep มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดการอนุญาต API จึงสำคัญ
หากไม่มีการควบคุมการอนุญาต ไคลเอ็นต์ใด ๆ บนอินเทอร์เน็ตก็สามารถเรียกปลายทาง API Gateway ของคุณและเข้าถึงหรือแก้ไขข้อมูลได้ API Gateway มีกลไกการอนุญาตในตัวสามแบบ: IAM (SigV4), ตัวอนุญาตของฟังก์ชันแลมบ์ดา และ ตัวอนุญาตของกลุ่มผู้ใช้ Amazon Cognito แต่ละกลไกรองรับกรณีใช้งานที่แตกต่างกัน: IAM สำหรับการเรียกใช้ระหว่างบริการ AWS ตัวอนุญาตของฟังก์ชันแลมบ์ดาสำหรับการตรวจสอบสิทธิ์ตามโทเค็นหรือคำขอแบบกำหนดเอง และ Cognito สำหรับการตรวจสอบสิทธิ์ผู้ใช้เว็บหรือมือถือ
การอนุญาต IAM ด้วย SigV4
การอนุญาต IAM กำหนดให้ผู้เรียกลงนามคำขอโดยใช้ AWS Signature Version 4 (SigV4) ผู้เรียกต้องมีข้อมูลประจำตัว AWS (คีย์เข้าถึงและคีย์ลับ หรือข้อมูลประจำตัวชั่วคราวจาก STS) และนโยบาย IAM ต้องอนุญาตให้ดำเนินการ execute-api:Invoke กับ ARN ของ API การอนุญาตรูปแบบนี้เหมาะสำหรับการเรียกใช้ระหว่างเครื่อง (ระหว่างเซิร์ฟเวอร์) ภายใน AWS เช่น ฟังก์ชันแลมบ์ดาเรียก API อื่น EC2 เรียก API ภายใน หรือการเข้าถึงบริการข้ามบัญชี ไคลเอ็นต์เบราว์เซอร์ไม่สามารถใช้ SigV4 ได้โดยง่าย
# IAM policy to allow invoking a specific API endpoint
{
'Version': '2012-10-17',
'Statement': [{
'Effect': 'Allow',
'Action': 'execute-api:Invoke',
'Resource': 'arn:aws:execute-api:us-east-1:123456789012:abc123/prod/GET/orders'
}]
}ตัวอนุญาตของฟังก์ชันแลมบ์ดา: อิงตามโทเค็น
ตัวอนุญาตของฟังก์ชันแลมบ์ดา (เดิมเรียกว่าตัวอนุญาตแบบกำหนดเอง) คือฟังก์ชันแลมบ์ดาที่คุณเขียนขึ้น และ API Gateway จะเรียกใช้ก่อนเรียกการเชื่อมต่อแบ็กเอนด์ สำหรับตัวอนุญาตที่อิงตามโทเค็น API Gateway จะแยกโทเค็น (JWT, OAuth, คีย์ API) จากส่วนหัว Authorization แล้วส่งต่อให้ฟังก์ชันแลมบ์ดาของคุณ ฟังก์ชันแลมบ์ดาจะตรวจสอบโทเค็น (เช่น ตรวจสอบลายเซ็น JWT กับกุญแจสาธารณะ หรือเรียกผู้ให้บริการข้อมูลประจำตัวภายนอก) แล้วส่งเอกสารนโยบาย IAM ที่อนุญาตหรือปฏิเสธคำขอกลับมา
def lambda_handler(event, context):
token = event['authorizationToken']
# Validate token (JWT verification, introspect OAuth, etc.)
if is_valid_token(token):
return {
'principalId': 'user123',
'policyDocument': {
'Version': '2012-10-17',
'Statement': [{'Effect': 'Allow', 'Action': 'execute-api:Invoke',
'Resource': event['methodArn']}]
},
'context': {'userId': 'user123', 'role': 'admin'}
}
raise Exception('Unauthorized')ตัวอนุญาตของฟังก์ชันแลมบ์ดา: อิงตามคำขอ
สำหรับตัวอนุญาตของฟังก์ชันแลมบ์ดาที่อิงตามคำขอ API Gateway จะส่งบริบทคำขอทั้งหมด (ส่วนหัว สตริงคำค้นหา ตัวแปรระยะ และพารามิเตอร์เส้นทาง) ไปยังฟังก์ชันแลมบ์ดาของคุณ ไม่ใช่แค่โทเค็นเท่านั้น วิธีนี้มีประโยชน์สำหรับการอนุญาตที่ขึ้นอยู่กับคุณลักษณะของคำขอหลายรายการ เช่น รายการ IP ที่อนุญาต ชุดส่วนหัว หรือการตรวจสอบการตรวจสอบสิทธิ์หลายปัจจัย ตัวอนุญาตที่อิงตามคำขอรองรับทั้ง REST API และ HTTP API
การแคชของตัวอนุญาตฟังก์ชันแลมบ์ดา
การเรียกตัวอนุญาตของฟังก์ชันแลมบ์ดาในทุกคำขอ API ทำให้เกิดเวลาแฝงและค่าใช้จ่ายเพิ่มขึ้น ให้เปิดใช้การแคชผลลัพธ์ของตัวอนุญาต: แคชนโยบาย IAM ที่ตัวอนุญาตส่งกลับไว้เป็นระยะเวลา TTL ที่กำหนดค่าได้ (0–3600 วินาที) โดยใช้ค่าโทเค็นเป็นกุญแจ คำขอถัดไปที่ใช้โทเค็นเดียวกันจะข้ามการเรียกใช้ฟังก์ชันแลมบ์ดาและใช้นโยบายที่แคชไว้ ตั้งค่า TTL ให้สอดคล้องกับเวลาหมดอายุของโทเค็น หากโทเค็นใช้งานได้ 1 ชั่วโมง ให้แคชผลลัพธ์ของตัวอนุญาตเป็นระยะเวลาเดียวกัน การแคชมีให้ใช้ใน REST API ส่วนตัวอนุญาต JWT ของ HTTP API มีการแคชในตัว
ตัวอนุญาตกลุ่มผู้ใช้ Amazon Cognito
ตัวอนุญาตกลุ่มผู้ใช้ CognitoจะตรวจสอบJWT ที่ Cognito ออกให้โดยตรงใน API Gateway โดยไม่ต้องใช้ฟังก์ชันแลมบ์ดา เมื่อผู้ใช้ตรวจสอบสิทธิ์ผ่าน Cognito (ผ่าน Hosted UI, SDK หรือผู้ให้บริการข้อมูลประจำตัวแบบสหพันธ์) Cognito จะออกโทเค็น ID หรือโทเค็นการเข้าถึง ไคลเอ็นต์จะใส่โทเค็นนี้ไว้ในส่วนหัว Authorization API Gateway จะตรวจสอบลายเซ็นและวันหมดอายุของโทเค็นกับกลุ่มผู้ใช้ Cognito หากถูกต้อง คำขอจะดำเนินการต่อ หากไม่ถูกต้อง API Gateway จะส่ง 401 กลับมา
aws apigateway create-authorizer \
--rest-api-id 'abc123' \
--name 'CognitoAuthorizer' \
--type COGNITO_USER_POOLS \
--provider-arns 'arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-east-1_XXXXXXX' \
--identity-source 'method.request.header.Authorization'ตัวอนุญาต JWT ใน HTTP API
HTTP API รองรับตัวอนุญาต JWTในตัวโดยไม่ต้องใช้ฟังก์ชันแลมบ์ดา คุณระบุ URL ผู้ออก JWT (Cognito, Auth0, Okta) และกลุ่มผู้รับ จากนั้น API Gateway จะตรวจสอบ JWT โดยอัตโนมัติ รูปแบบนี้โดยพื้นฐานแล้วคือตัวอนุญาตกลุ่มผู้ใช้ Cognito แต่ยังทำงานร่วมกับผู้ให้บริการ OIDC ที่เป็นไปตามมาตรฐานรายใดก็ได้ API Gateway จะตรวจสอบโทเค็น (ลายเซ็น วันหมดอายุ และกลุ่มผู้รับ) ภายในระบบเอง จึงมีเวลาแฝงต่ำกว่าตัวอนุญาตของฟังก์ชันแลมบ์ดาและไม่มีค่าใช้จ่ายของฟังก์ชันแลมบ์ดา
aws apigatewayv2 create-authorizer \
--api-id 'abc123' \
--authorizer-type JWT \
--name 'JWTAuthorizer' \
--identity-source '$request.header.Authorization' \
--jwt-configuration '{
"Issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_XXXXXXX",
"Audience": ["your-client-id"]
}'กลุ่มข้อมูลประจำตัว Cognito เทียบกับกลุ่มผู้ใช้
สำหรับการอนุญาต API ให้ใช้กลุ่มผู้ใช้ Cognito: กลุ่มนี้จัดการการตรวจสอบสิทธิ์ผู้ใช้และออก JWT ส่วนกลุ่มข้อมูลประจำตัว Cognito (ข้อมูลประจำตัวแบบสหพันธ์) แตกต่างกัน โดยจะแลกเปลี่ยนโทเค็นจากภายนอก (จากกลุ่มผู้ใช้ การเข้าสู่ระบบผ่านโซเชียล หรือ SAML) เป็นข้อมูลประจำตัว AWS ชั่วคราว (ผ่าน STS AssumeRoleWithWebIdentity) กลุ่มข้อมูลประจำตัวใช้เมื่อแอปต้องเข้าถึงบริการ AWS โดยตรง (S3, DynamoDB) จากไคลเอ็นต์ สำหรับการตรวจสอบสิทธิ์ของ API Gateway ควรใช้ JWT จากกลุ่มผู้ใช้ ส่วนข้อมูลประจำตัวจากกลุ่มข้อมูลประจำตัวใช้สำหรับการเรียก AWS SDK โดยตรงจากเบราว์เซอร์หรือมือถือ
นโยบายทรัพยากรบน API Gateway
REST API รองรับนโยบายทรัพยากร ซึ่งเป็นนโยบาย JSON ที่แนบกับ API เพื่อควบคุมการเข้าถึงตามที่อยู่ IP, จุดเชื่อมต่อ VPC, บัญชีต้นทาง หรือ ARN ใช้นโยบายทรัพยากรเพื่ออนุญาตเฉพาะช่วง IP ที่กำหนดให้เรียก API จำกัดการเข้าถึงเฉพาะคำขอที่ผ่านจุดเชื่อมต่อ VPC ที่กำหนด (API ส่วนตัว) หรืออนุญาตการเรียกใช้ข้ามบัญชี นโยบายทรัพยากรทำงานเพิ่มเติมจากตัวอนุญาตระดับเมธอด โดยทั้งสองส่วนต้องอนุญาตคำขอจึงจะสำเร็จ
# Allow only specific IP range to call the API
{
'Version': '2012-10-17',
'Statement': [{
'Effect': 'Allow',
'Principal': '*',
'Action': 'execute-api:Invoke',
'Resource': 'arn:aws:execute-api:us-east-1:123456789012:abc123/*',
'Condition': {'IpAddress': {'aws:SourceIp': '203.0.113.0/24'}}
}]
}การตรวจสอบสิทธิ์ด้วย TLS สองทาง
TLS สองทาง (mTLS)กำหนดให้ทั้งไคลเอ็นต์และเซิร์ฟเวอร์แสดงใบรับรองระหว่างการจับมือ TLS API Gateway รองรับ mTLS สำหรับ REST API และ HTTP API เมื่อกำหนดค่าชื่อโดเมนแบบกำหนดเองแล้ว ไคลเอ็นต์ต้องแสดงใบรับรองที่ถูกต้องซึ่งลงนามโดยผู้ออกใบรับรอง (CA) ที่คุณอัปโหลดไปยังที่เก็บใบรับรองใน S3 mTLS ใช้ในบริการทางการเงิน การตรวจสอบสิทธิ์อุปกรณ์ IoT และการเชื่อมต่อระหว่างธุรกิจกับธุรกิจที่ต้องการยืนยันตัวตนของไคลเอ็นต์อย่างเข้มงวดกว่าการตรวจสอบสิทธิ์ด้วยโทเค็น
การเลือกประเภทตัวอนุญาตที่เหมาะสม
การเลือกตัวอนุญาตสำหรับการสอบ SAA-C03: IAM (SigV4) → การเรียกใช้ระหว่างบริการ AWS ภายในบัญชีเดียวกันหรือข้ามบัญชี; กลุ่มผู้ใช้ Cognito → ผู้ใช้แอปเว็บหรือมือถือที่ตรวจสอบสิทธิ์ผ่าน Cognito; ตัวอนุญาตของฟังก์ชันแลมบ์ดา → ตรรกะการตรวจสอบสิทธิ์แบบกำหนดเอง (ผู้ให้บริการข้อมูลประจำตัวภายนอก รูปแบบโทเค็นรุ่นเก่า การตรวจสอบ OAuth แบบเจาะจง หรือการรวม IP กับโทเค็น); ตัวอนุญาต JWT (HTTP API) → โทเค็น OIDC/OAuth2 กับผู้ให้บริการที่เป็นไปตามมาตรฐานรายใดก็ได้ โดยมีค่าใช้จ่ายต่ำกว่าตัวอนุญาตของฟังก์ชันแลมบ์ดา หากไม่มีตัวอนุญาต → API สาธารณะ
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจแนวคิด AWS Solutions Architect (SAA-C03) จากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า: การอนุญาตด้วย IAM (SigV4) ใช้สำหรับการเรียกใช้ระหว่างบริการโดยใช้ข้อมูลประจำตัว AWS; ตัวอนุญาตกลุ่มผู้ใช้ Cognitoตรวจสอบ JWT ที่ Cognito ออกให้โดยตรงสำหรับแอปเว็บและมือถือ; และตัวอนุญาตของฟังก์ชันแลมบ์ดาใช้ตรวจสอบโทเค็นแบบกำหนดเองสำหรับผู้ให้บริการข้อมูลประจำตัวภายนอกหรือตรรกะการอนุญาตที่ซับซ้อน พร้อมตัวเลือกแคชผลลัพธ์ บทถัดไป เราจะสำรวจการจำกัดอัตรา การแคช และแผนการใช้งานใน API Gateway
คำถามที่พบบ่อย
บทเรียน “การอนุญาต: IAM, ตัวอนุญาต Lambda และ Cognito” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การอนุญาต: IAM, ตัวอนุญาต Lambda และ Cognito” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cloud & IT Cert Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cloud & IT Cert Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การอนุญาต: IAM, ตัวอนุญาต Lambda และ Cognito”
รักษาความปลอดภัยปลายทาง API ด้วยลายเซ็น IAM SigV4 ตัวอนุญาต Lambda กำหนดเอง หรือตัวอนุญาตจากกลุ่มผู้ใช้ Amazon Cognito คุณปฏิบัติ Cloud & IT Cert Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cloud & IT Cert Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cloud & IT Cert Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การอนุญาต: IAM, ตัวอนุญาต Lambda และ Cognito” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cloud & IT Cert Prep นี้ได้ไหม
ได้ บทเรียน Cloud & IT Cert Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- REST API เทียบกับ HTTP API เทียบกับ WebSocket API
- การผสานรวม: Lambda, HTTP และแบบจำลอง
- การอนุญาต: IAM, ตัวอนุญาต Lambda และ Cognito
- การจำกัดอัตรา การแคช และแผนการใช้งาน