AWS CloudFormation (AWS CloudFormation)
它是一项服务,允许我们自动建模和配置所需的AWS资源。可以使用模板来实现这一目的。这个模板基本上是用JSON或YAML格式编写的。AWS CloudFormation会根据模板描述的内容来实施资源的配置和管理。我们可以成组配置和管理一组资源,而无需单独创建这些资源。多个资源的配置由AWS CloudFormation处理。AWS CloudFormation的两个关键组件是:
- 模板 (Template)
- 栈 (Stack)
模板可以用扩展名为.json、.yaml、.template或.txt的JSON或YAML格式编写。通过这个模板,我们可以创建和管理称为栈的一组AWS资源。我们可以通过创建、更新和删除栈来创建、更新和删除一组资源。栈中的资源由相应的模板定义。
配置S3桶 (Provisioning an S3 Bucket)
我们现在将使用最简单版本的模板来创建一个名为‘cloudformationbucket’的S3桶。我们需要在CloudFormation中创建一个新栈时上传此模板。模板可以包含多个参数,包括(但不限于):AWSTemplateFormatVersion、Description、Metadata、Parameters、Mappings、Conditions、Resources、Outputs、Type。下面的JSON示例仅使用了‘Resources’、‘Type’和‘DeletionPolicy’。‘DeletionPolicy’属性允许删除桶。
{"Resources": {"cloudformationbucket" : {"Type": "AWS::S3::Bucket","DeletionPolicy": "Delete" }}
}
我们将这个脚本保存到一个名为first_template.txt的文本文件中。此文本文件将作为模板使用。将此模板文件上传到S3桶并复制URL。现在我们将按照以下步骤操作:
- 从AWS管理控制台打开CloudFormation控制台,搜索相应术语。在CloudFormation控制台中,点击右上角的‘Create Stack’按钮。选择‘With new resources (Standard)’选项。
- 在下一个屏幕中,为Prepare template选择‘Template is ready’,因为我们已经在文本文件中准备好了JSON规范。然后选择‘Amazon S3 URL’作为模板来源。然后添加复制的URL。点击‘Next’。
- 在下一个屏幕中,给桶名作为‘Stack name’,例如“create-s3-bucket-stack”。点击‘Next’。
- 在‘Configure stack option’屏幕中,保持所有内容不变。特别是,“Stack failure options”应为“Roll back all stack resources”。
- 点击“Next”将进入审核页面。在审核页面中,点击‘Create stack’。一个新栈现在将出现在CloudFormation仪表板中。这可能需要几分钟。该模板将创建两个新的S3桶:一个是模板中指定的;另一个是用于存储模板本身的。我们可以‘更新’和‘删除’这个栈。
你现在可以在S3控制台中查看新创建的桶。桶的名称将包含我们在模板中指定的“cloudformationbucket”字样。桶名将类似于:“create-s3-bucket-stack-cloudformationbucket-1s27nvodenpa3”。这是因为我们在模板中指定的名称(即“cloudformationbucket”)是“逻辑名”,而不是“物理名”。
现在按照相同的步骤使用附加的first_template.txt。记住,任何模板必须至少包含一个资源。
手动更新模板 (Updating Template Manually)
在上一节中,我们看到了如何使用CloudFormation创建一个桶。让我们分析下面的模板。模板中有一个逻辑名为“S3Bucket”的资源(已突出显示)。除此之外,下面的模板包含资源类型(S3桶)、删除策略(当前禁用)和属性。目前提供的一个属性是桶的web资源(索引文件和错误文件)。
{ "Resources": {"cloudformationbucket": {"Type": "AWS::S3::Bucket","DeletionPolicy": "Delete","Properties": {"WebsiteConfiguration": {"IndexDocument": "index.html", "ErrorDocument": "error.html"}}}}
}
这是额外的信息,我们需要更新现有的模板。栈模板可以通过两种方式更新 -(1)手动,(2)使用变更集。
在手动更新中,可以打开模板并在设计器中更改,保存到本地(或S3)。变更集允许更改现有模板并‘创建栈’。一旦变更集完成,我们可以‘执行’变更集,变更将生效。请参阅以下链接以获取详细信息。
步骤1 - 手动修改和保存栈模板 (Step 1 - Modifying and saving stack template manually)
让我们对现有模板进行一个简单的更改,更改桶的名称。请参考此链接以获取详细信息:
Modifying a stack template - AWS CloudFormation
更改桶的逻辑名相当于删除当前桶并使用新桶名创建一个新桶。
从列表中点击栈。然后点击‘Template’选项卡。然后点击‘View in Designer’按钮。我们将看到如下页面。
在设计器视图中,我们可以对模板进行必要的更改,验证它(重要步骤),并使用‘Save’选项将其保存(本地或S3)。在此示例中,我们只是将桶名称更改为‘cf-bucket’。请注意,当前模板尚未修改,这个保存的模板将用于稍后更新当前模板。
现在我们将添加一些额外的代码来更改删除策略和桶的名称。你需要确保(物理)桶名不存在,否则你将收到更新错误。我们需要添加的额外代码如下所示。你可以使用你自己的SCU用户名进行测试。
"Properties": {"WebsiteConfiguration": {"IndexDocument": "index.html", "ErrorDocument": "error.html"}}
它在模板设计器中的样子如下。
然后我们通过点击设计器页面顶部栏的“Validate template”按钮验证模板。
我们进入文件菜单并点击“Save”。将模板保存为“second_template.txt”。然后将此模板上传到我们的S3桶并复制URL。
步骤2 - 使用新模板更新栈 (Step 2 – Update the stack with the new template)
选择栈并点击‘Update’。然后用保存的模板文件(从步骤1)替换模板。按照下面的屏幕步骤操作。点击‘Next’和‘Update stack’按钮。它需要几分钟,然后刷新你的浏览器。在S3中查看桶名是否已更改。
点击“Next”进行接下来的几个审核页面,最后点击页面底部的“Update stack”按钮。它将更新栈。
我们的S3桶名称将被更改。
你可以使用second_template.txt进行测试,但在尝试之前更改物理桶名(使用唯一名称),否则你将收到更新错误,提示“bucket already exists”。
使用变更集更新模板 (Updating Template using Change Set)
可以使用变更集更新栈,在这种情况下,我们使用变更集替换模板而不是立即更新它。我们可以安排变更集在以后执行。
Updating stacks using change sets - AWS CloudFormation
我们将做一个简单的练习,我们将再次更改桶名,使用以下模板,third_template.txt。此模板应上传到S3桶并复制URL。
{ "Resources": {"cloudformationbucket": {"Type": "AWS::S3::Bucket","DeletionPolicy": "Delete","Properties": {"WebsiteConfiguration": {"IndexDocument": "index.html", "ErrorDocument": "invalid.html"}}}}
}
-
点击栈并从“Stack actions”列表中选择“Create change set for current stack”。
-
在下一页中选择“Replace the template”并提供上传模板的URL。
-
点击几次以审查变更集,在最终页面点击“Create change set”按钮。
-
弹出一个对话框,可以为变更集提供一个名称,最后点击“Create change set”按钮。一旦创建,变更集将如下所示。
-
现在我们可以选择刚刚创建的变更集并点击“Execute”按钮。弹出一个关于回滚的提示,保持默认选项。点击“Execute change set”按钮。