การสร้าง Lambda Layer (Python requests) บน AWS
สวัสดีครับ 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
GiBgp2
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
จากเมนูด้านซ้าย
ก่อนอื่นให้เปิดแท็บใหม่และเข้าไปที่หน้าจอ 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)
เมื่อสร้างเสร็จแล้วจะแสดงหน้าจอแบบนี้ เพียงเท่านี้การสร้าง Lambda Layer (Python requests) ก็เสร็จเรียบร้อยครับ
สุดท้ายนี้
เราสามารถนำ python-requests
ที่สร้างนี้ไปใช้งานต่อได้ เช่น การแจ้งเตือนเกี่ยวกับค่าบริการ AWS ใน Slack เป็นต้น
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP จากบริษัท Classmethod (Thailand) ครับ !