Nit*_*nil 70 python amazon-web-services aws-lambda
我正在创建一个AWS Lambda python部署包.我正在使用一个外部依赖请求.我使用AWS文档http://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html安装了外部依赖项.下面是我的python代码.
import requests
print('Loading function')
s3 = boto3.client('s3')
def lambda_handler(event, context):
#print("Received event: " + json.dumps(event, indent=2))
# Get the object from the event and show its content type
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
try:
response = s3.get_object(Bucket=bucket, Key=key)
s3.download_file(bucket,key, '/tmp/data.txt')
lines = [line.rstrip('\n') for line in open('/tmp/data.txt')]
for line in lines:
col=line.split(',')
print(col[5],col[6])
print("CONTENT TYPE: " + response['ContentType'])
return response['ContentType']
except Exception as e:
print(e)
print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
raise e
Run Code Online (Sandbox Code Playgroud)
创建了zip项目-dir目录的内容并上传到lambda(Zip目录内容,而不是目录).当我执行该函数时,我得到下面提到的错误.
START RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Version: $LATEST
**Unable to import module 'lambda_function': No module named lambda_function**
END RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058
REPORT RequestId: 9e64e2c7-d0c3-11e5-b34e-75c7fb49d058 Duration: 19.63 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 9 MB
Run Code Online (Sandbox Code Playgroud)
请帮我调试错误.
Nit*_*nil 90
错误是由于lambda函数的文件名.在创建lambda函数时,它将要求Lambda函数处理程序.您必须将其命名为Python_File_Name.Method_Name.在这种情况下,我将其命名为lambda.lambda_handler(lambda.py是文件名).
小智 21
此问题的另一个来源是压缩文件的权限.它必须至少在全世界范围内可读.(分钟chmod 444)
在压缩它之前我在python文件上运行了以下内容并且它工作正常.
chmod u=rwx,go=r
Run Code Online (Sandbox Code Playgroud)
ope*_*onk 15
这是一个快速的步骤。
假设您有一个名为 的文件夹deploy,其中包含您的 lambda 文件lambda_function.py。让我们假设这个文件看起来像这样。(p1并p2代表第三方包。)
import p1
import p2
def lambda_handler(event, context):
# more code here
return {
"status": 200,
"body" : "Hello from Lambda!",
}
Run Code Online (Sandbox Code Playgroud)
对于每个第三方依赖项,您需要pip install <third-party-package> --target .从deploy文件夹内。
pip install p1 --target .
pip install p2 --target .
Run Code Online (Sandbox Code Playgroud)
完成此操作后,您的结构应如下所示。
deploy/
??? lambda_function.py
??? p1/
? ??? __init__.py
? ??? a.py
? ??? b.py
? ??? c.py
??? p2/
??? __init__.py
??? x.py
??? y.py
??? z.py
Run Code Online (Sandbox Code Playgroud)
最后,您需要zip将deploy文件夹内的所有内容压缩成一个文件。在 Mac 或 Linux 上,该命令看起来像zip -r ../deploy.zip *来自deploy文件夹内。请注意,该-r标志用于递归子文件夹。
文件 zip 文件的结构应反映原始文件夹。
deploy.zip/
??? lambda_function.py
??? p1/
? ??? __init__.py
? ??? a.py
? ??? b.py
? ??? c.py
??? p2/
??? __init__.py
??? x.py
??? y.py
??? z.py
Run Code Online (Sandbox Code Playgroud)
上传 zip 文件并指定<file_name>.<function_name>Lambda 以进入您的流程,lambda_function.lambda_handler例如上面的示例。
use*_*554 12
我发现Nithin的回答很有帮助.这是一个具体的演练:
查找这些值:
使用这些值,您需要将处理程序(如屏幕截图所示)重命名为"cool.lambda_handler".这是摆脱"无法导入模块'lambda_function'"errorMessage的一种方法.如果你要将python脚本中的处理程序重命名为"sup",那么你需要将lambda仪表板中的处理程序重命名为"cool.sup"
只是有这么多的陷阱创建AWS LAMBDA(对于Python)部署软件包时.我花了几个小时来调试会话,直到找到一个很少失败的公式.
我创建了一个脚本,可以自动完成整个过程,因此不易出错.我还编写了教程,解释了一切是如何工作的.您可能想要查看它:
在lambda_handler格式必须是lambda_filename.lambda_functionName. 假设您要运行该lambda_handler函数并且它在 . 中lambda_fuction.py,那么您的处理程序格式为lambda_function.lambda_handler.
出现此错误的另一个原因是模块依赖性。
您lambda_fuction.py必须位于 zip 文件的根目录中。
小智 7
转到 Lambda 函数,然后选择层,然后滚动到运行时设置并单击编辑。
您还可以使用 YAML 文件中的特定处理程序配置 SAM。下面的例子。
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
getRecommendation:
Type: 'AWS::Serverless::Function'
Properties:
Handler: pythonfilename.lambda_handler
Runtime: python3.7
CodeUri: .
Description: ''
MemorySize: 128
Timeout: 3
Role: 'arn:aws:iam::xxxxx:role/lambdaroleIam'
Run Code Online (Sandbox Code Playgroud)
小智 5
我也有错误。原来我的zip文件包含代码父文件夹。当我unzip检查zip文件时,该lambda_function文件位于父文件夹下./lambda。
使用zip命令,修复错误:
zip -r ../lambda.zip ./*
Run Code Online (Sandbox Code Playgroud)
我通过容器而不是 zip 文件构建 lambda。
在我的例子中解决这个问题的方法是将项目复制到“${LAMBDA_TASK_ROOT}”文件夹中,而不仅仅是我选择的自定义文件夹中。
FROM public.ecr.aws/lambda/python:3.8
WORKDIR ${LAMBDA_TASK_ROOT}
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD ["lambda_function.lambda_handler"]
Run Code Online (Sandbox Code Playgroud)
尽管我之前设置了 WORKDIR,甚至尝试在 Lambda 中使用“WORKDIR override”设置,但它仅在我使用“${LAMBDA_TASK_ROOT}”文件夹时才有效。