基于AWS SAM的Rust项目:从同一crate部署多Lambda函数遇阻
解决AWS SAM部署多Rust Lambda时复用构建产物的问题
核心问题是SAM对相同CodeUri的函数会复用第一次构建的结果,不会重复执行对应build-<FunctionName>目标,导致第二个函数的Make命令从未执行,直接用了第一个函数的bootstrap文件。
下面提供几个可行的解决方案:
方案一:通过BuildArgs区分构建目标(推荐,无需调整目录)
修改template.yaml,给每个函数添加Metadata传递构建参数,指定要编译的二进制名称:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Globals: Function: Handler: bootstrap.is.the.handler Runtime: provided.al2 Architectures: - x86_64 Resources: Function1: Type: AWS::Serverless::Function Properties: CodeUri: . Metadata: BuildMethod: make BuildArgs: BINARY_NAME: function1 Function2: Type: AWS::Serverless::Function Properties: CodeUri: . Metadata: BuildMethod: make BuildArgs: BINARY_NAME: function2
然后修改Makefile,根据传入的BINARY_NAME变量编译对应二进制并复制bootstrap:
build-%: cargo lambda build --release --binary $(BINARY_NAME) cp ./target/lambda/$(BINARY_NAME)/bootstrap $(ARTIFACTS_DIR)
这样SAM会识别到两个函数的构建参数不同,不会复用缓存,分别执行对应的构建步骤。
方案二:给每个函数设置独立的CodeUri
调整目录结构,为每个Lambda函数创建单独的子目录,通过Cargo工作区共享根目录的lib.rs依赖:
myapp/ - function1/ - Cargo.toml - Makefile - function2/ - Cargo.toml - Makefile - src/ - lib.rs - Cargo.toml # 根目录作为工作区 - template.yaml
- 根目录
Cargo.toml添加工作区配置:
[workspace] members = ["function1", "function2"]
- 每个子目录的
Cargo.toml添加对根lib的依赖:
[dependencies] myapp-lib = { path = "../" }
- 修改
template.yaml中每个函数的CodeUri指向对应子目录:
Resources: Function1: Type: AWS::Serverless::Function Properties: CodeUri: ./function1/ Function2: Type: AWS::Serverless::Function Properties: CodeUri: ./function2/
- 每个子目录的
Makefile编写对应构建命令:
build-Function1: cargo lambda build --release cp ./target/lambda/function1/bootstrap $(ARTIFACTS_DIR)
这种方式让每个函数拥有独立的构建上下文,SAM会分别执行各自的构建命令。
方案三:统一构建所有函数,指定不同代码路径
先通过Makefile一次性构建两个函数的bootstrap,再在template.yaml中让每个函数指向对应的构建产物目录:
- 修改
Makefile:
build-all: cargo lambda build --release --binary function1 cargo lambda build --release --binary function2 mkdir -p ./build/function1 ./build/function2 cp ./target/lambda/function1/bootstrap ./build/function1/ cp ./target/lambda/function2/bootstrap ./build/function2/
- 修改
template.yaml:
Resources: Function1: Type: AWS::Serverless::Function Properties: CodeUri: ./build/function1/ Function2: Type: AWS::Serverless::Function Properties: CodeUri: ./build/function2/
构建时先执行make build-all生成产物,再运行sam build和sam deploy即可。
内容的提问来源于stack exchange,提问作者mdsimmo
相关产品推荐
相关产品推荐

