วิธีการสร้าง NodeJS App Serverless

ฉันหวังว่าคุณจะรัก Serverless มากเท่ากับที่ฉันทำเพราะนี่เป็นอีกโพสต์ในหัวข้อนั้น

ตอนนี้ถ้าเรากำลังพูดถึง REST API แบบไม่มีเซิร์ฟเวอร์แบบง่ายการตั้งค่าของคุณค่อนข้างชัดเจนใน AWS: เกตเวย์ Lambda + API

แต่บริการอื่น ๆ (ไมโคร) ที่แบ็กเอนด์ของคุณอาจมี คุณรู้ไหมว่าไม่ใช่ความคิดที่ดีที่สุดที่จะใส่รหัสแอปพลิเคชันทั้งหมดของคุณไว้ในฟังก์ชัน AWS Lambda เสาหินก้อนเดียว

ความท้าทาย

เราต้องการปรับใช้โมดูลแอปพลิเคชันเป็นไมโครซอฟท์ที่ไม่มีเซิร์ฟเวอร์ได้ง่ายซึ่งจำเป็นต้องสื่อสารกัน การสื่อสารระหว่างบริการควรถูกควบคุมโดย ACL บางประเภทโดยเฉพาะ

ความพยายาม 1. เกตเวย์ API

นี่เป็นความคิดแรกที่ฉันมีเมื่อฉันพยายามที่จะแก้ปัญหา: เพียงแค่แสดงไมโครไซต์ทั้งหมดผ่าน API เกตเวย์ ปัญหาคือ ... API ที่สร้างขึ้นเป็นแบบสาธารณะ

เหตุใดจึงเป็นปัญหา ตัวอย่างเช่นเราไม่ต้องการให้บริการการเรียกเก็บเงินถูกเปิดเผยไปทั่วโลกแม้ว่าการเข้าถึงจะถูก จำกัด โดยใช้การอนุญาตบางประเภท

คุณสามารถทำให้ API เป็นส่วนตัวได้ แต่นโยบายความปลอดภัยค่อนข้าง จำกัด :

คุณสามารถใช้นโยบายทรัพยากร API Gateway เพื่อให้ API ของคุณถูกเรียกใช้อย่างปลอดภัยโดย:
* ผู้ใช้จากบัญชี AWS ที่ระบุ
* ช่วงที่อยู่ IP ต้นทางหรือบล็อก CIDR ที่ระบุ
* ระบุคลาวด์ส่วนตัวเสมือน (VPCs) หรือจุดสิ้นสุด VPC (ในบัญชีใด ๆ )

ทำให้ค่อนข้างลำบากในการควบคุมการสื่อสารระหว่างบริการดังกล่าว วิธีเดียวในการทำที่นี่คือการใส่บริการลงใน VPC แยกจากกันทำงานมากเกินไป

ความพยายามที่ 2 แลมบ์ดา

ทำไมเราไม่ใส่ microservice ทุกอันไว้ใน AWS Lambda แยกต่างหาก สิ่งนี้จะช่วยแก้ปัญหาหรือไม่

ใช่ในความเป็นจริงมันจะเป็น microservice แบบไม่มีเซิร์ฟเวอร์และคุณจะสามารถใช้นโยบาย IAM เพื่อปรับการเข้าถึงระหว่างบริการต่างๆ แต่…มันไม่ได้“ ง่าย”

ฉันรู้ว่านี่เป็นเรื่องปกติทุกวันนี้ที่จะมีฟังก์ชั่นเล็ก ๆ เป็นหน่วยการปรับใช้ของคุณ และในกรณีที่บริการของคุณมีมากกว่า 1 จุดปลาย / วิธี / ฟังก์ชั่นมันถือว่าโอเคที่จะปรับใช้เป็นแลมบ์ดาหลายตัว

ฉันเข้าใจถึงข้อดีของมัน แต่คุณเสียสละความสะดวกในการบำรุงรักษาและการพัฒนา นอกจากนี้ฉันไม่ชอบความคิดในการใช้บริการเป็นชุดของฟังก์ชั่นแลมบ์ดา ลองนึกภาพฟังก์ชั่นแยกกันหลายอย่างที่เกี่ยวข้องกับการเรียกเก็บเงิน? ไม่ใช่บริบทที่ล้อมรอบอีกต่อไป แม้ว่าจะมีหลายกรณีที่ความละเอียดอาจมีประโยชน์ แต่เป็นกรณีที่หายาก

ความพยายาม 3. Fat Lambda

เราสามารถปรับใช้จุดปลายชุดเป็นแลมบ์ดาเดียว (โดยไม่ใช้ API เกตเวย์ได้หรือไม่)

หากเราสามารถทำสิ่งนี้ได้เราจะได้รับประโยชน์ทั้งหมดจากตัวเลือกก่อนหน้า แต่เราจะสามารถเลือกหน่วยการใช้งานของเราได้อย่างละเอียด

วิธีที่ฉันต้องการคือสิ่งต่อไปนี้: แต่ละบริการที่สามารถนำไปใช้งานได้ควรเป็นวัตถุ JS เก่าแบบธรรมดาที่มีวิธีการ นี่เป็นเรื่องเล็กน้อยที่จะประสบความสำเร็จโดยการเพิ่มโค้ดกาวสองสามบรรทัดระหว่างวัตถุของคุณกับ AWS Lambda

นี่คือการดำเนินการของฉันมัน: aws-rpc โมดูล nodejs นี้จะเปิดเผยฟังก์ชั่น lambdaHandler ที่คุณเพิ่งผ่านวัตถุและมันเปิดเผยโดยอัตโนมัติกับทุกคนที่สามารถเข้าถึงแลมบ์ดา:

นำเข้า {lambdaHandler} จาก 'aws-rpc';
นำเข้า {TestServiceImpl} จาก './TestServiceImpl';
// นี่คือหน่วยการปรับใช้ของคุณ
// นี่คือสิ่งที่คุณระบุว่าเป็นฟังก์ชันตัวจัดการของแลมบ์ดา
ตัวจัดการ const ส่งออก = lambdaHandler (ใหม่ TestServiceImpl ());

ตอนนี้คุณสามารถปรับใช้ "ตัวจัดการ" เป็น AWS Lambda นี่คือวิธีที่คุณเรียกใช้วิธีการ:

นำเข้า {TestService} จาก './TestService';
const client = รอ createClient  ("LambdaName", "test");
console.log (รอ client.test ());

โปรดทราบว่าเพื่อที่จะสามารถสร้างวิธีการสำหรับวัตถุต้นขั้วลูกค้าคุณจะต้องส่งชื่อวิธีการทั้งหมดไปยัง createClient ตามที่เราทำในตัวอย่าง

สิ่งนี้จำเป็นเนื่องจาก JS ไม่มีข้อมูลรันไทม์ใด ๆ เกี่ยวกับอินเทอร์เฟซของ TypeScript ฉันสามารถนำไปใช้งานได้โดยใช้คลาสนามธรรม แต่ฉันไม่ชอบ like \ _ (ツ) _ / ¯

โบนัส! คุณสามารถเรียกใช้มันทั้งหมดในเครื่อง!

ฉันเชื่อว่ามันสำคัญมากที่จะต้องมีสภาพแวดล้อมการพัฒนาในท้องถิ่นของคุณที่สะดวกสบายที่สุดเท่าที่จะเป็นไปได้ นี่คือเหตุผลที่ฉันได้เพิ่มความสามารถในการเรียกใช้บริการและลูกค้าในพื้นที่โดยไม่ต้องปรับใช้อะไรกับ AWS (ดูฟังก์ชั่น runService และ createClient) ตัวอย่างเช่นดูที่เก็บใน GitHub

สรุป

นี่เป็นเรื่องง่ายที่จะหลงทางในบริการที่ผู้ให้บริการคลาวด์นำเสนอและปรับโครงสร้างพื้นฐานของคุณ

ฉันมักจะเลือกวิธีที่ง่ายและชัดเจนที่สุดที่ฉันนึกได้ นอกจากนี้โปรดจำไว้เสมอว่าเทคนิคและวิธีปฏิบัติหลายอย่างสามารถนำกลับมาใช้ใหม่ได้จากแพลตฟอร์มอื่น ๆ (ความคิดเรื่องไขมัน NodeJS แลมบ์ดาได้รับแรงบันดาลใจจากขวดไขมันที่เรียกว่าจากโลก Java)

หากคุณชอบหัวข้อนี้ลองดูสิ่งเหล่านี้ด้วย:

  • คุณต้องเรียนรู้วิธีสร้างสถาปัตยกรรมไร้เซิร์ฟเวอร์ที่ดีที่สุด
  • วิธีสร้างท่อ CI / CD ฟรีที่ไม่มี Server: 3 ตัวอย่างง่าย ๆ
  • วิธีการจำลอง DynamoDB ข้ามภูมิภาคได้อย่างง่ายดาย
  • วิธีการสมัคร Multiregional (และชำระเป็นศูนย์)
  • ใช้ Java Web App Serverless

ความคิดเห็นความชอบและการแชร์ได้รับการชื่นชมอย่างมาก ไชโย!