繁体   English   中英

在 Docker 上为 AWS Lambda 公开哪个端口?

[英]Which port to expose on Docker for AWS Lambda?

我正在尝试使用 Docker 图像在 AWS Lambda 上托管一个非常简单的 (Hello World) FastAPI。 该图像在本地运行良好,但当我在 Lambda 上运行它时,它显示端口绑定错误。 以下是我尝试使用此图像测试 Lambda function 时收到的错误详细信息。

START RequestId: ae27e3b1-596d-41f3-a153-51cb9facc7a7 Version: $LATEST
INFO:     Started server process [8]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
ERROR:    [Errno 13] error while attempting to bind on address ('0.0.0.0', 80): permission denied
INFO:     Waiting for application shutdown.
INFO:     Application shutdown complete.
END RequestId: ae27e3b1-596d-41f3-a153-51cb9facc7a7
REPORT RequestId: ae27e3b1-596d-41f3-a153-51cb9facc7a7  Duration: 3034.14 ms    Billed Duration: 3000 ms    Memory Size: 128 MB Max Memory Used: 20 MB  
2021-11-01T00:23:59.807Z ae27e3b1-596d-41f3-a153-51cb9facc7a7 Task timed out after 3.03 seconds

这表示我无法在 0.0.0.0 上绑定端口 80,所以知道我应该在 Dockerfile 中使用哪个端口和主机才能使其在 AWS Lambda 上运行吗? 谢谢(下面是我用的Dockerfile)

FROM python:3.9


WORKDIR /code


COPY ./requirements.txt /code/requirements.txt


RUN pip install -r /code/requirements.txt


COPY . /code


CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]

在 AWS Lambda 中运行 FastAPI 时(假设与AWS API 网关一起使用,Lambda 需要它来接收 HTTP 请求),您不能像往常一样使用 uvicorn 运行它并绑定到端口。

相反,您需要使用Mangum ,它将创建 Lambda 处理程序并转换任何传入的 Lambda 事件并将其作为请求 object 发送到 FastAPI,根据我的经验,这一切都运行良好。

因此,您创建处理程序的代码可能如下所示:

if __name__ == "__main__":
    uvicorn.run("myapp:app")
else:
    handler = Mangum(app)

此外,您的Dockerfile将有一个类似这样的入口点:

ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
CMD [ "myapp.handler" ]

其中awslambdaric是 AWS 提供的 python 模块,用于在 AWS Lambda 中运行 Docker 容器,如此所述。

另请注意,API 网关资源需要使用 Lambda 代理集成配置的方法。

我还没有测试过上面的任何一个,它只是一个如何开始的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM