如何在部署前解析评估CloudFormation的!Sub等函数?
如何在部署CloudFormation栈前查看Fn::Sub等函数的解析结果?
核心结论
可以通过多种方式在首次部署前查看Fn::Sub等内置函数的解析结果,无需实际部署栈,以下是具体实现方法:
方法一:利用待执行变更集查看解析结果
即使是首次部署,也可以创建一个不执行的变更集,通过查看变更集详情获取解析后的资源属性:
- 执行命令创建待执行变更集:
aws cloudformation deploy \ --template-file your-template.yml \ --stack-name test-stack \ --parameters file://parameters.json \ --no-execute-changeset - 从命令输出中获取变更集ARN,然后查询变更集详情:
aws cloudformation describe-change-set \ --change-set-name arn:aws:cloudformation:eu-west-1:123456789:changeSet/awscli-deploy-xxx - 在返回的JSON结果中,定位到
Changes数组下对应资源的ResourceChange.Details,即可看到Fn::Sub解析后的最终值(比如示例中的ValueFrom字段)。
方法二:本地编写脚本模拟解析
通过脚本手动替换模板中的伪参数和自定义参数,快速得到解析结果:
以下是Python脚本示例:
import yaml import boto3 # 读取CloudFormation模板 with open("your-template.yml", "r") as f: template = yaml.safe_load(f) # 读取参数文件(对应--parameters-file传入的内容) with open("parameters.json", "r") as f: params = yaml.safe_load(f) # 获取当前AWS账号ID和区域 sts_client = boto3.client("sts") account_id = sts_client.get_caller_identity()["Account"] region = boto3.Session().region_name # 提取自定义参数值 param_prefix = next(p["ParameterValue"] for p in params["Parameters"] if p["ParameterKey"] == "ParameterStorePrefix") # 解析Fn::Sub表达式 sub_expr = template["Resources"]["SomeResource"]["Secrets"][0]["ValueFrom"].replace("!Sub ", "") resolved_value = sub_expr.replace("${AWS::Region}", region)\ .replace("${AWS::AccountId}", account_id)\ .replace("${ParameterStorePrefix}", param_prefix) print("解析后的ValueFrom:", resolved_value)
运行脚本后,即可直接得到示例中ValueFrom字段的最终解析结果。
方法三:使用CloudFormation CLI的本地解析功能
安装AWS CloudFormation CLI后,可通过cfn sub命令本地解析模板中的Fn::Sub函数:
- 安装CLI:
pip install cloudformation-cli - 执行解析命令(结合参数文件):
cfn sub your-template.yml --parameters parameters.json
命令会输出完全解析后的模板内容,可直接查看目标字段的最终值。
CloudFormation的解析阶段说明
CloudFormation在模板验证阶段就会完成所有内置函数(如Fn::Sub、伪参数)的解析:
- 首先检查模板语法合法性、参数是否符合定义;
- 随后解析所有内置函数,生成最终的资源配置蓝图;
- 后续的变更集生成、资源创建/更新阶段,都是基于这个解析后的配置执行的。
这也是为什么我们能在部署前通过变更集或本地模拟获取解析结果的原因。
内容的提问来源于stack exchange,提问作者mijiturka
相关产品推荐
相关产品推荐

