เครื่องมือในการรันแอปพลิเคชันเว็บบน AWS Lambda
AWS Lambda Web Adapter ช่วยให้นักพัฒนาสามารถสร้างเว็บแอป (http api) ด้วยเฟรมเวิร์กที่คุ้นเคย (เช่น Express.js, Next.js, Flask, SpringBoot, ASP.NET และ Laravel อะไรก็ได้ที่พูด HTTP 1.1/1.0) และรันบน AWS Lambda . อิมเมจนักเทียบท่าเดียวกันสามารถทำงานบน AWS Lambda, Amazon EC2, AWS Fargate และคอมพิวเตอร์ในเครื่องได้
AWS Lambda Web Adapter ทำงานร่วมกับฟังก์ชัน Lambda ที่ทำแพ็กเกจเป็นทั้งแพ็กเกจ Docker Image และ Zip
หากต้องการใช้ Lambda Web Adapter กับอิมเมจ Docker ให้จัดทำแพ็กเกจเว็บแอปของคุณ (http api) ใน Dockerfile และเพิ่มหนึ่งบรรทัดเพื่อคัดลอกไบนารี Lambda Web Adapter ไปยัง /opt/extensions ภายในคอนเทนเนอร์ของคุณ:
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter
อาจใช้อิมเมจฐานที่ไม่ใช่ AWS ได้เนื่องจาก Runtime Interface Client จัดส่งมาพร้อมกับ Lambda Web Adapter
ตามค่าเริ่มต้น Lambda Web Adapter จะถือว่าเว็บแอปกำลังรับฟังพอร์ต 8080 หากไม่เป็นเช่นนั้น คุณสามารถระบุพอร์ตผ่านการกำหนดค่าได้
ไบนารี Lambda Web Adapter ที่คอมไพล์ไว้ล่วงหน้ามีอยู่ใน repo สาธารณะ ECR: public.ecr.aws/awsguru/aws-lambda-adapter มีรูปภาพหลายส่วนโค้งใน repo นี้ด้วย ใช้งานได้กับสถาปัตยกรรม CPU x86_64 และ arm64
ด้านล่างนี้คือ Dockerfile สำหรับตัวอย่างแอปพลิเคชัน nodejs
FROM public.ecr.aws/docker/library/node:20-slim
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter
ENV PORT=7000
WORKDIR "/var/task"
ADD src/package.json /var/task/package.json
ADD src/package-lock.json /var/task/package-lock.json
RUN npm install --omit=dev
ADD src/ /var/task
CMD [ "node" , "index.js" ]
ซึ่งใช้ได้กับอิมเมจฐานใดๆ ยกเว้นอิมเมจฐานที่มีการจัดการของ AWS หากต้องการใช้อิมเมจฐานที่มีการจัดการของ AWS คุณจะต้องแทนที่ ENTRYPOINT เพื่อเริ่มเว็บแอปของคุณ
AWS Lambda Web Adapter ยังทำงานร่วมกับรันไทม์ Lambda ที่จัดการโดย AWS ได้อีกด้วย คุณต้องทำสามสิ่ง:
แนบเลเยอร์ Lambda Web Adapter เข้ากับฟังก์ชันของคุณ
arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:23
arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:23
arn:aws-cn:lambda:cn-north-1:041581134020:layer:LambdaAdapterLayerX86:23
arn:aws-cn:lambda:cn-northwest-1:069767869989:layer:LambdaAdapterLayerX86:23
กำหนดค่าตัวแปรสภาพแวดล้อม Lambda AWS_LAMBDA_EXEC_WRAPPER
เป็น /opt/bootstrap
ตั้งค่าตัวจัดการฟังก์ชันให้กับสคริปต์เริ่มต้นแอปพลิเคชันเว็บของคุณ เช่น run.sh
สำหรับรายละเอียด โปรดดูตัวอย่างแอปพลิเคชัน Node.js
เมื่อ Lambda Execution Environment ใหม่เริ่มทำงาน Lambda Web Adapter จะบู๊ตเป็น Lambda Extension ตามด้วยเว็บแอปพลิเคชัน
ตามค่าเริ่มต้น Lambda Web Adapter จะส่งคำขอ HTTP GET ไปยังเว็บแอปพลิเคชันที่ http://127.0.0.1:8080/
พอร์ตและเส้นทางสามารถปรับแต่งได้ด้วยตัวแปรสภาพแวดล้อมสองตัว: AWS_LWA_READINESS_CHECK_PORT
และ AWS_LWA_READINESS_CHECK_PATH
Lambda Web Adapter จะลองคำขอนี้อีกครั้งทุกๆ 10 มิลลิวินาทีจนกว่าเว็บแอปพลิเคชันจะส่งคืนการตอบสนอง HTTP ( รหัสสถานะ >= 100 และ < 500 ) หรือฟังก์ชันหมดเวลา
นอกจากนี้ คุณยังสามารถกำหนดค่าอะแดปเตอร์ให้เตรียมการตรวจสอบความพร้อมล่วงหน้าด้วยการเชื่อมต่อ TCP ได้ด้วยการตั้งค่า AWS_LWA_READINESS_CHECK_PROTOCOL
เป็น tcp
หลังจากผ่านการตรวจสอบความพร้อมแล้ว Lambda Web Adapter จะเริ่ม Lambda Runtime และส่งต่อการเรียกใช้ไปยังเว็บแอปพลิเคชัน
พอร์ต/พาธการตรวจสอบความพร้อมและพอร์ตการรับส่งข้อมูลสามารถกำหนดค่าได้โดยใช้ตัวแปรสภาพแวดล้อม ตัวแปรสภาพแวดล้อมเหล่านี้สามารถกำหนดได้ภายในไฟล์นักเทียบท่าหรือเป็นการกำหนดค่าฟังก์ชัน Lambda
ตัวแปรสภาพแวดล้อม | คำอธิบาย | ค่าเริ่มต้น |
---|---|---|
AWS_LWA_PORT / พอร์ต* | พอร์ตการจราจร | "8080" |
AWS_LWA_READINESS_CHECK_PORT / READINESS_CHECK_PORT* | พอร์ตตรวจสอบความพร้อม ค่าเริ่มต้นคือพอร์ตการรับส่งข้อมูล | ท่าเรือ |
AWS_LWA_READINESS_CHECK_PATH / READINESS_CHECK_PATH* | เส้นทางตรวจสอบความพร้อม | - |
AWS_LWA_READINESS_CHECK_PROTOCOL / READINESS_CHECK_PROTOCOL* | โปรโตคอลตรวจสอบความพร้อม: "http" หรือ "tcp" ค่าเริ่มต้นคือ "http" | "http" |
AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS | รหัสสถานะ HTTP ขั้นต่ำที่ถือว่าไม่มีประสิทธิภาพ | "500" |
AWS_LWA_ASYNC_INIT / ASYNC_INIT* | เปิดใช้งานการเริ่มต้นแบบอะซิงโครนัสสำหรับฟังก์ชันการเริ่มต้นที่ยาวนาน | "เท็จ" |
AWS_LWA_REMOVE_BASE_PATH / REMOVE_BASE_PATH* | เส้นทางฐานที่จะลบออกจากเส้นทางคำขอ | ไม่มี |
AWS_LWA_ENABLE_COMPRESSION | เปิดใช้งานการบีบอัด gzip สำหรับเนื้อหาการตอบสนอง | "เท็จ" |
AWS_LWA_INVOKE_MODE | ฟังก์ชัน Lambda เรียกใช้โหมด: "buffered" หรือ "response_stream" ค่าเริ่มต้นคือ "buffered" | "บัฟเฟอร์" |
AWS_LWA_PASS_THROUGH_PATH | เส้นทางสำหรับรับเพย์โหลดเหตุการณ์ที่ส่งผ่านจากทริกเกอร์ที่ไม่ใช่ http | "/เหตุการณ์" |
AWS_LWA_AUTHORIZATION_SOURCE | ชื่อส่วนหัวที่จะแทนที่เป็นการ Authorization | ไม่มี |
หมายเหตุ: เราใช้คำนำหน้า "AWS_LWA_" เพื่อกำหนดเนมสเปซตัวแปรสภาพแวดล้อมทั้งหมดที่ใช้โดย Lambda Web Adapter ต้นฉบับจะได้รับการสนับสนุนจนกว่าเราจะไปถึงเวอร์ชัน 1.0
AWS_LWA_PORT / PORT - Lambda Web Adapter จะส่งการรับส่งข้อมูลไปยังพอร์ตนี้ นี่คือพอร์ตที่เว็บแอปพลิเคชันของคุณกำลังฟังอยู่ ภายในสภาพแวดล้อมการดำเนินการ Lambda เว็บแอปพลิเคชันจะทำงานในฐานะผู้ใช้ที่ไม่ใช่รูท และไม่ได้รับอนุญาตให้ฟังบนพอร์ตที่ต่ำกว่า 1024 โปรดหลีกเลี่ยงพอร์ต 9001 และ 3000 Lambda Runtime API อยู่บนพอร์ต 9001 ส่วนขยาย CloudWatch Lambda Insight ใช้พอร์ต 3000 .
AWS_LWA_ASYNC_INIT / ASYNC_INIT - รันไทม์ที่จัดการโดย Lambda ให้เวลาสูงสุด 10 วินาทีในการเริ่มต้นฟังก์ชัน ในช่วงเวลานี้ ฟังก์ชัน Lambda จะใช้งาน CPU จำนวนมากเพื่อเร่งการเริ่มต้นและไม่มีค่าใช้จ่าย หากฟังก์ชัน lambda ไม่สามารถเริ่มต้นได้สำเร็จภายใน 10 วินาที Lambda จะรีสตาร์ทฟังก์ชัน และเรียกเก็บเงินสำหรับการเริ่มต้น เพื่อช่วยให้ฟังก์ชันต่างๆ ใช้เวลาเริ่มต้นฟรี 10 วินาทีและหลีกเลี่ยงการรีสตาร์ท Lambda Web Adapter รองรับการเริ่มต้นแบบอะซิงโครนัส เมื่อเปิดใช้งานคุณสมบัตินี้ Lambda Web Adapter จะทำการตรวจสอบความพร้อมสูงสุด 9.8 วินาที หากเว็บแอปยังไม่พร้อมใช้งาน Lambda Web Adapter จะส่งสัญญาณไปยังบริการ Lambda ว่าการเริ่มต้นเสร็จสมบูรณ์ และดำเนินการตรวจสอบความพร้อมในตัวจัดการต่อไป คุณลักษณะนี้ถูกปิดใช้งานตามค่าเริ่มต้น เปิดใช้งานโดยตั้งค่าตัวแปรสภาพแวดล้อม AWS_LWA_ASYNC_INIT
เป็น true
AWS_LWA_REMOVE_BASE_PATH / REMOVE_BASE_PATH - ค่าของตัวแปรสภาพแวดล้อมนี้จะบอกอะแดปเตอร์ว่าแอปพลิเคชันทำงานภายใต้เส้นทางพื้นฐานหรือไม่ ตัวอย่างเช่น คุณสามารถกำหนดค่า API Gateway ให้มีทรัพยากร /orders/{proxy+} และ /catalog/{proxy+} ทรัพยากรแต่ละรายการได้รับการจัดการโดยฟังก์ชัน Lambda ที่แยกจากกัน ด้วยเหตุนี้ แอปพลิเคชันภายใน Lambda จึงอาจไม่ทราบว่ามีเส้นทาง /orders อยู่ ใช้ REMOVE_BASE_PATH เพื่อลบคำนำหน้า /orders เมื่อกำหนดเส้นทางคำขอไปยังแอปพลิเคชัน ค่าเริ่มต้นเป็นสตริงว่าง ชำระเงินตัวอย่าง SpringBoot
AWS_LWA_ENABLE_COMPRESSION - Lambda Web Adapter รองรับการบีบอัด gzip สำหรับเนื้อหาการตอบสนอง คุณลักษณะนี้ถูกปิดใช้งานตามค่าเริ่มต้น เปิดใช้งานโดยตั้งค่าตัวแปรสภาพแวดล้อม AWS_LWA_ENABLE_COMPRESSION
เป็น true
เมื่อเปิดใช้งาน จะบีบอัดการตอบสนอง เว้นแต่จะเป็นรูปภาพตามที่กำหนดโดยประเภทเนื้อหาที่ขึ้นต้นด้วย image
หรือการตอบกลับมีขนาดน้อยกว่า 32 ไบต์ นอกจากนี้ยังจะบีบอัดการตอบสนองการสตรีม HTTP/1.1 แบบก้อนด้วย
AWS_LWA_INVOKE_MODE - โหมดเรียกใช้ฟังก์ชัน Lambda ซึ่งควรตรงกับโหมดเรียกใช้ฟังก์ชัน Url ค่าเริ่มต้นคือ "บัฟเฟอร์" เมื่อกำหนดค่าเป็น "response_stream" Lambda Web Adapter จะสตรีมการตอบกลับไปยังบล็อกบริการ Lambda โปรดตรวจสอบ FastAPI พร้อมตัวอย่างการสตรีมการตอบสนอง
AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS - ช่วยให้คุณสามารถปรับแต่งรหัสสถานะ HTTP ใดที่ถือว่ามีประสิทธิภาพดีและรหัสใดที่ไม่มีประสิทธิภาพ
AWS_LWA_PASS_THROUGH_PATH - เส้นทางเพื่อรับเพย์โหลดเหตุการณ์ที่ส่งผ่านจากทริกเกอร์เหตุการณ์ที่ไม่ใช่ http ค่าเริ่มต้นคือ "/events"
AWS_LWA_AUTHORIZATION_SOURCE - เมื่อตั้งค่าแล้ว Lambda Web Adapter จะแทนที่ชื่อส่วนหัวที่ระบุเป็น Authorization
ก่อนที่จะส่งคำขอพร็อกซี สิ่งนี้มีประโยชน์เมื่อคุณใช้ URL ฟังก์ชัน Lambda ที่มีประเภทการรับรองความถูกต้อง IAM ซึ่งสงวนส่วนหัวการอนุญาตสำหรับการตรวจสอบสิทธิ์ IAM แต่คุณยังคงต้องการใช้ส่วนหัวการอนุญาตสำหรับแอปแบ็กเอนด์ของคุณ คุณลักษณะนี้ถูกปิดใช้งานตามค่าเริ่มต้น
บริบทคำขอ คือ API เกตเวย์ข้อมูลเมตาที่ส่งไปยัง Lambda เพื่อขอคำขอ โดยปกติจะประกอบด้วย requestId, requestTime, apiId, ข้อมูลระบุตัวตน และผู้อนุญาต ข้อมูลระบุตัวตนและผู้อนุญาตมีประโยชน์ในการรับข้อมูลระบุตัวตนของลูกค้าเพื่อรับสิทธิ์ คู่มือนักพัฒนา API Gateway มีรายละเอียดเพิ่มเติมที่นี่
Lambda Web Adapter ส่งต่อข้อมูลนี้ไปยังเว็บแอปพลิเคชันในส่วนหัว Http ชื่อ "x-amzn-request-context" ในเว็บแอปพลิเคชัน คุณสามารถดึงค่าของส่วนหัว http นี้และดีซีเรียลไลซ์ลงในออบเจ็กต์ JSON ได้ ลองดู Express.js ใน Zip เกี่ยวกับวิธีการใช้งาน
Lambda Context คือออบเจ็กต์ที่ Lambda ส่งผ่านไปยังตัวจัดการฟังก์ชัน ออบเจ็กต์นี้ให้ข้อมูลเกี่ยวกับการเรียกใช้ ฟังก์ชัน และสภาพแวดล้อมการดำเนินการ คุณสามารถดูรายการคุณสมบัติทั้งหมดที่สามารถเข้าถึงได้ผ่านบริบท Lambda ที่นี่
Lambda Web Adapter ส่งต่อข้อมูลนี้ไปยังเว็บแอปพลิเคชันในส่วนหัว Http ชื่อ "x-amzn-lambda-context" ในเว็บแอปพลิเคชัน คุณสามารถดึงค่าของส่วนหัว http นี้และดีซีเรียลไลซ์ลงในออบเจ็กต์ JSON ได้ ลองดู Express.js ใน Zip เกี่ยวกับวิธีการใช้งาน
สำหรับฟังก์ชันที่ลงทะเบียนส่วนขยาย Lambda นั้น Lambda จะเปิดใช้งานเฟสการปิดระบบสำหรับฟังก์ชันนั้น เมื่อบริการ Lambda กำลังจะปิดสภาพแวดล้อมการดำเนินการ Lambda บริการจะส่งสัญญาณ SIGTERM ไปยังรันไทม์ จากนั้นเหตุการณ์ SHUTDOWN ไปยังส่วนขยายภายนอกที่ลงทะเบียนแต่ละรายการ นักพัฒนาสามารถจับสัญญาณ SIGTERM ในฟังก์ชัน lambda และดำเนินการปิดระบบได้อย่างราบรื่น Express.js ยกตัวอย่างง่ายๆ รายละเอียดเพิ่มเติมใน repo นี้
Lambda Web Adapter ช่วยให้นักพัฒนาสามารถพัฒนาเว็บแอปพลิเคชันภายในเครื่องด้วยเครื่องมือและดีบักเกอร์ที่คุ้นเคย เพียงเรียกใช้เว็บแอปในเครื่องแล้วทดสอบ หากคุณต้องการจำลองสภาพแวดล้อม Lambda Runtime ภายในเครื่อง คุณสามารถใช้ AWS SAM CLI ได้ คำสั่งต่อไปนี้จะเริ่มต้นตำแหน่งข้อมูลเกตเวย์ API ภายในเครื่องและจำลองสภาพแวดล้อมการดำเนินการรันไทม์ Lambda
sam local start-api
โปรดทราบว่า sam local
จะเริ่ม Lambda Runtime Interface Emulator บนพอร์ต 8080 ดังนั้นเว็บแอปพลิเคชันของคุณควรหลีกเลี่ยงพอร์ต 8080
หากคุณวางแผนที่จะใช้ sam local
Lambda Web Adapter ยังรองรับทริกเกอร์เหตุการณ์ที่ไม่ใช่ HTTP ทั้งหมด เช่น SQS, SNS, S3, DynamoDB, Kinesis, Kafka, EventBridge และ Bedrock Agents อะแดปเตอร์จะส่งต่อเพย์โหลดเหตุการณ์ไปยังเว็บแอปพลิเคชันผ่านการโพสต์ http ไปยังเส้นทางที่กำหนดโดยตัวแปรสภาพแวดล้อม AWS_LWA_PASS_THROUGH_PATH
ตามค่าเริ่มต้น เส้นทางนี้จะถูกตั้งค่าเป็น /events
เมื่อได้รับเพย์โหลดเหตุการณ์จากเนื้อหาคำขอ เว็บแอปพลิเคชันควรประมวลผลและส่งกลับผลลัพธ์เป็นการตอบกลับ JSON โปรดชำระเงิน SQS Express.js และ Bedrock Agent FastAPI ในตัวอย่าง Zip
โครงการนี้ได้รับแรงบันดาลใจจากโครงการชุมชนหลายโครงการ
หลายโครงการยังมีความสามารถที่คล้ายคลึงกันกับแพ็คเกจ/กรอบงานเฉพาะภาษา
ดูการมีส่วนร่วมสำหรับข้อมูลเพิ่มเติม
โครงการนี้ได้รับอนุญาตภายใต้ใบอนุญาต Apache-2.0