如何通过CloudFormation部署Bash脚本自定义运行时AWS Lambda
使用CloudFormation部署Bash脚本作为Lambda自定义运行时
核心配置要点
1. Handler字段设置
对于自定义运行时(provided.al2或provided),Handler字段可任意填写——Lambda自定义运行时不会读取该字段,仅以bootstrap脚本作为执行入口。比如填hello.handler或直接handler都不影响功能。
2. Runtime选择
优先选用provided.al2(基于Amazon Linux 2),它比旧版provided(Amazon Linux AMI)更稳定,支持更多现代特性。
部署文件结构
按以下目录结构整理文件:
lambda-bash-function/ ├── bootstrap ├── hello.sh ├── Makefile └── template.yml
关键文件内容
bootstrap脚本(必须赋予执行权限)
作为Lambda自定义运行时的入口,负责监听事件、调用业务脚本、返回执行结果,示例如下:
#!/bin/bash set -euo pipefail # 持续监听Lambda运行时API的事件循环 while true; do # 获取下一个触发事件 EVENT_DATA=$(curl -sS -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # 从响应头提取请求ID INVOCATION_ID=$(echo "$EVENT_DATA" | grep -oP '(?<=Lambda-Runtime-Aws-Request-Id: ).*') # 调用业务脚本并传入事件数据 RESPONSE=$(/var/task/hello.sh "$EVENT_DATA") # 将结果返回给Lambda运行时API curl -sS -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$INVOCATION_ID/response" \ -d "$RESPONSE" done
执行命令赋予权限:
chmod +x bootstrap
hello.sh业务脚本
编写你的Bash业务逻辑,示例:
#!/bin/bash # 接收传入的触发事件数据 EVENT=$1 # 这里替换为你的业务逻辑,比如处理事件、执行系统命令等 echo "{\"message\": \"Hello from Bash Lambda\", \"trigger_event\": $EVENT}"
同样赋予执行权限:chmod +x hello.sh
Makefile(用于打包)
自动将脚本打包成Lambda要求的zip格式:
build: @echo "Packaging Lambda function files..." zip -r lambda-bash-function.zip bootstrap hello.sh @echo "Package created: lambda-bash-function.zip" clean: rm -f lambda-bash-function.zip
执行make build即可生成可部署的zip包。
CloudFormation模板(template.yml)
以下是完整的部署模板,包含Lambda函数、最小权限IAM角色,可选添加定时触发规则:
AWSTemplateFormatVersion: '2010-09-09' Description: Deploy Bash script as Lambda Custom Runtime Resources: LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Policies: - PolicyName: LambdaBashCustomPolicy PolicyDocument: Version: '2012-10-17' Statement: # 这里添加业务所需的权限,比如S3访问、数据库操作等 - Effect: Allow Action: - s3:ListBucket Resource: arn:aws:s3:::your-target-bucket BashLambdaFunction: Type: AWS::Lambda::Function Properties: FunctionName: BashCustomRuntimeFunction Handler: hello.handler # 自定义运行时不使用该字段,可任意填写 Runtime: provided.al2 Role: !GetAtt LambdaExecutionRole.Arn Code: # 推荐将zip包上传到S3后使用以下配置 S3Bucket: your-deployment-bucket S3Key: lambda-bash-function.zip Timeout: 30 # 根据脚本执行时长调整 MemorySize: 128 # 可选:添加CloudWatch定时触发(每日凌晨执行) LambdaScheduleRule: Type: AWS::Events::Rule Properties: ScheduleExpression: cron(0 0 * * ? *) Targets: - Arn: !GetAtt BashLambdaFunction.Arn Id: BashLambdaTarget LambdaPermissionForEvents: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref BashLambdaFunction Action: lambda:InvokeFunction Principal: events.amazonaws.com SourceArn: !GetAtt LambdaScheduleRule.Arn
若使用本地zip包部署,需先将包上传至S3桶,再替换模板中
Code字段的S3信息。
部署步骤
- 执行
make build生成zip包 - 将zip包上传至你的AWS S3桶
- 调整CloudFormation模板中的S3路径、权限等配置
- 通过AWS CLI或控制台部署模板:
aws cloudformation deploy --template-file template.yml --stack-name bash-lambda-stack --capabilities CAPABILITY_IAM
内容的提问来源于stack exchange,提问作者Gwenda Thomas
相关产品推荐
相关产品推荐

