【问题标题】:AWS lambda container /bin/sh Error: Runtime exited without providing a reason"AWS lambda 容器 /bin/sh 错误:运行时已退出而未提供原因”
【发布时间】:2021-10-01 12:33:43
【问题描述】:

我从 AWS lambda 容器 Error: Runtime exited without providing a reason 收到此错误 当我在本地运行这个容器时,我得到了exit code 0

但是当我在 Lambda 中运行它时,我遇到了上面提到的错误和exit code 0

在这两种情况下,备份都会在 S3 上正确创建

我的容器运行这个命令:

FROM alpine:3.14.2

ARG BUILD_ID
ARG BUILD_DATE
ARG VERSION=0.0.9

LABEL maintainer="Rostyslav Malenko"
LABEL version="$VERSION"
LABEL description="This is custom Alpine Docker Image for the create SQL dump from RDS to S3 directly."
LABEL org.label-schema.build-date=$BUILD_DATE

ENV BUILD_ID=${BUILD_ID} \
    APPLICATION_VERSION=${VERSION} \
    SERVICE_ROLE=backup \
    NUMPROCS_WORKER=1 \
    INSTALL_PACKAGES="gzip mysql-client aws-cli" \
    WORKSD="/tmp"

RUN apk -v --update add --no-cache ${INSTALL_PACKAGES} && \
    rm -rf /var/cache/apk/* 

WORKDIR ${WORKSD}}

CMD /usr/bin/mysqldump --host=${DB_HOST} --user=${DB_USER} --password=${DB_PASSWORD} --port=3306 \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    --add-drop-database \
    --opt \
    --add-locks \
    --compress \
    --databases ${DB_NAME} | gzip -9 | aws s3 cp - s3://${S3BUCKETNAME}/$(date +"%m-%d-%Y-%H-%M-%S")_${DB_NAME}.sql.gz ; echo $?

【问题讨论】:

    标签: amazon-web-services docker amazon-s3 aws-lambda containers


    【解决方案1】:

    AWS Lambda expects container images to implement a specific interface,以便 Lambda 环境可以将 Lambda 调用事件参数传递到容器中,从而使 Lambda 可以正确解析响应。

    您似乎正在尝试运行未实现所需 AWS Lambda 接口的常规 Docker 映像。您的用例实际上看起来更适合 AWS ECS + Fargate。如果您想使用 Lambda,您将需要修改您的容器或使用提供的 AWS Lambda 基础容器映像之一重新构建它。

    【讨论】:

    • 谢谢@mark-b 我已经使用 public.ecr.aws/lambda/provided:al2 重建了 docker 但我仍然遇到同样的错误。 AWS Lambda 是否有可能只运行代码而不是容器内的二进制文件而不会出错? ECR - 我的任务将是过于复杂的基础设施。我需要每周运行几次 cron 任务。看起来旧方法会更好的解决方案。我的意思是用 cron 任务运行一个小实例:)
    • 我没有提到 ECR,我说的是 ECS + Fargate,它不涉及创建任何服务器,它是无服务器的,并且在我看来,像你这样快速运行的 docker 镜像比在上面运行更容易拉姆达。至于在 Lambda 上运行二进制文件,这样做完全没有问题,您的问题是您仍然没有在容器内实现实际的 Lambda 事件处理程序接口。在 Lambda 中,您的容器不应该自行退出,它应该接受一个事件并处理它,然后闲置直到 AWS Lambda 服务销毁它。
    • 谢谢@mark-b 你是对的。我将配置 ECS + Fargate。它看起来是最好的选择。因为在容器中通过 python 启动 MySQLDump 可能不是一个好主意。
    猜你喜欢
    • 2022-10-05
    • 1970-01-01
    • 2020-03-22
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多