如何在SAM本地测试中配置Stage Variables?
解决本地测试SAM API Gateway Stage Variables的方案
下面是几个实用的解决办法,适配你的场景:
方案1:在SAM模板中配置本地Stage Variables
直接修改你的SAM模板(template.yaml),为API Gateway阶段添加本地测试用的Stage Variables,通过参数区分生产和本地环境:
- 在模板顶部添加参数定义:
Parameters: EnvType: Type: String Default: local AllowedValues: - local - prod
- 在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]
- 本地启动时指定参数:
sam local start-api --parameter-overrides EnvType=local
生产部署时保持原流程,sam deploy后用aws apigateway create-deployment覆盖变量即可。
方案2:通过环境变量模拟Stage Variables
如果不想修改模板,可以用sam local的--env-vars参数,把Stage Variables作为环境变量传给Lambda,然后在代码中兼容两种获取方式:
- 创建本地环境变量文件(比如
local-env.json):
{ "MyLambdaFunction": { "VAR1": "local-value-1", "VAR2": "local-value-2" } }
- 修改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')) # 后续业务逻辑...
- 启动本地API时指定环境变量文件:
sam local start-api --env-vars local-env.json
方案3:本地代理注入Stage Variables
如果需要完全模拟生产环境的请求结构(无需修改代码),可以用简单的本地代理注入Stage Variables:
- 编写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)
- 先启动sam local API:
sam local start-api -p 3000
- 再启动代理脚本:
python stage-proxy.py
- 测试时请求代理端口(http://localhost:8080),Lambda即可从
event['requestContext']['stageVariables']拿到变量,和生产环境一致。
内容的提问来源于stack exchange,提问作者praneeth mendu
相关产品推荐
相关产品推荐

