

# 使用模板工作室直观地编辑模板
<a name="template-studio"></a>

模板工作室是 CloudFormation 控制台中的一款模板编辑器。它以文本形式展示模板，并在旁边呈现该模板所声明资源的示意图。在您编辑模板时，示意图会重新绘制以匹配。您无需离开控制台，即可验证模板、在 YAML 和 JSON 格式之间进行转换，并将其保存至 Amazon S3。

模板文本具有权威性。示意图是对该文本的视觉呈现，而非一个可独立编辑的区域。您可以在模板中进行所有更改。

## 注意事项
<a name="template-studio-considerations"></a>

在模板工作室中工作时，请牢记以下几点：
+ 您是在模板中创作的，而不是在示意图上。示意图展示您的模板所声明的资源以及这些资源之间的相互引用关系；您无法通过编辑示意图来添加或配置资源。
+ 您的编辑不会自动保存。如果您在存在未保存更改的情况下尝试离开页面，模板工作室会要求您进行确认。如果您离开或刷新页面，则未保存的更改会被丢弃。在离开之前，请保存到 Amazon S3，或者复制或下载模板。
+ 将模板从 YAML 转换为 JSON 会丢弃其注释，因为 JSON 没有相应的语法。转换回 YAML 并不能恢复它们。
+ 在模板工作室中，对于大小超过 51,200 字节（50 KiB）的草稿，目前无法进行 CloudFormation 验证。当前的“验证”操作通过 `TemplateBody` 参数发送草稿，该参数存在此项限制。这并非模板的整体大小限制。您仍然可以保存该模板并将其用于堆栈操作，但需受 CloudFormation 配额限制。有关更多信息，请参阅[验证模板](#template-studio-validate)。
+ 保存操作会将模板写入您账户中的存储桶，因此您所保存的模板将按照标准的 Amazon S3 费率计费。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。
+ 仅当画布以**画布**或**两者**视图显示时，您才能下载资源示意图。

## 模板工作室所需的权限
<a name="template-studio-permissions"></a>

您所需的权限取决于模板来源以及您所执行的操作：

`cloudformation:GetTemplate`  
打开现有堆栈的模板时需要。授予对您想要编辑其模板的堆栈的访问权限。

`s3:GetObject`  
使用您的凭证从 Amazon S3 读取模板时需要。授予对源模板对象的访问权限。预签名 URL 使用该 URL 中包含的授权信息。

`cloudformation:ValidateTemplate`  
选择**验证**时需要。

`s3:PutObject`  
保存模板时需要。例如，将此权限的范围限定为目标存储桶中的对象 `arn:aws:s3:::{{destination-bucket}}/*`，而不是所有资源。

`s3:CreateBucket`  
仅在控制台创建缺失的目标存储桶时才需要。这可以是控制台管理的存储桶，也可以是您指定的存储桶名称。重复使用现有存储桶无需此权限。

`s3:ListBucket`  
当保存至您指定的现有存储桶时需要。模板工作室在上传前会使用 `HeadBucket` 来验证访问权限、预期的存储桶所有者以及存储桶 AWS 区域。  
对于控制台管理的存储桶，此权限是可选的。若没有它，保存对话框仍会显示存储桶名称。保存需要 `s3:PutObject`，如果必须创建存储桶，则需要 `s3:CreateBucket`。

## 打开模板工作室
<a name="template-studio-open"></a>

打开模板工作室的位置决定了模板工作室的打开方式以及保存后会发生什么。

**启动新模板**

1. 打开 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您想要部署的 AWS 区域。

1. 在导航窗格中，选择**模板工作室**。

**在创建堆栈时构建模板**

1. 在**创建堆栈**页面上，选择**使用模板工作室构建**。

1. 构建模板，然后选择**保存并继续**。

1. 堆栈向导会继续使用您已保存的模板，因此您无需另行上传。

**编辑现有堆栈的模板**

1. 在**堆栈**页面上，选择堆栈的名称。

1. 既可以直接更新堆栈，也可以创建更改集。

1. 在**准备模板**页面上，选择**在模板工作室中打开**。堆栈的当前模板随即打开。

1. 选择**保存并继续**即可返回至包含您所编辑模板的更新或更改集。

在控制台的其他位置，凡是显示模板的地方，您都可以选择**在模板工作室中打开**来处理该模板。

## 使用模板和示意图
<a name="template-studio-editor-and-canvas"></a>

模板工作室打开，模板和示意图并排显示。使用视图控件来选择屏幕上显示的内容：

** 模板** –   
仅模板，全宽显示。使用它来读取或写入没有示意图的模板。

**画布**。  
仅示意图，全宽显示。将其用于示意图需要全宽的大型模板。

**二者**  
模板与示意图并列显示。拖动两者之间的分隔线，即可为其中一侧留出更多空间。

示意图将相关资源归为一组，若某资源通过 `Ref`、`Fn::GetAtt`、`Fn::Sub` 或 `DependsOn` 引用了另一资源，示意图便会绘制相应的连接。未被任何其他资源引用的资源会单独显示，这使得人们能够轻松发现那些意外断开连接的资源。

**注意**  
例如，三个函数可以代入相同的 IAM 角色。示意图展示每个函数内部的角色，但模板仅声明一个角色。查看模板，了解其中存在多少资源。

## 在 YAML 和 JSON 之间进行转换
<a name="template-studio-format"></a>

您保存的格式决定了模板工作室写入 Amazon S3 的对象的文件名和内容类型。

**转换您正在编辑的模板**

1. 选择格式控件，它会显示您当前所处格式的名称。

1. 选择其他格式。

1. 将 YAML 转换为 JSON 时，系统会要求您进行确认，因为注释无法被保留。若要继续，请选择**转换**。

**重要**  
JSON 没有用于注释的语法。当您将包含注释的 YAML 模板转换为 JSON 时，这些注释会被移除，即便再将其转换回 YAML，这些注释也无法恢复。在转换之前，请将您想要保留的内容复制下来。

当模板无法读取时，格式控件不可用，因为没有足够完整的内容可以转换。请先修复模板。

## 键入时出现语法问题
<a name="template-studio-diagnostics"></a>

编辑器会在您编写模板时检查其语法，并为无法读取的内容加下划线，例如未封闭的方括号、放错位置的缩进或重复的键。将鼠标悬停在下划线上即可查看问题。如果某一行存在多个问题，这些问题会进行编号，以便您加以区分。

此操作仅检查模板的*语法*，而非其内容。编辑器无法获知存在哪些资源类型，也不了解这些资源类型所包含的属性；因此，即便模板的 YAML 格式完全正确，仍可能存在其他问题，这些问题只有 CloudFormation 才能识别。为此，请选择**验证**。

## 验证模板
<a name="template-studio-validate"></a>

在将模板用于堆栈操作之前，验证过程会通过编辑器检查模板的语法，并利用 CloudFormation 对模板进行核查。这两项检查均使用当前的草稿，包括您尚未保存的更改。即使 CloudFormation 检查通过，也无法覆盖编辑器所报告的语法错误。

**注意**  
模板工作室使用 `TemplateBody` 参数将草稿发送到 [`ValidateTemplate`](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ValidateTemplate.html) API。此参数的限制为 51,200 字节（50 KiB）。  
如果草稿超过此限制，模板工作室不会发送 CloudFormation 请求。CloudFormation 检查不可用，但这并不意味着模板无效。编辑器仍然可以报告语法错误。  
同一 API 通过 `TemplateURL` 支持最大 1 MB 的模板。模板工作室不会上传已编辑的草稿进行基于 URL 的验证。您可以将模板保存至 Amazon S3，并通过堆栈操作对其进行验证，但需受 CloudFormation 配额限制。

**验证您正在编辑的模板**

1. 选择**验证**。

1. 通过两项检查的模板被报告为**有效**。

1. 如果任一检查发现错误，请在验证消息中查看这些错误。编辑器错误包括行号和列号。请在编辑器中更正这些错误，然后再次进行验证。

## 将模板保存到 Amazon S3
<a name="template-studio-save"></a>

CloudFormation 会从 Amazon S3 读取用于堆栈操作的模板，因此，保存操作能让您的模板在控制台的其他部分中可用。

在保存的模板中，应使用动态引用来指向存储于 Secrets Manager 中的密钥或 Systems Manager Parameter Store 中的安全字符串，而非直接在模板内包含明文机密密钥。有关更多信息，请参阅 [使用动态引用获取存储在其他服务中的值](dynamic-references.md)。

**保存您正在编辑的模板**

1. 选择 **保存并继续**。

1. 检查目的地。默认情况下，模板将转到 CloudFormation 为当前 AWS 区域中上传的模板管理的 Amazon S3 存储桶。如果该存储桶尚不存在，CloudFormation 会在您保存时创建它，并将其重新用于您稍后保存的模板。

   1. 若要自行选择目的地，请选择**使用其他存储桶**并输入**存储桶名称**。如果存储桶尚不存在，则会创建该存储桶。

1. 选择**确认并继续**。

**注意**  
存储在 Amazon S3 中的模板将按照 Amazon S3 的标准费率计费（无论其存放在哪个存储桶中）。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

保存操作无需验证结果通过。若验证发现错误，模板工作室会要求您确认是否仍要保存。保存操作并不会修复这些错误；在将该模板用于堆栈操作之前，请先检查并更正这些错误。

## 复制或下载模板或示意图
<a name="template-studio-copy-download"></a>

选择**模板操作**以将模板或示意图从控制台中导出：

**复制模板**  
将编辑器中当前显示的模板复制到剪贴板。

**下载模板**  
将模板保存为文件，所用格式与您当前编辑时所用的格式一致。

**下载资源示意图**  
将示意图另存为 PNG 图像。由于图像是示意图的捕获，因此仅当示意图显示在屏幕上时才可用。