การสร้าง Lambda Layer (Python requests) บน AWS

เราสามารถใช้ Requests library ของ Python สร้าง Lambda Layer (Python requests) ได้ง่ายๆ ในบทความนี้จะมาแนะนำวิธีการเหล่านี้โดยปฏิบัติจริงและมีคำอธิบายขั้นตอนให้ทำตามครับ

สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ

ครั้งนี้ผมจะมาแนะนำวิธีการสร้าง Requests library ของ Python ด้วย Lambda Layer ครับ

ในกรณีที่เราต้องการใช้ library ของ python ใน lambda function เราสามารถทำได้โดยใช้เครื่องมือที่เรียกว่า lambda layer ซึ่ง lambda layer จะช่วยให้เราสามารถใช้ library ต่าง ๆ ที่ต้องการได้
ในบทความนี้ผมจะเรียกใช้ python library ที่ต้องการ ผ่านการใช้งาน lambda layer ดูครับ
นอกจากนี้ หากเราเปลี่ยนเนื้อหาแพคเก็จที่ติดตั้ง ก็จะสามารถใช้ library แบบอื่นที่แตกต่างกันได้ครับ

สร้าง Resource สำหรับใช้สร้าง Requests library ของ Python

เราจำเป็นต้องสร้าง S3 Bucket, IAM Role และ EC2 Instance เพื่อใช้สร้าง Requests library ของ Python โดยทำตามหัวข้อด้านล่างได้เลยครับ

การสร้าง S3 Bucket

ครั้งนี้จะสร้าง S3 Bucket สำหรับจัดเก็บ Layer

ดูตัวอย่างการสร้าง S3 Bucket ได้ที่ลิงก์บทความด้านล่างนี้

* ลิงก์บทความด้านบน[↑]นี้เป็นแค่ตัวอย่าง อาจมีการตั้งค่าบางส่วนที่แตกต่างกัน
แนะนำให้ดูตัวอย่างตั้งค่าการสร้างสำหรับครั้งนี้ตามด้านล่างนี้ประกอบด้วยครับ

ตัวอย่างตั้งค่าการสร้าง S3 Bucket สำหรับครั้งนี้

เข้ามาที่ Service Amazon S3 เลือก Buckets จากเมนูด้านซ้าย คลิก Create bucket

Bucket name: cmth-dev-lambda-layer (ป้อนชื่อตามต้องการ)
AWS Region: Asia Pacific (Singapore) ap-southeast-1

เลื่อนลงมาด้านล่างสุด คลิก Create bucket

การสร้าง IAM Role

ครั้งนี้จะสร้าง IAM Role เพื่อให้ EC2 Instnace มีสิทธิ์เข้าถึง S3 Bucket และใช้งาน SSM ได้

ดูตัวอย่างการสร้าง IAM Role ได้ที่ลิงก์บทความด้านล่างนี้

* ลิงก์บทความด้านบน[↑]นี้เป็นแค่ตัวอย่าง อาจมีการตั้งค่าบางส่วนที่แตกต่างกัน
แนะนำให้ดูตัวอย่างตั้งค่าการสร้างสำหรับครั้งนี้ตามด้านล่างนี้ประกอบด้วยครับ

ตัวอย่างตั้งค่าการสร้าง IAM Role สำหรับครั้งนี้

เข้ามาที่ Service Identity and Access Management (IAM) เลือก Roles จากเมนูด้านซ้าย คลิก Create role

Step 1 - Select trusted entity:
» Trusted entity type: AWS service
» Use case:EC2
» คลิก Next

Step 2 - Add permissions:
Permissions policies
» Policy name: ค้นหาและติ๊ก [✅ AmazonSSMManagedInstanceCore, ✅ AmazonS3FullAccess] (ต้องเพิ่มทีละตัว เพราะไม่สามารถเพิ่มพร้อมกันได้)
» คลิก Next

Step 3 - Name, review, and create:
Role details
» Role Name: ec2-ssm-s3 (ชื่ออะไรก็ได้)
» เลื่อนลงมาด้านล่างสุด ดูที่ "Step 2: Add permissions" ถ้าแสดงแบบนี้ ให้คลิก Create role ที่ด้านล่างขวาสุดได้เลยครับ

การสร้าง EC2 Instance

ครั้งนี้จะสร้าง EC2 Instance สำหรับใช้สร้าง Lambda Layer

ดูตัวอย่างการสร้าง EC2 Instance ได้ที่ลิงก์บทความด้านล่างนี้

* ลิงก์บทความด้านบน[↑]นี้เป็นแค่ตัวอย่าง อาจมีการตั้งค่าบางส่วนที่แตกต่างกัน
แนะนำให้ดูตัวอย่างตั้งค่าการสร้างสำหรับครั้งนี้ตามด้านล่างนี้ประกอบด้วยครับ

ตัวอย่างตั้งค่าการสร้าง EC2 Instance สำหรับครั้งนี้

Region: Singapore

※Launch instances
Name and tags
Name: tinnakorn-ec2-ssm-s3 (ตั้งชื่อที่ต้องการ)

Application and OS Images (Amazon Machine Image)
Amazon Machine Image (AMI): Amazon Linux 2023 AMI

Instance type
Instance type: t3a.micro (เลือกสเปคตามต้องการ)

Key pair (login)
Key pair name - required: Proceed without a key pair (Not recommended) (ครั้งนี้จะไม่ใช้ Key pair)

Network settings
Firewall (security groups)
Security group name - required: tinnakorn-ec2-ssm-s3 (ตั้งชื่อที่ต้องการ)
Description - required: tinnakorn-ec2-ssm-s3 (ป้อนตามต้องการ)
Inbound security groups rules
คลิก Remove (ครั้งนี้จะไม่ตั้งค่า Security group rule)

Configure storage
1x: 8 GiB gp2 Root volume (Default)

คลิก Advanced details เพื่อขยายหน้าจอ แล้วเลือก Role ที่เราสร้างไว้ก่อนหน้านี้
IAM instance profile: ec2-ssm-s3

แล้วเชื่อมต่อ Instance โดยใช้ Session Manager (SSM) เตรียมไว้เพื่อใช้ดำเนินการในขั้นตอนถัดไป

สร้าง Requests library ของ Python

เราจะทำการสร้าง Requests library ของ Python ใน SSM และอัปโหลดไปยัง S3 Bucket เตรียมไว้เพื่อใช้สร้าง Lambda Layer โดยรันคำสั่งตามด้านล่างนี้ครับ

รันคำสั่งเข้าใช้งานสิทธิ์ root

sudo su -


รันคำสั่งตรวจสอบ version ของ python

python3 --version


รันคำสั่งสร้างโฟลเดอร์สำหรับ python

mkdir python/


รันคำสั่งเข้าไปยังโฟลเดอร์ของ python

cd python


รันคำสั่งติดตั้ง Library ของ Python

yum -y install gcc gcc-c++ kernel-devel python-devel libxslt-devel libffi-devel openssl-devel


รันคำสั่งติดตั้งเครื่องมือ "pip" สำหรับการจัดการและติดตั้งแพคเกจ ของ Python

yum -y install python-pip


รันคำสั่งติดตั้งแพคเกจ Python ด้วยเครื่องมือ pip และระบุให้แพคเกจถูกติดตั้งลงในไดเรกทอรีที่ระบุด้วย "-t" และตามด้วย Path เป็น "./" (หมายถึงไดเรกทอรีปัจจุบัน) และแพคเกจที่ต้องการติดตั้งคือ "requests"

pip install -t ./ requests


รันคำสั่งถอยออกมาจากโฟลเดอร์ python

cd ..


รันคำสั่งสร้างไฟล์ zip โดยใช้ชื่อ python-requests.zip (ชื่อไฟล์นี้เป็นแค่ตัวอย่าง)

zip -r python-requests.zip python/


รันคำสั่งอัปโหลดไฟล์ python-requests.zip ขึ้นไปยัง "S3 Bucket: cmth-dev-lambda-layer" ที่สร้างในตอนแรก (S3 Bucket นี้เป็นแค่ตัวอย่าง)

aws s3 cp python-requests.zip s3://cmth-dev-lambda-layer/


แล้วเข้าไปที่ "Amazon S3 > Buckets > cmth-dev-lambda-layer (ตัวอย่าง)"
จะเห็นว่าไฟล์ python-requests.zip แสดงอยู่ที่นี่แล้ว

เมื่อมีไฟล์ python-requests.zip ที่จะใช้สร้าง Lambda Layer อยู่ใน S3 Bucket แล้ว ก็ไม่จำเป็นต้องใช้ EC2 Instance อีกต่อไป ดังนั้นสามารถ Terminate Instance ได้เลยครับ

ดูวิธีการลบ Resource ต่างๆ ใน EC2 ได้ที่ลิงก์ด้านล่างนี้ครับ

สร้าง Lambda Layer

ไปที่ช่องค้นหาด้านบน พิมพ์ Lambda และเลือก Lambda

แล้วเลือก Layers จากเมนูด้านซ้าย

แล้วคลิก Create layer

แล้วจะแสดงหน้าจอแบบนี้

ก่อนอื่นให้เปิดแท็บใหม่และเข้าไปที่หน้าจอ S3 Bucket ของเรา และคลิก Copy S3 URI เพื่อคัดลอก S3 URI เตรียมไว้ใช้ตั้งค่าในขั้นตอนถัดไป

กลับมาที่หน้าจอ Create layer ใน Lambda แล้วจะทำการตั้งค่าดังนี้

Layer configuration
» Name: python-requests

» เลือก ◎ Upload a file from Amazon S3
» แล้ววาง S3 URI ที่คัดลอกมาจากขั้นตอนที่แล้ว

Compatible architectures
» ติ๊ก ✅ x86_64

Compatible runtimes
» Python 3.11 Python 3.10 Python 3.7 Python 3.8 Python 3.9 (เลือกเฉพาะ Python)

* กรณีของ Python library แบบ Binary (Library ที่ต้อง Build) สามารถดำเนินการได้เฉพาะเวอร์ชันของ Python ที่สร้างขึ้นเท่านั้น แต่กรณีของ Library แบบ Binary ให้เลือกเฉพาะ Python 3.9 เท่านั้น

» คลิก Create

เมื่อสร้างเสร็จแล้วจะแสดงหน้าจอแบบนี้ เพียงเท่านี้การสร้าง Lambda Layer (Python requests) ก็เสร็จเรียบร้อยครับ

สุดท้ายนี้

เราสามารถนำ python-requests ที่สร้างนี้ไปใช้งานต่อได้ เช่น การแจ้งเตือนเกี่ยวกับค่าบริการ AWS ใน Slack เป็นต้น

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

POP จากบริษัท Classmethod (Thailand) ครับ !

บทความที่เกี่ยวข้อง