ไม่สามารถนำเข้าโมดูล 'lambda_function': ไม่มีโมดูลชื่อ *
ฉันพยายามเรียกใช้ฟังก์ชัน python lambda ที่ใช้แพ็คเกจเพิ่มเติม อย่างไรก็ตามเมื่อใดก็ตามที่ฉันอัปโหลดไฟล์. zip ไปยังคอนโซลแลมบ์ดาฉันได้รับข้อผิดพลาด:
{
"errorMessage": "Unable to import module 'lambda_function': No module named '*'",
"errorType": "Runtime.ImportModuleError"
}
ฉันทำตามคำแนะนำเหล่านี้: https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies ซึ่งบอกให้ฉันแน่ใจว่าแพ็คเกจของฉันอยู่ในไดเร็กทอรีโลคัลสำหรับฟังก์ชันแลมบ์ดาของฉัน:
~/my-function$ pip install --target ./package Pillow
ฉันไม่ได้ใช้หมอน นี่คือโค้ดตัวอย่างจากไซต์ของพวกเขา ฉันไม่ได้ใช้แพ็คเกจที่คุณสามารถเข้าถึงได้บนแลมด้าอยู่แล้ว เป็นสิ่งที่ฉันได้รับจาก github และจำเป็นต้องแนบไปกับแอพของฉัน
ตอนแรกสิ่งนี้ใช้ไม่ได้ดังนั้นฉันจึงสร้างsetup.cfgไฟล์และเพิ่มใน:
[install]
prefix=
ตอนนี้เมื่อฉันใช้pipคำสั่งเพื่อติดตั้งไปยังเป้าหมายมันใช้งานได้ (และยังเพิ่มโฟลเดอร์อื่น ๆ อีกมากมายนอกเหนือจากแพ็คเกจของฉัน แต่ฉันคิดว่ามันจำเป็นดังนั้นฉันจึงทิ้งมันไว้ที่นั่น
เมื่อฉันเข้าไปในไดเร็กทอรีแพ็กเกจจะอยู่ที่นั่น
จากนั้นฉันก็พบคำตอบนี้: https://stackoverflow.com/a/12493244/5675125 ซึ่งแนะนำว่าอาจไม่มีไฟล์ที่ซ่อนอยู่รวมอยู่ด้วยและนี่คือวิธีที่ฉันควรซิปไฟล์
ข้อผิดพลาดเดียวกันอีกครั้ง
ฉันจะทำให้แลมด้ารับรู้ได้อย่างไรว่าแพ็คเกจของฉันอยู่ที่นั่น
คำตอบ
หากคุณต้องการหมอนวิธีที่ง่ายที่สุดในการใช้งานในฟังก์ชันของคุณคือผ่านพื้นที่เก็บข้อมูลยอดนิยมที่มีเลเยอร์สาธารณะ (รวมถึงหมอน) เช่นkeithrozario / Klayersบน github ที่จะใช้มันคุณจะหา ARN ของชั้นขึ้นอยู่กับภูมิภาคของคุณ รายการ Arns สำหรับหลาม 3.8 เป็นที่นี่
ตัวอย่างเช่นสำหรับus-east-1เลเยอร์ที่เพิ่มสำหรับ Python 3.7 จะเป็น:
อัปเดต
ฉันเพิ่งสร้างเลเยอร์ที่กำหนดเองinstabotและสามารถยืนยันได้ว่าใช้งานได้
เทคนิคที่ใช้รวมถึงเครื่องมือนักเทียบท่าที่อธิบายไว้ในบล็อก AWSล่าสุด:
- ฉันจะสร้างเลเยอร์แลมด้าโดยใช้สภาพแวดล้อมแลมด้าจำลองด้วย Docker ได้อย่างไร
ดังนั้นสำหรับคำถามนี้ฉันตรวจสอบแล้วดังนี้:
mylayerสร้างโฟลเดอร์ที่ว่างเปล่าเช่นไปที่โฟลเดอร์และสร้าง
requirements.txtไฟล์ที่มีเนื้อหาของ
instabot
- รันคำสั่งนักเทียบท่าต่อไปนี้:
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
- ลบ numpy
instabotต้องnumpyซึ่งมีขนาดใหญ่มาก ดังนั้นเราจึงลบมันด้วยตนเองก่อนที่จะสร้างเลเยอร์ เราจะใช้numpyเลเยอร์ที่ AWS ให้มาแทน
sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*
หากเราไม่ลบ numpy เลเยอร์จะมีขนาด> 50MB
- สร้างเลเยอร์เป็น zip:
zip -9 -r mylayer.zip python
สร้างเลเยอร์แลมบ์ดาตาม
mylayer.zipใน AWS Console อย่าลืมที่จะระบุไปCompatible runtimespython3.8เพิ่มสองชั้นในฟังก์ชันของคุณ:
อันแรกAWSLambda-Python38-SciPy1xจัดทำโดย AWS พร้อมกับ numpy ในขณะที่อันที่สองคืออันที่เราสร้างไว้ข้างต้น ดังนั้นฟังก์ชันของคุณจะใช้สองชั้น
- ทดสอบเลเยอร์ในแลมบ์ดาโดยใช้ฟังก์ชันแลมด้าต่อไปนี้:
import json
from instabot import Bot
def lambda_handler(event, context):
# TODO implement
bot = Bot(base_path='/tmp')
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}