ไม่สามารถนำเข้าโมดูล 'lambda_function': ไม่มีโมดูลชื่อ *

Oct 12 2020

ฉันพยายามเรียกใช้ฟังก์ชัน 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 ซึ่งแนะนำว่าอาจไม่มีไฟล์ที่ซ่อนอยู่รวมอยู่ด้วยและนี่คือวิธีที่ฉันควรซิปไฟล์

ข้อผิดพลาดเดียวกันอีกครั้ง

ฉันจะทำให้แลมด้ารับรู้ได้อย่างไรว่าแพ็คเกจของฉันอยู่ที่นั่น

คำตอบ

1 Marcin Oct 12 2020 at 10:28

หากคุณต้องการหมอนวิธีที่ง่ายที่สุดในการใช้งานในฟังก์ชันของคุณคือผ่านพื้นที่เก็บข้อมูลยอดนิยมที่มีเลเยอร์สาธารณะ (รวมถึงหมอน) เช่นkeithrozario / Klayersบน github ที่จะใช้มันคุณจะหา ARN ของชั้นขึ้นอยู่กับภูมิภาคของคุณ รายการ Arns สำหรับหลาม 3.8 เป็นที่นี่

ตัวอย่างเช่นสำหรับus-east-1เลเยอร์ที่เพิ่มสำหรับ Python 3.7 จะเป็น:

อัปเดต

ฉันเพิ่งสร้างเลเยอร์ที่กำหนดเองinstabotและสามารถยืนยันได้ว่าใช้งานได้

เทคนิคที่ใช้รวมถึงเครื่องมือนักเทียบท่าที่อธิบายไว้ในบล็อก AWSล่าสุด:

  • ฉันจะสร้างเลเยอร์แลมด้าโดยใช้สภาพแวดล้อมแลมด้าจำลองด้วย Docker ได้อย่างไร

ดังนั้นสำหรับคำถามนี้ฉันตรวจสอบแล้วดังนี้:

  1. mylayerสร้างโฟลเดอร์ที่ว่างเปล่าเช่น

  2. ไปที่โฟลเดอร์และสร้างrequirements.txtไฟล์ที่มีเนื้อหาของ

instabot
  1. รันคำสั่งนักเทียบท่าต่อไปนี้:
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"
  1. ลบ numpy

instabotต้องnumpyซึ่งมีขนาดใหญ่มาก ดังนั้นเราจึงลบมันด้วยตนเองก่อนที่จะสร้างเลเยอร์ เราจะใช้numpyเลเยอร์ที่ AWS ให้มาแทน

sudo rm -rvf ./python/lib/python3.8/site-packages/numpy*

หากเราไม่ลบ numpy เลเยอร์จะมีขนาด> 50MB

  1. สร้างเลเยอร์เป็น zip:
zip -9 -r mylayer.zip python 
  1. สร้างเลเยอร์แลมบ์ดาตามmylayer.zipใน AWS Console อย่าลืมที่จะระบุไปCompatible runtimespython3.8

  2. เพิ่มสองชั้นในฟังก์ชันของคุณ:

อันแรกAWSLambda-Python38-SciPy1xจัดทำโดย AWS พร้อมกับ numpy ในขณะที่อันที่สองคืออันที่เราสร้างไว้ข้างต้น ดังนั้นฟังก์ชันของคุณจะใช้สองชั้น

  1. ทดสอบเลเยอร์ในแลมบ์ดาโดยใช้ฟังก์ชันแลมด้าต่อไปนี้:
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!')
    }