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

如何在SAM本地测试中配置Stage Variables?

解决本地测试SAM API Gateway Stage Variables的方案

下面是几个实用的解决办法,适配你的场景:

方案1:在SAM模板中配置本地Stage Variables

直接修改你的SAM模板(template.yaml),为API Gateway阶段添加本地测试用的Stage Variables,通过参数区分生产和本地环境:

  1. 在模板顶部添加参数定义:
Parameters:
  EnvType:
    Type: String
    Default: local
    AllowedValues:
      - local
      - prod
  1. 在API Gateway的Stage配置中,根据EnvType注入Stage Variables:
Resources:
  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: prod
      StageVariables:
        # 本地环境直接指定变量值,生产环境留空(部署时通过aws cli覆盖)
        Var1: !If [IsLocal, "local-value-1", ""]
        Var2: !If [IsLocal, "local-value-2", ""]
  Conditions:
    IsLocal: !Equals [!Ref EnvType, local]
  1. 本地启动时指定参数:
sam local start-api --parameter-overrides EnvType=local

生产部署时保持原流程,sam deploy后用aws apigateway create-deployment覆盖变量即可。

方案2:通过环境变量模拟Stage Variables

如果不想修改模板,可以用sam local的--env-vars参数,把Stage Variables作为环境变量传给Lambda,然后在代码中兼容两种获取方式:

  1. 创建本地环境变量文件(比如local-env.json):
{
  "MyLambdaFunction": {
    "VAR1": "local-value-1",
    "VAR2": "local-value-2"
  }
}
  1. 修改Lambda代码,优先读取环境变量, fallback到Stage Variables:
# Python示例
import os

def lambda_handler(event, context):
    # 获取Stage变量,本地用环境变量,生产用requestContext
    var1 = os.environ.get('VAR1', event['requestContext']['stageVariables'].get('VAR1'))
    var2 = os.environ.get('VAR2', event['requestContext']['stageVariables'].get('VAR2'))
    # 后续业务逻辑...
  1. 启动本地API时指定环境变量文件:
sam local start-api --env-vars local-env.json

方案3:本地代理注入Stage Variables

如果需要完全模拟生产环境的请求结构(无需修改代码),可以用简单的本地代理注入Stage Variables:

  1. 编写Python代理脚本(比如stage-proxy.py):
from flask import Flask, request, jsonify
import requests

app = Flask(__name__)
SAM_API_URL = "http://localhost:3000"  # sam local默认端口

# 定义你的Stage Variables
STAGE_VARS = {
    "Var1": "local-value-1",
    "Var2": "local-value-2"
}

@app.route('/', defaults={'path': ''}, methods=['GET', 'POST', 'PUT', 'DELETE'])
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def proxy(path):
    target_url = f"{SAM_API_URL}/{path}"
    headers = dict(request.headers)
    data = request.get_data()
    
    # 若为JSON请求,注入stageVariables到requestContext
    if request.is_json:
        req_json = request.get_json()
        req_json['requestContext'] = req_json.get('requestContext', {})
        req_json['requestContext']['stageVariables'] = STAGE_VARS
        data = jsonify(req_json).data
    
    #  转发请求到sam local API
    response = requests.request(
        method=request.method,
        url=target_url,
        headers=headers,
        data=data,
        cookies=request.cookies
    )
    
    return (response.content, response.status_code, dict(response.headers))

if __name__ == '__main__':
    app.run(port=8080)
  1. 先启动sam local API:
sam local start-api -p 3000
  1. 再启动代理脚本:
python stage-proxy.py
  1. 测试时请求代理端口(http://localhost:8080),Lambda即可从event['requestContext']['stageVariables']拿到变量,和生产环境一致。

内容的提问来源于stack exchange,提问作者praneeth mendu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:09:22