求AWS Lambda使用自定义Docker容器的完整端到端实现示例
需求可行性说明
你的需求完全可实现,AWS Lambda原生支持容器镜像部署模式,执行结束后会自动回收所有临时容器资源,无需额外开发清理逻辑。
全流程可运行示例
1. 调整Dockerfile适配Lambda要求
你已有的可运行Dockerfile只需要新增Lambda Runtime接口适配逻辑即可,以下是完整示例:
- 核心文件1:
Dockerfile
# 可替换为你自己的基础镜像,此处用AWS官方Lambda基础运行时镜像简化适配 FROM public.ecr.aws/lambda/provided:al2-x86_64 # 安装业务依赖 RUN yum install -y curl jq && yum clean all # 复制你要执行的业务bash脚本 COPY my_task.sh ./ RUN chmod +x my_task.sh # 复制Lambda入口引导脚本 COPY bootstrap ./ RUN chmod +x bootstrap # 指定Lambda启动入口 CMD ["bootstrap"]
- 核心文件2:
bootstrap(Lambda运行时入口,用来接收触发事件调用你的业务脚本)
#!/bin/sh set -euo pipefail # 循环监听Lambda运行时事件 while true do # 获取触发事件信息 EVENT=$(curl -sS "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") REQ_ID=$(echo "$EVENT" | jq -r '.requestContext.requestId') # 调用你指定的bash脚本,传入事件参数 ./my_task.sh "$EVENT" # 上报执行成功结果 curl -sS "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/${REQ_ID}/response" -d '{"code":0,"msg":"task done"}' done
- 核心文件3:
my_task.sh(你自己的业务逻辑脚本,可自定义内容)
#!/bin/bash echo "接收到触发参数:$1" # 此处写入你的实际业务逻辑 echo "业务任务执行完成"
2. 构建镜像并推送至ECR
提前安装配置好AWS CLI,执行以下命令:
# 配置变量,替换为你自己的实际参数 AWS_REGION=cn-north-1 ECR_REPO_NAME=lambda-custom-task-repo # 1. 创建ECR镜像仓库(如果已创建可跳过) aws ecr create-repository --repository-name $ECR_REPO_NAME --region $AWS_REGION # 2. 登录ECR ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com # 3. 构建镜像并打标签 docker build -t lambda-task . docker tag lambda-task:latest ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPO_NAME}:latest # 4. 推送镜像到ECR docker push ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPO_NAME}:latest
3. 创建Lambda函数
提前准备好Lambda执行角色,角色需要附加AWSLambdaBasicExecutionRole和AmazonEC2ContainerRegistryReadOnly权限策略:
# 替换为你自己的Lambda执行角色ARN LAMBDA_ROLE_ARN=arn:aws-cn:iam::${ACCOUNT_ID}:role/lambda-container-role # 创建Lambda函数 aws lambda create-function \ --function-name custom-container-task \ --package-type Image \ --code ImageUri=${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPO_NAME}:latest \ --role ${LAMBDA_ROLE_ARN} \ --timeout 300 \ --memory-size 1024 \ --region $AWS_REGION
4. 手动触发Lambda执行
执行以下命令触发调用,Lambda会自动拉取ECR镜像、启动容器、执行你的bash脚本:
# 触发调用,执行结果写入response.json aws lambda invoke \ --function-name custom-container-task \ --payload '{"test_key":"test_value"}' \ --region $AWS_REGION \ response.json # 查看执行结果 cat response.json
5. 资源自动回收说明
Lambda执行完成后会自动销毁容器实例,释放所有计算资源,无需你手动操作。如果不需要保留相关配置,可手动删除ECR镜像和Lambda函数即可。
内容的提问来源于stack exchange,提问作者user10664542
相关产品推荐
相关产品推荐

