使用 Docker 容器镜像本地测试 AWS Lambda。

12

我一直在努力让这个东西正常工作。 我正在尝试在运行在 Docker 容器上的 Lambda 本地调用,但是遇到了以下问题。

Docker 文件

FROM public.ecr.aws/lambda/python:3.8


COPY myfunction.py ./

CMD ["myfunction.lambda_handler"]

Python 文件 myfunction.py

import json
import sys

def lambda_handler(event, context):
    print("Hello AWS!")
    print("event = {}".format(event))
    return {
        'statusCode': 200,
    }

步骤1:

docker build --tag custom .

输出

C:\Users\s.shah\IdeaProjects\YoutubeVideos\Learn>docker build --tag custom .
[+] Building 0.5s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                                                                                                            0.0s
 => => transferring dockerfile: 31B                                                                                                                                                                                                                                                                                                                             0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                                                                                                               0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                                                                                                                 0.0s
 => [internal] load metadata for public.ecr.aws/lambda/python:3.8                                                                                                                                                                                                                                                                                               0.5s
 => [internal] load build context                                                                                                                                                                                                                                                                                                                               0.0s
 => => transferring context: 35B                                                                                                                                                                                                                                                                                                                                0.0s
 => [1/2] FROM public.ecr.aws/lambda/python:3.8@sha256:d5a4b8f3f7394358bfe2cb51677f3d14af59c08adf831332cb4501f56dfd64cc                                                                                                                                                                                                                                         0.0s
 => CACHED [2/2] COPY myfunction.py ./                                                                                                                                                                                                                                                                                                                          0.0s
 => exporting to image                                                                                                                                                                                                                                                                                                                                          0.0s
 => => exporting layers                                                                                                                                                                                                                                                                                                                                         0.0s
 => => writing image sha256:6a339ad8416cd93632ae4418e89409dae2e8a684de7990746b613b223a974899                                                                                                                                                                                                                                                                    0.0s
 => => naming to docker.io/library/custom    

步骤二:

docker run -p 9000:8080 random-letter:latest

输出

INFO[0000] exec '/var/runtime/bootstrap' (cwd=/var/task, handler=)

第三步:

curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'


{"errorMessage": "Unable to unmarshal input: Expecting value: line 1 column 1 (char 0)", "errorType": "Runtime.UnmarshalError", "stackTrace": []}


INFO[0057] extensionsDisabledByLayer(/opt/disable-extensions-jwigqn8j) -> stat /opt/disable-extensions-jwigqn8j: no such file or directory
WARN[0057] Cannot list external agents                   error="open /opt/extensions: no such file or directory"
START RequestId: d49a7179-7ec5-4122-933f-be04abfed953 Version: $LATEST
Traceback (most recent call last):able to unmarshal input: Expecting value: line 1 column 1 (char 0)
END RequestId: d49a7179-7ec5-4122-933f-be04abfed953
REPORT RequestId: d49a7179-7ec5-4122-933f-be04abfed953  Init Duration: 0.23 ms  Duration: 65.39 ms      Billed Duration: 100 ms Memory Size: 3008 MB    Max Memory Used: 3008 MB

任何帮助都将是极好的。


4
你的问题可能是因为你在Windows上运行而不是Linux/macOS。请注意你在问题中使用curl和你在答案中使用的命令之间的区别。如果你实际上没有使用msg值,你可以省略它,例如curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d "{}"。关键在于用双引号括起来的{},而不是你在问题中或AWS文档中使用的单引号。 - jspinella
正确!我遇到了同样的问题,它按照上面所述的方式正常工作。 - André Castro
谢谢@jspinella!! 双引号在Windows中可以使用。 - Yogesh
2个回答

7

答案

https://github.com/lambci/docker-lambda/issues/208 使用curl命令向地址"http://localhost:9000/2015-03-31/functions/function/invocations"发送POST请求,并在请求数据中传递参数{"msg":"hello"}。

这个命令可以正常工作。


2
在Windows上,您只需要将{}周围的单引号替换为双引号,因此是的,这个答案有效,但不需要msg / hello。 - jspinella

2

如果您正在使用Postman调用端点,可以尝试以下操作:enter image description here


有没有与Postman在这里所做的功能相当的curl命令?我已经为此苦苦挣扎了几天,结果发现一个简单的postman get请求就可以工作,但其他的都不行。 - norman123123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接