【发布时间】:2021-10-11 12:37:20
【问题描述】:
我一直在 AWS 上编写一个由多个 Rust lambda 组成的应用程序。其中一个 lambda 必须能够访问一堆外部依赖项,因此需要进行 Docker 化。据我了解,Rust 的官方 AWS Lambda 运行时在 lambda 的二进制文件中运行,不需要任何特殊设置或暴露端口。 我的 Dockerfile 如下:
# building omitted
FROM alpine:latest AS runner
WORKDIR /root/
COPY target/x86_64-unknown-linux-musl/release/my-lambda ./my-lambda
CMD [ "/root/my-lambda" ]
然后构建映像并将其推送到我的 Lambda 配置为从中获取其代码的 Amazon ECR 注册表。 在 AWS 控制台中使用任何测试数据调用该函数时得到的日志是:
IMAGE Launch error: fork/exec /root/my-lambda: permission denied Entrypoint: [] Cmd: [/root/my-lambda] WorkingDir: [/root/]
START RequestId: (...) Version: $LATEST
IMAGE Launch error: fork/exec /root/my-lambda: permission denied Entrypoint: [] Cmd: [/root/my-lambda] WorkingDir: [/root/]
END RequestId: (...)
REPORT RequestId: (...) Duration: 59.75 ms Billed Duration: 60 ms Memory Size: 128 MB Max Memory Used: 5 MB
RequestId: (...) Error: fork/exec /root/my-lambda: permission denied
Runtime.InvalidEntrypoint
{
"errorMessage": "RequestId: (...) Error: fork/exec /root/my-lambda: permission denied",
"errorType": "Runtime.InvalidEntrypoint"
}
我知道问题不在于:
-
my-lambda可执行文件的权限(任何人都可以执行它,我也尝试过 chmod -R 777 也很好) - libc 的可用性(我专门为 musl 目标编译,这是 Rust lambda 的最佳实践,因为 Rust 标准库几乎总是链接到比 Amazon Linux 更新的 glibc)
- Docker 映像是否运行 - 如果我尝试在本地运行映像,我的 lambda 会运行并崩溃,因为找不到 AWS_LAMBDA_RUNTIME_API env var 或 lambda 所依赖的其他变量,正如预期的那样
- 可执行文件的命名或是否使用相对路径调用 - 根据 lambda 约定将其命名为
bootstrap并以CMD ["./bootstrap"]结尾并没有帮助
我还尝试在 dockerfile 中使用 ENTRYPOINT 而不是 CMD,并提供一个占位符 CMD,例如 doesnt.matter。
谷歌搜索解决方案只发现了 Rust lambda 构建器图像和 Golang 的类似但不相关的错误。
【问题讨论】:
标签: amazon-web-services docker rust aws-lambda