เมื่อสร้างเว็บแอปพลิเคชันมีทางเลือกมากมายที่จะช่วยหรือขัดขวางแอปพลิเคชันของคุณในอนาคตเมื่อคุณยอมรับ ตัวเลือกต่างๆเช่นภาษาเฟรมเวิร์กโฮสติ้งและฐานข้อมูลเป็นสิ่งสำคัญ
ทางเลือกหนึ่งคือการสร้างแอปพลิเคชันที่ใช้บริการโดยใช้สถาปัตยกรรมเชิงบริการ (SOA) หรือแอปพลิเคชันเสาหินแบบดั้งเดิม นี่คือการตัดสินใจทางสถาปัตยกรรมทั่วไปที่มีผลต่อการเริ่มต้นการขยายขนาดและ บริษัท ระดับองค์กร
Service Oriented Architecture ถูกใช้โดย บริษัท ยูนิคอร์นที่มีชื่อเสียงและ บริษัท เทคโนโลยีชั้นนำจำนวนมากเช่น Google, Facebook, Twitter, Instagram และ Uber ดูเหมือนว่ารูปแบบสถาปัตยกรรมนี้ใช้ได้กับ บริษัท ขนาดใหญ่ แต่สามารถใช้ได้กับคุณหรือไม่?
ในบทความนี้เราจะแนะนำหัวข้อสถาปัตยกรรมเชิงบริการและวิธีที่ AWS Lambda ร่วมกับ Python สามารถใช้ประโยชน์เพื่อสร้างบริการที่ปรับขนาดได้และประหยัดต้นทุนได้อย่างง่ายดาย เพื่อแสดงแนวคิดเหล่านี้เราจะสร้างบริการอัปโหลดและปรับขนาดรูปภาพแบบง่ายๆโดยใช้ Python, AWS Lambda, Amazon S3 และเครื่องมือและบริการอื่น ๆ ที่เกี่ยวข้อง
Service Oriented Architecture (SOA) ไม่ใช่เรื่องใหม่โดยมีรากฐานมาจากหลายทศวรรษก่อน ในช่วงไม่กี่ปีที่ผ่านมาความนิยมในรูปแบบได้เพิ่มขึ้นเนื่องจากการนำเสนอประโยชน์มากมายสำหรับแอปพลิเคชันที่หันหน้าไปทางเว็บ
โดยพื้นฐานแล้ว SOA เป็นนามธรรมของแอปพลิเคชั่นขนาดใหญ่หนึ่งตัวในการสื่อสารแอปพลิเคชันขนาดเล็กจำนวนมาก สิ่งนี้เป็นไปตามแนวทางปฏิบัติที่ดีที่สุดหลายประการของวิศวกรรมซอฟต์แวร์เช่นการแยกข้อต่อการแยกข้อกังวลและสถาปัตยกรรมความรับผิดชอบเดียว
การใช้งาน SOA แตกต่างกันไปในแง่ของรายละเอียด: จากบริการเพียงไม่กี่บริการที่ครอบคลุมฟังก์ชันการทำงานขนาดใหญ่ไปจนถึงแอปพลิเคชันขนาดเล็กจำนวนมากหรือหลายร้อยรายการในสิ่งที่เรียกว่า“ ไมโครเซอร์วิส ” สถาปัตยกรรม. โดยไม่คำนึงถึงระดับรายละเอียดสิ่งที่ตกลงกันโดยทั่วไปในหมู่ผู้ปฏิบัติงาน SOA ก็คือไม่ว่าจะเป็นอาหารกลางวันฟรี เช่นเดียวกับแนวทางปฏิบัติที่ดีในวิศวกรรมซอฟต์แวร์เป็นการลงทุนที่ต้องมีการวางแผนพัฒนาและทดสอบเพิ่มเติม
AWS Lambda เป็นบริการที่นำเสนอโดย Amazon Web Services แพลตฟอร์ม AWS Lambda ช่วยให้คุณสามารถอัปโหลดโค้ดที่จะเรียกใช้บนคอนเทนเนอร์แบบออนดีมานด์ที่จัดการโดย Amazon AWS Lambda จะจัดการการจัดเตรียมและการจัดการเซิร์ฟเวอร์เพื่อเรียกใช้โค้ดดังนั้นสิ่งที่จำเป็นสำหรับผู้ใช้คือชุดโค้ดแบบแพ็กเกจที่จะเรียกใช้และตัวเลือกการกำหนดค่าบางอย่างเพื่อกำหนดบริบทที่เซิร์ฟเวอร์ทำงาน แอปพลิเคชันที่มีการจัดการเหล่านี้เรียกว่าฟังก์ชัน Lambda
AWS Lambda มีโหมดการทำงานหลักสองโหมด:
แบบอะซิงโครนัส / ตามเหตุการณ์:
ฟังก์ชัน Lambda สามารถเรียกใช้เพื่อตอบสนองต่อเหตุการณ์ในโหมดอะซิงโครนัส แหล่งที่มาของเหตุการณ์ใด ๆ เช่น S3, SNS ฯลฯ จะไม่บล็อกและฟังก์ชัน Lambda สามารถใช้ประโยชน์จากสิ่งนี้ได้หลายวิธีเช่นการสร้างไปป์ไลน์การประมวลผลสำหรับห่วงโซ่เหตุการณ์บางอย่าง มีแหล่งข้อมูลมากมายและขึ้นอยู่กับเหตุการณ์ต้นทางจะถูกพุชไปยังฟังก์ชัน Lambda จากแหล่งเหตุการณ์หรือสำรวจเหตุการณ์โดย AWS Lambda
Synchronous / Request-> การตอบกลับ:
สำหรับแอปพลิเคชันที่ต้องการการตอบกลับเพื่อส่งคืนแบบซิงโครนัส Lambda สามารถทำงานในโหมดซิงโครนัสได้ โดยทั่วไปจะใช้ร่วมกับบริการที่เรียกว่า API Gateway เพื่อส่งคืนการตอบสนอง HTTP จาก AWS Lambda ไปยังผู้ใช้ปลายทางอย่างไรก็ตามฟังก์ชัน Lambda ยังสามารถเรียกแบบซิงโครนัสผ่านการโทรโดยตรงไปยัง AWS Lambda
ฟังก์ชัน AWS Lambda จะอัปโหลดเป็นไฟล์ zip ที่มีรหัสตัวจัดการนอกเหนือจากการอ้างอิงใด ๆ ที่จำเป็นสำหรับการทำงานของตัวจัดการ เมื่ออัปโหลดแล้ว AWS Lambda จะเรียกใช้โค้ดนี้เมื่อจำเป็นและปรับขนาดจำนวนเซิร์ฟเวอร์จากศูนย์ถึงหลักพันเมื่อจำเป็นโดยไม่ต้องมีการแทรกแซงเพิ่มเติมจากผู้บริโภค
Basic SOA เป็นวิธีการจัดโครงสร้างฐานรหัสของคุณให้เป็นแอปพลิเคชันขนาดเล็กเพื่อให้เกิดประโยชน์กับแอปพลิเคชันตามวิธีที่อธิบายไว้ก่อนหน้าในบทความนี้ ด้วยเหตุนี้วิธีการสื่อสารระหว่างแอปพลิเคชันเหล่านี้จึงเป็นจุดสำคัญ SOA ที่ขับเคลื่อนด้วยเหตุการณ์ (aka SOA 2.0) ช่วยให้ไม่เพียง แต่การสื่อสารแบบบริการต่อบริการโดยตรงแบบดั้งเดิมของ SOA 1.0 เท่านั้น แต่ยังรวมถึงเหตุการณ์ที่จะเผยแพร่ไปทั่วทั้งสถาปัตยกรรมเพื่อสื่อสารการเปลี่ยนแปลง
สถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์เป็นรูปแบบที่ส่งเสริมการมีเพศสัมพันธ์ที่หลวมและความสามารถในการประกอบ ด้วยการสร้างและตอบสนองต่อเหตุการณ์ต่างๆสามารถเพิ่มบริการเฉพาะกิจเพื่อเพิ่มฟังก์ชันการทำงานใหม่ให้กับเหตุการณ์ที่มีอยู่และสามารถประกอบเหตุการณ์ต่างๆเพื่อให้มีฟังก์ชันการทำงานที่สมบูรณ์ยิ่งขึ้น
AWS Lambda สามารถใช้เป็นแพลตฟอร์มเพื่อสร้างแอปพลิเคชัน SOA 2.0 ได้อย่างง่ายดาย มีหลายวิธีในการเรียกใช้ฟังก์ชัน Lambda ตั้งแต่วิธีคิวข้อความแบบเดิมด้วย Amazon SNS ไปจนถึงเหตุการณ์ที่สร้างโดยไฟล์ที่อัปโหลดไปยัง Amazon S3 หรืออีเมลที่ส่งด้วย Amazon SES
เราจะสร้างแอปพลิเคชั่นง่ายๆในการอัปโหลดและดึงภาพโดยใช้ AWS stack โปรเจ็กต์ตัวอย่างนี้จะมีฟังก์ชันแลมบ์ดาสองฟังก์ชัน: อันหนึ่งทำงานในโหมดการร้องขอ -> ตอบสนองที่จะใช้เพื่อให้บริการส่วนหน้าเว็บอย่างง่ายของเราและอีกอันที่จะตรวจจับรูปภาพที่อัปโหลดและปรับขนาด
ฟังก์ชันแลมบ์ดาแรกจะทำงานแบบอะซิงโครนัสเพื่อตอบสนองต่อเหตุการณ์การอัปโหลดไฟล์ที่ทริกเกอร์บนที่เก็บข้อมูล S3 ซึ่งจะเป็นที่เก็บรูปภาพที่อัปโหลด จะใช้ภาพที่ให้มาและปรับขนาดให้พอดีกับภาพ 400x400
ฟังก์ชันแลมด้าอื่น ๆ จะให้บริการหน้า HTML โดยมีทั้งฟังก์ชันสำหรับผู้ใช้ในการดูรูปภาพที่ปรับขนาดโดยฟังก์ชันแลมด้าอื่น ๆ ของเรารวมถึงอินเทอร์เฟซสำหรับการอัปโหลดรูปภาพ
ก่อนที่เราจะเริ่มได้เราจะต้องกำหนดค่าบริการ AWS ที่จำเป็นบางอย่างเช่น IAM และ S3 สิ่งเหล่านี้จะได้รับการกำหนดค่าโดยใช้คอนโซล AWS บนเว็บ อย่างไรก็ตามการกำหนดค่าส่วนใหญ่สามารถทำได้โดยใช้ยูทิลิตี้บรรทัดคำสั่ง AWS ซึ่งเราจะใช้ในภายหลัง
S3 (หรือ Simple Storage Service) เป็นบริการที่เก็บออบเจ็กต์ของ Amazon ที่ให้การจัดเก็บข้อมูลที่เชื่อถือได้และประหยัดค่าใช้จ่าย เราจะใช้ S3 ในการจัดเก็บภาพที่จะอัปโหลดรวมถึงภาพที่ได้รับการปรับขนาดแล้ว
คุณสามารถดูบริการ S3 ได้ในรายการแบบเลื่อนลง“ บริการ” ในคอนโซล AWS ภายใต้ส่วนย่อย“ การจัดเก็บและการจัดส่งเนื้อหา” เมื่อสร้างที่เก็บข้อมูลคุณจะได้รับแจ้งให้ป้อนทั้งชื่อที่เก็บข้อมูลและเพื่อเลือกภูมิภาค การเลือกภูมิภาคที่ใกล้เคียงกับผู้ใช้ของคุณจะช่วยให้ S3 สามารถเพิ่มประสิทธิภาพสำหรับเวลาในการตอบสนองและค่าใช้จ่ายตลอดจนปัจจัยด้านกฎระเบียบบางประการ สำหรับตัวอย่างนี้เราจะเลือกภูมิภาค“ US Standard” ในภายหลังภูมิภาคเดียวกันนี้จะถูกใช้เพื่อโฮสต์ฟังก์ชัน AWS Lambda
เป็นที่น่าสังเกตว่าชื่อที่เก็บข้อมูล S3 จะต้องไม่ซ้ำกันดังนั้นหากใช้ชื่อที่เลือกคุณจะต้องเลือกชื่อใหม่ที่ไม่ซ้ำใคร
สำหรับโครงการตัวอย่างนี้เราจะสร้างที่เก็บข้อมูล 2 ชุดชื่อ 'test-upload' และ 'test-resized' ที่เก็บข้อมูล 'ทดสอบอัปโหลด' จะใช้สำหรับอัปโหลดภาพและจัดเก็บภาพที่อัปโหลดก่อนที่จะประมวลผลและปรับขนาด เมื่อปรับขนาดแล้วรูปภาพจะถูกบันทึกลงในที่เก็บข้อมูล 'ทดสอบปรับขนาด' และรูปภาพดิบที่อัปโหลดจะถูกลบออก
ตามค่าเริ่มต้นสิทธิ์ S3 มีข้อ จำกัด และจะไม่อนุญาตให้ผู้ใช้ภายนอกหรือแม้แต่ผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบอ่านเขียนอัปเดตหรือลบสิทธิ์หรือวัตถุใด ๆ บนที่เก็บข้อมูล ในการเปลี่ยนแปลงสิ่งนี้เราจะต้องลงชื่อเข้าใช้ในฐานะผู้ใช้ที่มีสิทธิ์ในการจัดการสิทธิ์ที่เก็บข้อมูล AWS
สมมติว่าเราอยู่บนคอนโซล AWS เราสามารถดูสิทธิ์สำหรับที่เก็บข้อมูลการอัปโหลดของเราได้โดยเลือกที่เก็บข้อมูลตามชื่อคลิกที่ปุ่ม 'คุณสมบัติ' ที่ด้านบนขวาของหน้าจอและเปิดส่วน 'สิทธิ์' ที่ยุบ
ในการอนุญาตให้ผู้ใช้ที่ไม่ระบุชื่ออัปโหลดไปยังที่เก็บข้อมูลนี้เราจะต้องแก้ไขนโยบายที่เก็บข้อมูลเพื่อให้อนุญาตเฉพาะที่อนุญาตให้อัปโหลดได้ สิ่งนี้ทำได้โดยใช้นโยบายการกำหนดค่าตาม JSON นโยบาย JSON ประเภทนี้ใช้กันอย่างแพร่หลายทั่วทั้ง AWS ร่วมกับบริการ IAM เมื่อคลิกที่ปุ่ม 'แก้ไขนโยบายที่เก็บข้อมูล' เพียงแค่วางข้อความต่อไปนี้แล้วคลิก 'บันทึก' เพื่ออนุญาตการอัปโหลดภาพสาธารณะ:
{ 'Version': '2008-10-17', 'Id': 'Policy1346097257207', 'Statement': [ { 'Sid': 'Allow anonymous upload to /', 'Effect': 'Allow', 'Principal': { 'AWS': '*' }, 'Action': 's3:PutObject', 'Resource': 'arn:aws:s3:::test-upload/*' } ] }
หลังจากดำเนินการดังกล่าวเราสามารถตรวจสอบได้ว่านโยบายที่เก็บข้อมูลนั้นถูกต้องโดยพยายามอัปโหลดรูปภาพไปยังที่เก็บข้อมูล คำสั่ง cURL ต่อไปนี้จะทำเคล็ดลับ:
curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F ' [email protected] '
หากมีการตอบกลับ 200 ช่วงเราจะทราบว่าได้ใช้การกำหนดค่าสำหรับที่เก็บข้อมูลการอัปโหลดสำเร็จแล้ว ตอนนี้บัคเก็ต S3 ของเราควรได้รับการกำหนดค่า (ส่วนใหญ่) เราจะกลับไปใช้บริการนี้ในคอนโซลในภายหลังเพื่อเชื่อมต่อเหตุการณ์การอัปโหลดรูปภาพของเรากับการเรียกใช้ฟังก์ชันปรับขนาดของเรา
บทบาทของแลมบ์ดาทั้งหมดทำงานภายในบริบทสิทธิ์ในกรณีนี้คือ 'บทบาท' ที่กำหนดโดยบริการ IAM บทบาทนี้กำหนดสิทธิ์ใด ๆ และทั้งหมดที่ฟังก์ชัน Lambda มีในระหว่างการเรียกใช้ สำหรับวัตถุประสงค์ของโครงการตัวอย่างนี้เราจะสร้างบทบาททั่วไปที่จะใช้ระหว่างฟังก์ชัน Lambda ทั้งสอง อย่างไรก็ตามในสถานการณ์จำลองการใช้งานจริงรายละเอียดปลีกย่อยในนิยามสิทธิ์ขอแนะนำเพื่อให้แน่ใจว่าการใช้ประโยชน์จากการรักษาความปลอดภัยถูกแยกเฉพาะบริบทสิทธิ์ที่กำหนดไว้
สามารถพบบริการ IAM ได้ในส่วนย่อย“ ความปลอดภัยและข้อมูลประจำตัว” ของเมนูแบบเลื่อนลง“ บริการ” บริการ IAM เป็นเครื่องมือที่มีประสิทธิภาพมากในการจัดการการเข้าถึงบริการต่างๆของ AWS และอินเทอร์เฟซที่ให้มาอาจดูเกินจริงเล็กน้อยในตอนแรกหากคุณไม่คุ้นเคยกับเครื่องมือที่คล้ายกัน
เมื่ออยู่ในหน้าแดชบอร์ด IAM คุณจะพบส่วนย่อย“ บทบาท” ทางด้านซ้ายมือของหน้า จากที่นี่เราสามารถใช้ปุ่ม“ สร้างบทบาทใหม่” เพื่อเปิดตัวช่วยสร้างหลายขั้นตอนเพื่อกำหนดสิทธิ์ของบทบาท มาใช้“ lambda_role” เป็นชื่อของการอนุญาตทั่วไปของเรา หลังจากดำเนินการต่อจากหน้าการกำหนดชื่อคุณจะเห็นตัวเลือกในการเลือกประเภทบทบาท เนื่องจากเราต้องการการเข้าถึง S3 เท่านั้นให้คลิกที่“ AWS Service Roles” และภายในช่องการเลือกให้เลือก“ AWS Lambda” คุณจะเห็นหน้านโยบายที่แนบมากับบทบาทนี้ได้ เลือกนโยบาย“ AmazonS3FullAccess” และเข้าสู่ขั้นตอนถัดไปเพื่อยืนยันบทบาทที่จะสร้าง
วิธีสร้างแบบจำลองมอนติคาร์โล
สิ่งสำคัญคือต้องจดชื่อและ ARN (ชื่อทรัพยากร Amazon) ของบทบาทที่สร้างขึ้น สิ่งนี้จะถูกใช้เมื่อสร้างฟังก์ชัน Lambda ใหม่เพื่อระบุบทบาทที่จะใช้สำหรับการเรียกใช้ฟังก์ชัน
บันทึก: AWS Lambda จะบันทึกเอาต์พุตทั้งหมดโดยอัตโนมัติจากการเรียกใช้ฟังก์ชันใน AWS Cloudwatch ซึ่งเป็นบริการบันทึก หากต้องการฟังก์ชันนี้ซึ่งแนะนำสำหรับสภาพแวดล้อมการใช้งานจริงจะต้องเพิ่มสิทธิ์ในการเขียนไปยังสตรีมบันทึก Cloudwatch ในนโยบายสำหรับบทบาทนี้
ตอนนี้เราพร้อมที่จะเริ่มเขียนโค้ดแล้ว เราจะถือว่า ณ จุดนี้คุณได้ตั้งค่าคำสั่ง“ awscli” หากยังไม่มีคุณสามารถทำตามคำแนะนำได้ที่ https://aws.amazon.com/cli/ เพื่อตั้งค่า awscli บนคอมพิวเตอร์ของคุณ
บันทึก: โค้ดที่ใช้ในตัวอย่างเหล่านี้ถูกทำให้สั้นลงเพื่อความสะดวกในการดูหน้าจอ สำหรับเวอร์ชันที่สมบูรณ์ยิ่งขึ้นโปรดไปที่ที่เก็บที่ https://github.com/gxx/aws-lambda-python/ .
ก่อนอื่นมาสร้างโครงสร้างโครงกระดูกสำหรับโครงการของเรา
aws-lambda-python/ - image_list/ - handler.py - list.html - Makefile - requirements.txt - image_resize/ - handler.py - resize.py - Makefile - requirements.txt - .pydistutils.cfg
เรามีไดเรกทอรีย่อยสองรายการในโครงสร้างของเราหนึ่งรายการสำหรับแต่ละฟังก์ชันแลมบ์ดาของเรา ในแต่ละไฟล์เรามีไฟล์ handler.py, Makefile และ requirements.txt ทั่วไป ไฟล์ handler.py จะมีเมธอดในการเรียกใช้การเรียกใช้ฟังก์ชันแลมบ์ดาแต่ละฟังก์ชันและถือได้ว่าเป็นจุดเริ่มต้นสำหรับฟังก์ชัน ไฟล์ Requirement.txt จะมีรายการการอ้างอิงของเราดังนั้นเราจึงสามารถระบุและอัปเดตข้อกำหนดได้อย่างง่ายดาย สุดท้ายคำสั่ง Makefile ที่เราจะใช้เพื่อจัดเตรียมกลไกที่ง่ายสำหรับการโต้ตอบกับ awscli สิ่งนี้จะทำให้กระบวนการสร้างและอัปเดตฟังก์ชันแลมบ์ดาของเราง่ายขึ้นมาก
คุณจะสังเกตเห็นไฟล์. pydistutils.cfg ในรูทของไดเรกทอรีโครงการของเรา ไฟล์นี้จำเป็นหากคุณกำลังทำงานกับ Python ภายใต้ Homebrew เนื่องจากวิธีการปรับใช้ฟังก์ชัน Lambda (ครอบคลุมในส่วนต่อไปนี้) จึงจำเป็นต้องใช้ไฟล์นี้ ดูที่เก็บสำหรับรายละเอียดเพิ่มเติม
เริ่มต้นด้วยฟังก์ชั่น resize_image เราจะหยุดการพึ่งพา Wand ไลบรารีการประมวลผลภาพของเราโดยบันทึก Wand==0.4.2
ไปยัง requirements.txt นี่จะเป็นการอ้างอิงเพียงอย่างเดียวสำหรับฟังก์ชัน image_resize lambda ของเรา ฟังก์ชัน resize_image ใน resize.py จะต้องจัดการทรัพยากรรูปภาพจากไลบรารี Wand และปรับขนาดตามพารามิเตอร์ความกว้างและความสูงที่ระบุ เพื่อรักษาภาพที่กำลังปรับขนาดเราจะใช้อัลกอริทึมการปรับขนาด 'พอดีที่สุด' ซึ่งจะรักษาอัตราส่วนภาพของภาพต้นฉบับในขณะที่ลดขนาดภาพให้พอดีกับความกว้างและความสูงที่ระบุ
def resize_image(image, resize_width, resize_height): ... original_ratio = image.width / float(image.height) resize_ratio = resize_width / float(resize_height) # We stick to the original ratio here, regardless of what the resize ratio is if original_ratio > resize_ratio: # If width is larger, we base the resize height as a function of the ratio of the width resize_height = int(round(resize_width / original_ratio)) else: # Otherwise, we base the width as a function of the ratio of the height resize_width = int(round(resize_height * original_ratio)) if ((image.width - resize_width) + (image.height - resize_height)) <0: filter_name = 'mitchell' else: filter_name = 'lanczos2' image.resize(width=resize_width, height=resize_height, filter=filter_name, blur=1) return image
ด้วยวิธีนี้ฟังก์ชันตัวจัดการจะต้องยอมรับเหตุการณ์ที่สร้างโดยภาพที่อัปโหลด S3 ส่งต่อไปที่ resize_image
ฟังก์ชั่นและบันทึกภาพที่ได้รับการปรับขนาด
from __future__ import print_function import boto3 from wand.image import Image from resize import resize_image def handle_resize(event, context): # Obtain the bucket name and key for the event bucket_name = event['Records'][0]['s3']['bucket']['name'] key_path = event['Records'][0]['s3']['object']['key'] response = boto3.resource('s3').Object(bucket_name, key_path).get() # Retrieve the S3 Object # Perform the resize operation with Image(blob=response['Body'].read()) as image: resized_data = resize_image(image, 400, 400).make_blob() # And finally, upload to the resize bucket the new image s3_connection.Object('test-resized', key_path).put(ACL='public-read', Body=resized_data) # Finally remove, as the bucket is public and we don't want just anyone dumping the list of our files! s3_object.delete()
เมื่อรหัสเสร็จสมบูรณ์จะต้องอัปโหลดไปยัง Amazon Lambda เป็นฟังก์ชัน Lambda ใหม่ นี่คือจุดที่ Makefile ที่ถูกเพิ่มเข้าไปในโครงสร้างไดเร็กทอรีเข้ามามีบทบาท Makefile นี้จะใช้เพื่อปรับใช้นิยามฟังก์ชัน Lambda ที่เรากำลังสร้าง
ROLE_ARN = arn:aws:iam::601885388019:role/lambda_role FUNCTION_NAME = ResizeImage REGION = us-west-1 TIMEOUT = 15 MEMORY_SIZE = 512 ZIPFILE_NAME = image_resize.zip HANDLER = handler.handle_resize clean_pyc : find . | grep .pyc$ | xargs rm install_deps : pip install -r requirements.txt -t . build : install_deps clean_pyc zip $(ZIPFILE_NAME) -r * create : build aws lambda create-function --region $(REGION) --function-name $(FUNCTION_NAME) --zip-file fileb://$(ZIPFILE_NAME) --role $(ROLE_ARN) --handler $(HANDLER) --runtime python2.7 --timeout $(TIMEOUT) --memory-size $(MEMORY_SIZE) update : build aws lambda update-function-code --region $(REGION) --function-name $(FUNCTION_NAME) --zip-file fileb://$(ZIPFILE_NAME) --publish
ฟังก์ชันหลักของ Makefile นี้คือ 'สร้าง' และ 'อัปเดต' ฟังก์ชันเหล่านี้จะรวมไดเร็กทอรีปัจจุบันไว้ก่อนซึ่งแสดงถึงโค้ดทั้งหมดที่จำเป็นในการรันฟังก์ชัน Lambda ถัดไปการอ้างอิงใด ๆ ที่ระบุใน requirements.txt
ไฟล์จะถูกติดตั้งลงในไดเร็กทอรีย่อยปัจจุบันที่จะแพ็กเกจ ขั้นตอนการบรรจุหีบห่อจะบีบอัดเนื้อหาของไดเร็กทอรีเพื่ออัปโหลดในภายหลังด้วยคำสั่ง“ awscli” Makefile ของเราสามารถดัดแปลงเพื่อใช้ในนิยามฟังก์ชัน Lambda อื่น ๆ ได้
ในยูทิลิตี้ Makefile เรากำหนดตัวแปรสองสามตัวที่จำเป็นสำหรับการสร้าง / อัปเดตภาพของเรา กำหนดค่าสิ่งเหล่านี้ตามความจำเป็นเพื่อให้คำสั่ง Makefile ทำงานได้อย่างถูกต้องสำหรับคุณ
ROLE_ARN
: นี่คือชื่อทรัพยากรของ Amazon ที่ระบุบทบาทของเราในการเรียกใช้ฟังก์ชัน LambdaFUNCTION_NAME
: ชื่อของฟังก์ชัน Lambda ที่เรากำลังสร้าง / อัปเดตREGION
: ภูมิภาคที่จะสร้าง / อัปเดตฟังก์ชัน LambdaTIMEOUT
: หมดเวลาเป็นวินาทีก่อนที่การเรียกใช้ Lambda จะถูกฆ่าMEMORY_SIZE
: ขนาดของหน่วยความจำเป็นเมกะไบต์ที่ฟังก์ชัน Lambda จะเข้าถึงได้เมื่อเรียกใช้ZIPFILE_NAME
: ชื่อของแพ็กเกจซิปที่มีโค้ดฟังก์ชันแลมบ์ดาและการอ้างอิงHANDLER
: พา ธ การนำเข้าแบบสัมบูรณ์ในรูปแบบจุดของฟังก์ชันตัวจัดการเมื่อกำหนดค่าแล้วให้เรียกใช้ make create
คำสั่งจะสร้างสิ่งที่คล้ายกับผลลัพธ์ต่อไปนี้:
$ make create pip install -r requirements.txt -t . ... find . | grep .pyc| xargs rm zip image_resize.zip -r * ... aws lambda create-function --region ap-northeast-1 --function-name ResizeImage2 --zip-file fileb://image_resize.zip --role arn:aws:iam::11111111111:role/lambda_role --handler handler.handle_resize --runtime python2.7 --timeout 15 --memory-size 512 { 'CodeSha256': 'doB1hsujmZnxZHidnLKP3XG2ifHM3jteLEBvsK1G2nasKSo=', 'FunctionName': 'ResizeImage', 'CodeSize': 155578, 'MemorySize': 512, 'FunctionArn': 'arn:aws:lambda:us-west-1:11111111111:function:ResizeImage', 'Version': '$LATEST', 'Role': 'arn:aws:iam::11111111111:role/lambda_role', 'Timeout': 15, 'LastModified': '2016-01-10T11:11:11.000+0000', 'Handler': 'handler.handle_resize', 'Runtime': 'python2.7', 'Description': '' }
หลังจากดำเนินการคำสั่งการสร้างแล้วฟังก์ชันการปรับขนาดสำหรับรูปภาพของเราจะพร้อมใช้งานอย่างไรก็ตามไม่ได้เชื่อมต่อกับที่เก็บข้อมูล S3 เพื่อรับเหตุการณ์ เรายังคงสามารถทดสอบฟังก์ชันผ่าน AWS Console เพื่อยืนยันว่าฟังก์ชันนี้จัดการเหตุการณ์การอัปโหลดไฟล์ S3 ได้อย่างเหมาะสม บนแดชบอร์ด AWS Lambda ซึ่งอยู่ในส่วนย่อย 'Compute' ของเมนูแบบเลื่อนลง 'Services' ให้เลือกชื่อของฟังก์ชันที่เราสร้างขึ้น หน้ารายละเอียดฟังก์ชัน Lambda นี้มีรายการแบบเลื่อนลงที่มีข้อความ 'การดำเนินการ' ซึ่งมีตัวเลือกที่ชื่อ 'กำหนดค่าเหตุการณ์ทดสอบ'
การคลิกที่นี่จะเป็นการเปิดโมดอลให้คุณระบุเหตุการณ์ทดสอบและเทมเพลตตัวอย่างบางส่วน เลือกตัวอย่าง“ S3 Put” และแทนที่การกล่าวถึงชื่อที่เก็บข้อมูลด้วยชื่อของที่เก็บข้อมูลที่ตั้งค่าไว้ เมื่อกำหนดค่าแล้วการใช้ปุ่ม 'ทดสอบ' ในหน้าของฟังก์ชัน Lambda ในภายหลังจะเรียกใช้ฟังก์ชัน Lambda ราวกับว่าเหตุการณ์ที่กำหนดค่าไว้ก่อนหน้านี้เกิดขึ้นจริงๆ
ในการตรวจสอบการติดตามสแต็กข้อผิดพลาดหรือข้อความบันทึกคุณสามารถดูสตรีมบันทึกใน Cloudwatch กลุ่มบันทึกใหม่จะถูกสร้างขึ้นในเวลาเดียวกันกับที่สร้างฟังก์ชัน Lambda สตรีมบันทึกเหล่านี้มีประโยชน์และสามารถส่งไปยังบริการอื่น ๆ
กลับไปที่แผงควบคุม S3 ขยายส่วน 'เหตุการณ์' ที่ยุบซึ่งอยู่ในเมนู 'คุณสมบัติ' เพื่อแสดงแบบฟอร์ม 'การแจ้งเตือนเหตุการณ์' ช่องที่บังคับให้เรากรอก ได้แก่ อินพุต 'เหตุการณ์' และ 'ส่งไปที่' จาก“ เหตุการณ์” ให้เลือกเหตุการณ์“ สร้างวัตถุ (ทั้งหมด)” ซึ่งจะช่วยให้สามารถสกัดกั้นเหตุการณ์ทั้งหมดที่สร้างออบเจ็กต์ในที่เก็บข้อมูลการอัปโหลด สำหรับอินพุต“ ส่งถึง” ให้เลือกปุ่มตัวเลือก“ ฟังก์ชันแลมด้า” ส่วนใหม่จะปรากฏขึ้นพร้อมกับเมนูแบบเลื่อนลงที่มีฟังก์ชันแลมด้า“ ResizeImage” ที่เราได้กำหนดค่าไว้เป็นตัวเลือก เมื่อคลิก 'บันทึก' เหตุการณ์ที่ 'สร้างวัตถุ' จะถูกกำหนดเส้นทางเป็นอินพุตไปยังการเรียกใช้ฟังก์ชันแลมด้า 'ResizeImage'
ขณะนี้เรามีฟังก์ชันหลักของแอปพลิเคชัน มาทำการทดสอบ cURL อีกครั้งเพื่อให้แน่ใจว่าทุกอย่างทำงานตามที่คาดไว้ ใช้ cURL เพื่ออัปโหลดรูปภาพไปยังที่เก็บข้อมูล S3 และตรวจสอบด้วยตนเองว่าอัปโหลดรูปภาพลงในที่เก็บข้อมูลการปรับขนาดแล้ว
curl https://test-upload.s3.amazonaws.com -F 'key=test.jpeg' -F ' [email protected] '
เมื่อดำเนินการคำสั่งนี้ควรสร้างอิมเมจที่ปรับขนาดไว้ในที่เก็บข้อมูล 'test-resized' หลังจาก 50-1000ms ขึ้นอยู่กับว่าฟังก์ชัน Lambda 'อุ่นเครื่อง' แล้วหรือไม่
ฟังก์ชัน ListImage Lambda จะดึงรายการของรูปภาพที่ปรับขนาดและแสดงบนหน้า HTML สำหรับผู้ใช้ หน้า HTML นี้ยังมีฟังก์ชันสำหรับผู้ใช้ในการอัปโหลดภาพของตนเอง Jinja2 ใช้ในฟังก์ชันเพื่อแสดงผล HTML จากนิยามเทมเพลต เช่นเดียวกับก่อนหน้านี้ข้อกำหนดเหล่านี้ระบุไว้ใน requirements.txt
ไฟล์.
from __future__ import print_function import os import boto3 from jinja2 import Environment from jinja2 import FileSystemLoader def _render_template(image_urls): env = Environment(loader=FileSystemLoader(os.path.abspath(os.path.dirname(__file__)))) template = env.get_template('list.html') rendered_template = template.render(image_urls=image_urls) return rendered_template def handle_list_image(event, context): bucket = boto3.resource('s3').Bucket('test-resized') image_summaries = sorted((image_summary for image_summary in bucket.objects.all()), key=lambda o: o.last_modified) image_urls = [] for summary in image_summaries: image_urls.append( boto3.client('s3').generate_presigned_url( 'get_object', Params={ 'Bucket': summary.bucket_name, 'Key': summary.key } ) ) return {'htmlContent': _render_template(image_urls)}
List Images var uploadImage = (function () { var inProgress = false; return function () { if (inProgress) { return; } inProgress = true; var formData = new FormData(); var fileData = $('#image-file').prop('files')[0]; formData.append('key', parseInt(Math.random() * 1000000)); formData.append('acl', 'public-read'); formData.append('file', fileData); $.ajax({ url: 'https://test-upload.s3.amazonaws.com/', type: 'POST', data: formData, processData: false, contentType: false, success: function (data) { window.location.reload(); } }); } })(); .image__container { float: left; width: 30%; margin-left: 2.5%; margin-right: 2.5%; max-width: 400px; } {% for image_url in image_urls %} {% endfor %}
อีกครั้งเราสามารถแก้ไข Makefile ก่อนหน้านี้และใช้คำสั่ง create เพื่อปรับใช้ฟังก์ชัน lambda ของเรา
ฟังก์ชัน ImageList Lambda เสร็จสมบูรณ์แล้วอย่างไรก็ตามไม่สามารถให้บริการแก่ผู้ใช้รายใดได้ เนื่องจากสามารถเรียกใช้ฟังก์ชัน Lambda เพื่อตอบสนองต่อเหตุการณ์จากบริการอื่นหรือโดยใช้โปรแกรมเท่านั้น นี่คือที่มาของบริการ Amazon AWS API Gateway API Gateway สามารถพบได้ในส่วนย่อย“ Application Services”
API Gateway เป็นวิธีการสร้างแบบจำลองจุดสิ้นสุดเป็นชุดของทรัพยากรและวิธีการโดยพื้นฐานแล้วเป็นอินเทอร์เฟซ REST นอกเหนือจากการจัดหาสิ่งอำนวยความสะดวกสำหรับการตรวจสอบความถูกต้องและการเปลี่ยนแปลงคำขอแล้ว API Gateway ยังทำหน้าที่อื่น ๆ เช่นการจัดเตรียมคำขอการควบคุมปริมาณ / การ จำกัด อัตรา
จากแดชบอร์ด API Gateway สร้าง API ใหม่สำหรับให้บริการฟังก์ชัน ListImage สามารถตั้งชื่อและคำอธิบายตามความต้องการของคุณได้ เมื่อสร้างแล้วให้คลิกที่ชื่อ API ใหม่เพื่อเข้าถึงรายละเอียด API สร้างทรัพยากรใหม่สำหรับรูท URL“ /” URL นี้จะใช้เพื่อแสดงหน้า HTML
ในขณะที่ดูรายละเอียดสำหรับหน้าทรัพยากรรากให้เพิ่มเมธอด GET ตั้งค่า“ Integration Type” เป็น“ Lambda Function” ตั้งค่า“ Lambda Region” เป็น“ us-west-1” หรือภูมิภาคที่คุณเลือกแล้วพิมพ์ชื่อของฟังก์ชัน ListImage Lambda
ก่อนที่เราจะเริ่มแมปการตอบสนองของเรากับเอาต์พุต HTML เราจำเป็นต้องกำหนด 'โมเดล' ที่จะกำหนดสคีมาสำหรับการตอบสนองจากเซิร์ฟเวอร์นอกเหนือจากการแมปการตอบสนองนี้กับประเภทเนื้อหา เลือกส่วน 'โมเดล' สำหรับ API และคลิกที่ 'สร้าง' เพื่อสร้างโมเดลใหม่ ตั้งชื่อโมเดลว่า“ HTML” โดยมีประเภทเนื้อหาเป็น“ text / html” และกำหนดสคีมาดังนี้:
{ '$schema': 'http://json-schema.org/draft-04/schema#', 'title' : 'HTML', 'type' : 'object' }
กลับไปที่แดชบอร์ด API เลือกทรัพยากรที่เราสร้างขึ้นและไปที่ส่วน“ การตอบสนองการรวม” ส่วนนี้กำหนดการแปลงใด ๆ ในการประมวลผลหลังจากได้รับการตอบสนองจากฟังก์ชัน Lambda ก่อนที่จะส่งคำตอบไปยังขั้นตอนสุดท้าย
เปิดส่วน 'เทมเพลตการจับคู่' และเพิ่ม 'ประเภทเนื้อหา' ใหม่ของ 'text / html' ลบ 'ประเภทเนื้อหา' เก่าพร้อมกัน ทางด้านขวาเปลี่ยนเมนูแบบเลื่อนลงจาก“ Output Passthrough” เป็น“ เทมเพลตการแมป” ซึ่งจะช่วยให้เราสามารถแก้ไข JSON ดิบที่ API Gateway ยอมรับและใช้เนื้อหา HTML ภายในคุณสมบัติ 'htmlContent' ของข้อมูลที่ส่งคืนแทน สำหรับเทมเพลตการแมประบุ“ $ input.htmlContent” เป็นเทมเพลต สุดท้ายแก้ไขส่วน“ การตอบสนองต่อวิธี” โดยลบ“ application / json” ออกจาก“ Response Models for 200” และเพิ่ม“ text / html” แทน
กลับไปที่แดชบอร์ดสำหรับ API มีปุ่มที่ด้านซ้ายบนของหน้าที่มีข้อความ 'Deploy API' คลิกที่ปุ่มนี้เพื่ออัปเดตหรือสร้าง API ด้วยทรัพยากรวิธีการแบบจำลองและการแมปที่ระบุ เมื่อเสร็จแล้ว URL จะแสดงสำหรับขั้นตอนการปรับใช้ที่เลือกไว้ (การจัดเตรียมตามค่าเริ่มต้น) ในที่สุดตัวอย่างก็เสร็จสมบูรณ์! คุณสามารถอัปโหลดไฟล์สองสามไฟล์เพื่อทดสอบและดูภาพที่ปรับขนาดได้
AWS เป็นบริการขนาดใหญ่และจะไม่หายไปในเร็ว ๆ นี้ แม้ว่าการล็อกผู้ขายจะเป็นสิ่งที่ต้องระวังอยู่เสมอ แต่ AWS Lambda ก็มีบริการที่ค่อนข้างเบาบางพร้อมชุดตัวเลือกการกำหนดค่าเสริมมากมาย การใช้ประโยชน์จากบริการที่ AWS จัดหาให้เพื่อใช้งานแอปพลิเคชันที่ปรับขนาดได้และบำรุงรักษาได้ง่ายจะให้ประโยชน์สูงสุดในการใช้แพลตฟอร์ม AWS AWS Lambda นำเสนอโซลูชันที่หรูหราปรับขนาดได้และคุ้มค่าซึ่งสนับสนุนโดยแพลตฟอร์มระดับองค์กรที่ผู้บริโภคจำนวนมากใช้ ฉันเชื่อว่าแอปพลิเคชัน 'ไร้เซิร์ฟเวอร์' คือหนทางแห่งอนาคต แจ้งให้เราทราบว่าคุณคิดอย่างไรในความคิดเห็นด้านล่าง