You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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信息。


部署步骤

  1. 执行make build生成zip包
  2. 将zip包上传至你的AWS S3桶
  3. 调整CloudFormation模板中的S3路径、权限等配置
  4. 通过AWS CLI或控制台部署模板:
    aws cloudformation deploy --template-file template.yml --stack-name bash-lambda-stack --capabilities CAPABILITY_IAM
    

内容的提问来源于stack exchange,提问作者Gwenda Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:52:37