如何在CDK中为CloudFront Function添加环境变量?
解决方案
CloudFront Function 原生不支持设置环境变量,属于AWS官方的产品限制,你可以通过CDK动态处理函数代码的方式实现类似效果,常用方案如下:
方案1:占位符替换
先在你的JS函数代码中用特殊标记作为变量占位符,再在CDK中读取文件替换占位符后生成函数:
- 修改
lambda/function.js,添加占位符:
function handler(event) { // 此处的%%REDIRECT_TARGET%%就是待替换的占位符 const REDIRECT_TARGET = '%%REDIRECT_TARGET%%'; const response = { statusCode: 302, statusDescription: 'Found', headers: { 'location': { value: REDIRECT_TARGET } } }; return response; }
- 修改CDK代码,替换占位符后创建函数:
from aws_cdk import aws_cloudfront as cloudfront # 读取原JS代码 with open("lambda/function.js", "r", encoding="utf-8") as f: raw_js = f.read() # 替换所有占位符为实际值 processed_js = raw_js.replace("%%REDIRECT_TARGET%%", "https://your-target-domain.com/path") # 创建CloudFront Function func = cloudfront.Function( self, "redirect", code=cloudfront.FunctionCode.from_inline(processed_js), )
方案2:动态注入配置对象
如果需要传入的变量较多,可以直接把所有配置拼成JS对象注入到代码开头,无需修改原JS文件的占位符:
import json from aws_cdk import aws_cloudfront as cloudfront # 定义所有需要传入的配置 env_config = { "REDIRECT_TARGET": "https://your-target-domain.com/path", "ALLOWED_DOMAIN": "https://your-origin-domain.com", "MAX_AGE": 86400 } # 生成JS配置代码,拼接到原JS代码最前面 config_snippet = f"const ENV = {json.dumps(env_config)};" with open("lambda/function.js", "r", encoding="utf-8") as f: raw_js = f.read() full_js = config_snippet + raw_js # 创建函数 func = cloudfront.Function( self, "redirect", code=cloudfront.FunctionCode.from_inline(full_js), )
之后你可以在JS代码中直接读取ENV对象的属性使用:
function handler(event) { const redirectTarget = ENV.REDIRECT_TARGET; // 后续业务逻辑 }
注意事项
CloudFront Function有最大10KB的代码体积限制,注入配置时注意不要超出容量上限。
内容的提问来源于stack exchange,提问作者DenCowboy
相关产品推荐
相关产品推荐

