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

基于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
  1. 根目录Cargo.toml添加工作区配置:
[workspace]
members = ["function1", "function2"]
  1. 每个子目录的Cargo.toml添加对根lib的依赖:
[dependencies]
myapp-lib = { path = "../" }
  1. 修改template.yaml中每个函数的CodeUri指向对应子目录:
Resources:
  Function1:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./function1/
  
  Function2:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./function2/
  1. 每个子目录的Makefile编写对应构建命令:
build-Function1:
    cargo lambda build --release
    cp ./target/lambda/function1/bootstrap $(ARTIFACTS_DIR)

这种方式让每个函数拥有独立的构建上下文,SAM会分别执行各自的构建命令。

方案三:统一构建所有函数,指定不同代码路径

先通过Makefile一次性构建两个函数的bootstrap,再在template.yaml中让每个函数指向对应的构建产物目录:

  1. 修改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/
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:20:22