如何在CloudFormation的!Sub函数内使用!ImportValue跨栈值
解决方法
错误原因
- 首次配置时,
!Sub默认仅支持引用模板参数、资源、输出及AWS伪参数,无法直接读取同资源内其他属性的赋值,因此${RestApiId}无法解析到有效值,生成的ARN格式错误。 - 第二次配置时遗漏了
$标记,{!ImportValue CompRestAPI}不会被CloudFormation解析为函数,会直接作为字符串拼接进ARN,导致ARN校验失败。
正确实现方式
方式1:使用!Sub的变量映射语法
通过!Sub的数组语法,预先将跨栈导入的值定义为Sub的局部变量,可读性更高,推荐使用:
CompRestApiWaf: Type: AWS::WAFv2::WebACLAssociation DependsOn: CompApiGatewayStage Properties: ResourceArn: !Sub - 'arn:aws:apigateway:${AWS::Region}:/${ImportedRestApiId}/stages/${STAGENAME}-apistage' - ImportedRestApiId: !ImportValue CompRestAPI WebACLArn: !Ref WafId
提示:这里直接使用AWS内置伪参数
${AWS::Region}代替自定义的REGION参数,无需额外配置即可自动适配当前栈的部署区域。
方式2:直接在!Sub模板内嵌入ImportValue
在Sub模板中添加$标记包裹ImportValue函数即可自动解析:
CompRestApiWaf: Type: AWS::WAFv2::WebACLAssociation DependsOn: CompApiGatewayStage Properties: ResourceArn: !Sub 'arn:aws:apigateway:${AWS::Region}:/${!ImportValue CompRestAPI}/stages/${STAGENAME}-apistage' WebACLArn: !Ref WafId
额外注意事项
AWS::WAFv2::WebACLAssociation关联API Gateway时,ResourceARN已经包含了API ID和阶段信息,无需单独配置RestApiId属性,多余配置可能引发冲突。- 跨栈导出导入仅支持同账号同区域的栈,跨账号/跨区域场景无法直接使用
!ImportValue。
内容的提问来源于stack exchange,提问作者user1954346
相关产品推荐
相关产品推荐

