使用Golang部署多个基于AWS Lambda的函数

使用Golang部署多个基于AWS Lambda的函数 大家好! 我叫乔治。我是Golang和这个论坛的新手。我来这里是为了寻求Go专业人士的帮助。 在学习这门语言的第一步时,我已经遇到了一个问题。这不是语言本身的问题,而是它与AWS Lambda函数集成的问题。目前,我正尝试在单个无服务器(AWS CloudFormation)堆栈中部署多个基于Go的Lambda函数。在这样做时,AWS要求所有函数都由一个位于根目录(相对于代码目录)的 bootstrap 文件处理。这意味着在部署时,所有函数的实现都应该编译成一个单一的 bootstrap 文件。我该如何克服这个限制?有没有人在使用Go + AWS Lambda时也遇到过同样的限制?

附上描述此限制的AWS文档URL - 使用.zip文件归档部署Go Lambda函数 - AWS Lambda


更多关于使用Golang部署多个基于AWS Lambda的函数的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于使用Golang部署多个基于AWS Lambda的函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中部署多个Lambda函数到单个CloudFormation堆栈时,确实需要为每个函数提供独立的bootstrap文件。以下是解决方案:

1. 使用独立的构建目录结构

为每个Lambda函数创建独立的构建目录,每个目录包含自己的bootstrap文件:

project/
├── cmd/
│   ├── function1/
│   │   └── main.go
│   └── function2/
│       └── main.go
├── build/
│   ├── function1/
│   │   └── bootstrap
│   └── function2/
│       └── bootstrap
└── Makefile

2. 构建脚本示例

创建构建脚本为每个函数生成独立的bootstrap文件:

// cmd/function1/main.go
package main

import (
    "context"
    "github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context) (string, error) {
    return "Function1 executed", nil
}

func main() {
    lambda.Start(handler)
}
// cmd/function2/main.go  
package main

import (
    "context"
    "github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context) (string, error) {
    return "Function2 executed", nil
}

func main() {
    lambda.Start(handler)
}

3. 使用Makefile构建

# Makefile
GOOS=linux
GOARCH=arm64
CGO_ENABLED=0

.PHONY: build-all

build-all: build-function1 build-function2

build-function1:
	@echo "Building function1..."
	GOOS=$(GOOS) GOARCH=$(GOARCH) CGO_ENABLED=$(CGO_ENABLED) \
	go build -o build/function1/bootstrap ./cmd/function1

build-function2:
	@echo "Building function2..."
	GOOS=$(GOOS) GOARCH=$(GOARCH) CGO_ENABLED=$(CGO_ENABLED) \
	go build -o build/function2/bootstrap ./cmd/function2

package:
	@echo "Packaging functions..."
	cd build/function1 && zip -j function1.zip bootstrap
	cd build/function2 && zip -j function2.zip bootstrap

deploy: build-all package
	@echo "Deploying to AWS..."
	# 添加你的部署命令

4. CloudFormation模板示例

# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  Function1:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: build/function1/function1.zip
      Handler: bootstrap
      Runtime: provided.al2023
      Architectures:
        - arm64
  
  Function2:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: build/function2/function2.zip
      Handler: bootstrap
      Runtime: provided.al2023
      Architectures:
        - arm64

5. 使用Go构建标签

如果需要共享代码但生成不同的入口点:

// cmd/lambda/main.go
//go:build function1

package main

import (
    "context"
    "github.com/aws/aws-lambda-go/lambda"
    "yourproject/pkg/shared"
)

func handler(ctx context.Context) (string, error) {
    result := shared.CommonLogic()
    return "Function1: " + result, nil
}

func main() {
    lambda.Start(handler)
}
// cmd/lambda/main.go
//go:build function2

package main

import (
    "context"
    "github.com/aws/aws-lambda-go/lambda"
    "yourproject/pkg/shared"
)

func handler(ctx context.Context) (string, error) {
    result := shared.CommonLogic()
    return "Function2: " + result, nil
}

func main() {
    lambda.Start(handler)
}

构建命令:

# 构建function1
go build -tags function1 -o build/function1/bootstrap ./cmd/lambda

# 构建function2  
go build -tags function2 -o build/function2/bootstrap ./cmd/lambda

这种方法允许你在单个CloudFormation堆栈中部署多个Go Lambda函数,每个函数都有自己独立的bootstrap文件。

回到顶部