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

无需S3,如何使用本地CloudFormation模板及嵌套栈部署?

问题原因

AWS CloudFormation的嵌套栈TemplateURL要求必须是云端可访问的URL(如S3对象地址、公网HTTP/HTTPS地址),本地文件路径common/ec2/lifecyclemanager.yaml无法被CloudFormation服务识别,因此报错template url must be supported url。

无需S3的解决方案

方案1:使用aws cloudformation package内嵌本地模板

aws cloudformation package命令可自动将本地引用的嵌套模板转换为内嵌的TemplateBody内容,完全无需依赖外部存储。具体改造步骤如下:

调整部署脚本

在创建变更集前先执行打包操作,将本地模板整合为单份内嵌模板:

#!/bin/bash

TEMPLATE_FILE="root.yaml"
PACKAGED_TEMPLATE="packaged-root.yaml"
CAPABILITIES="CAPABILITY_NAMED_IAM"
PROFILE="nit-iam"
STACK_NAME='PROD-INFRA'
CHANGE_SET_NAME='PROD-CHANGE'

# 打包本地模板,自动将嵌套的本地模板转换为内嵌内容
echo "Packaging local CloudFormation templates..."
AWS_PROFILE=$PROFILE aws cloudformation package \
  --template-file $TEMPLATE_FILE \
  --output-template-file $PACKAGED_TEMPLATE \
  --use-yaml # 保持YAML格式,也可选择--use-json

# 创建变更集,使用打包后的内嵌模板
AWS_PROFILE=$PROFILE aws cloudformation create-change-set \
  --stack-name $STACK_NAME \
  --change-set-name $CHANGE_SET_NAME \
  --template-body file://$PACKAGED_TEMPLATE \
  --capabilities $CAPABILITIES \
  --change-set-type CREATE

echo "Waiting for change set to be created..."
AWS_PROFILE=$PROFILE aws cloudformation wait change-set-create-complete \
  --stack-name $STACK_NAME \
  --change-set-name $CHANGE_SET_NAME

# 执行变更集
echo "Executing change set..."
AWS_PROFILE=$PROFILE aws cloudformation execute-change-set \
  --stack-name $STACK_NAME \
  --change-set-name $CHANGE_SET_NAME

# 可选:清理临时打包文件
rm $PACKAGED_TEMPLATE

原理说明

package命令会遍历主模板中的TemplateURL字段,读取本地模板内容并将其转换为YAML/JSON字符串,替换原TemplateURL为TemplateBody属性,让嵌套栈定义完全内嵌在主模板中,绕开对外部URL的依赖。


方案2:手动内嵌模板内容

如果不想使用package命令,可直接将子模板内容复制到主模板的TemplateBody中:

AWSTemplateFormatVersion: '2010-09-09'
Description: AWS EC2 Backup Policy for Production Environment

Resources:
  EC2LifecycleManagerStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      # 替换TemplateURL为TemplateBody,直接嵌入子模板完整内容
      TemplateBody: |
        AWSTemplateFormatVersion: '2010-09-09'
        Description: EC2 Lifecycle Manager Backup Policy
        Parameters:
          RetentionPeriodDay:
            Type: Number
          RetentionPeriodWeek:
            Type: Number
          # 粘贴子模板所有参数和资源定义
        Resources:
          # 粘贴子模板的资源逻辑
      Parameters:
        RetentionPeriodDay: 5
        RetentionPeriodWeek: 2
        # 保留原参数配置

这种方法适合子模板内容较少的场景,缺点是主模板会变得冗长,不利于后续维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:02:05