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

如何在独立CloudFormation模板中引用Chalice创建的纯Python Lambda函数

解决方案

方案1:通过Chalice部署输出传参(最简便)

Chalice每次部署完成后,会自动在.chalice/deployed/<阶段名>.json文件中生成所有资源的元数据,你定义的R53CloudformationResourceConflict函数的完整名称、ARN都会直接保存在这个文件中。
你只需新增一个简单的部署脚本,在Chalice部署完成后读取该值,作为参数传入独立CloudFormation模板的部署命令即可,适配任意阶段、应用名变更的场景,无需修改Chalice配置:

# 部署指定阶段的Chalice应用,示例阶段为dev
chalice deploy --stage dev
# 从部署输出中读取Lambda完整名称
LAMBDA_NAME=$(jq -r '.lambda_functions.R53CloudformationResourceConflict.function_name' .chalice/deployed/dev.json)
# 部署独立CloudFormation栈,传入Lambda名称参数
aws cloudformation deploy --template-file cf.yml --stack-name your-cf-stack-name --parameter-overrides LambdaFunctionName=$LAMBDA_NAME

方案2:CloudFormation跨栈导出引用

如果需要多栈解耦,你可以给Chalice自动生成的CloudFormation栈添加全局导出值,直接在独立CF模板中跨栈引用:

  1. 在Chalice项目根目录新建.chalice/cfextensions目录,新增outputs.cf.json文件,内容如下:
{
  "Outputs": {
    "R53ConflictLambdaName": {
      "Value": {"Ref": "R53CloudformationResourceConflict"},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-R53ConflictLambdaName"}
      }
    }
  }
}
  1. 重新部署Chalice应用后,修改你的cf.yml,移除原有LambdaFunctionName参数,改为通过Fn::ImportValue引用导出值:
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  ChaliceStackName:
    Type: String
    Description: Chalice应用部署生成的CloudFormation栈名,默认格式为<应用名>-<阶段名>

Resources:
  R53CloudformationResourceConflict:
    Type: 'Custom::R53CloudformationResourceConflict'
    Properties:
      ServiceToken: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${!ImportValue ${ChaliceStackName}-R53ConflictLambdaName}'
      AppUrl: "some_app_url"

部署独立CF栈时只需传入Chalice的栈名即可自动匹配对应Lambda。

方案3:模板内动态拼接名称

你也可以直接在Chalice配置中使用内置变量声明Lambda名称规则,之后在独立CF模板中直接通过参数拼接即可:

  1. 在.chalice/config.json中添加对应Lambda的名称配置,Chalice支持{app_name}、{stage}两个内置变量自动替换:
{
  "stages": {
    "dev": {
      "lambda_functions": {
        "R53CloudformationResourceConflict": {
          "name": "{app_name}-{stage}-R53CloudformationResourceConflict"
        }
      }
    },
    "prod": {
      "lambda_functions": {
        "R53CloudformationResourceConflict": {
          "name": "{app_name}-{stage}-R53CloudformationResourceConflict"
        }
      }
    }
  }
}
  1. 修改cf.yml,传入应用名和阶段两个参数即可动态拼接出正确的Lambda名称。

内容的提问来源于stack exchange,提问作者Justin S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:06:03