56-AWS CloudFormation

Hello大家好,欢迎来到《AWS解决方案架构师认证 Professional(SAP)中文视频培训课程》,我们今天的课时讨论AWS CloudFormation的内容。

CloudFormation是AWS的一个服务,借助CloudFormation,您可以创建一个描述您所需的所有AWS资源的模板,如EC2实例、VPC等等,然后CloudFormation负责为您完成创建和配置这些资源。

想要熟练使用CloudFormation需要大量的时间学习和实践,对于解决方案架构师认证考试,我们只需要了解CloudFormation是如何工作的,以及它提供的一些重要功能/特性,这也是我们这个课时讨论的侧重点。

CloudFormation,是AWS的基础架构即代码服务。可以理解成CloudFormation是管理云资源的服务,我们可以通过代码或者称为模板来创建和配置云资源。

通过将基础架构编写成代码的方式,您可以跨多个AWS账户,跨多个AWS区域,快速的部署或者复用您的基础架构,创建和配置AWS资源。

CloudFormation的优势概括起来主要有3点:

  1. 简化基础设施管理
  2. 快速复制基础设施
  3. 轻松控制和跟踪基础设施层的变更

CloudFormation是一个较底层的服务,AWS的很多服务的执行都依赖于它,比如Elastic Beanstalk、Service Catalog以及无服务器应用模型框架等。

总得来说,如果您是开发人员,Sysops或者 Devops,CloudFormation是必须要掌握的服务;但对于架构师认证考试,我们只需要掌握CloudFormation的一些考点和功能即可,所以我们继续吧。

CloudFormation & ASG

我们先讨论下使用CloudFormation创建和配置AutoScaling组的一些重点内容。

首先我们要了解,当使用CloudFormation创建一个AutoScaling组时,CloudFormation只管理AutoScaling组的配置,它不负责管理组内的EC2实例,因为这些实例是通过AutoScaling组创建的。

您可以在CloudFormation模板中配置AutoScaling组的CreationPolicy 属性,定义收到成功信号的数量,这是什么意思呢,在创建堆栈时,AutoScaling组启动EC2实例,只有CloudFormation收到成功信号的数量达到配置的数量时,CloudFormation才将资源状态设置为“创建成功”,才会继续创建堆栈,这是通过CreationPolicy 属性来配置的。

如果想要通过CloudFormation更新AutoScaling组的EC2实例,需要创建并在CloudFormation模板中指定启动模板或启动配置,然后更新到该AutoScaling组;可以通过配置UpdatePolicy 属性,来定义AutoScaling组EC2实例的更新策略,也就是告诉AutoScaling如何进行EC2实例的更新,比如实例是滚动更新还是一次性更新等等。这是通过UpdatePolicy 属性来配置的。

我们举个例子,

有一个由CloudFormation管理的AutoScaling组,AutoScaling组中有2个实例-A1。
假设我们现在要更新AutoScaling组的EC2实例,首先,要创建一个启动模板或者启动配置,然后配置CloudFormation模板指定要使用启动模板或启动配置,以及配置UpdatePolicy。然后应用模板后,CloudFormation就会使用新的启动模板或配置,按照UpdatePolicy中指定的策略更新EC2实例,比如创建2个新的EC2实例,然后一切正常的话,AutoScaling组会删除之前的两个A1实例完成更新。

好的,以上是使用CloudFormation创建和配置AutoScaling组的一些重点内容,涉及到了CreationPolicy 属性 和 UpdatePolicy 属性的内容。

删除堆栈时保存数据

接下来我们讨论当CloudFormation堆栈删除时,如何保存/备份数据。

默认情况下,当删除堆栈时,CloudFormation将删除该资源并删除所有数据;而在有些场景下,我们希望在删除堆栈时,保留资源。在这个时候,就可以利用 DeletionPolicy 属性,您可以为要控制的每个资源指定 DeletionPolicy 属性,在某个资源的堆栈被删除时保留或 (在某些情况下) 备份该资源。

DeletionPolicy可以指定3个配置选项,我们一起来看一下:

首先,DeletionPolicy:Retain,可以向任何资源类型添加此删除策略。将DeletionPolicy:配置为Retain,这样的话CloudFormation 在其堆栈被删除时就会保留资源,而不删除资源或其内容。

所以,需要在删除堆栈时保留资源或数据就需要将DeletionPolicy配置为Retain。

第二个选项,DeletionPolicy:Snapshot ,也就是在删除资源前做个快照,这个配置只支持较少的资源。配置为Snapshot顾名思义就是在删除资源之前会为其创建快照,所以只有支持快照的资源才可以使用这个配置,比如:EC2的EBS卷、ElastiCache、RDS DBCluster、RDS DBInstance 以及Redshift Cluster等所有支持快照的资源,一般都支持配置为DeletionPolicy:Snapshot 。

最后一个选项,DeletionPolicy:Delete ,在堆栈删除过程中,AWS CloudFormation 将删除资源及其所有内容(如果适用)默认情况下,如果不指定 DeletionPolicy,AWS CloudFormation 将删除您的资源及数据。

但是有一些例外:

  • 对于 AWS::RDS::DBCluster 资源,默认策略是 Snapshot。
  • 对于 Amazon S3 存储桶,您必须删除存储桶中的所有对象才能成功完成删除。

从考试的角度来讲,要牢记,可以通过配置资源的DeletionPolicy属性,来控制当删除CloudFormation堆栈时资源和数据是否/如何保留。

CloudFormation & IAM

好的,接下来是CloudFormation执行的权限的内容。

当我们在创建/部署CloudFormation堆栈时,默认情况下,创建资源的权限和您使用的IAM用户的权限一致。IAM用户的权限决定了是否有创建资源的权限。也就是说假设您使用的IAM用户有创建RDS数据库的权限,那么当您部署CloudFormation堆栈时就会允许创建RDS数据库。

或者还有一种方式,是在创建堆栈时,通过指定CloudFormation服务角色,允许 AWS CloudFormation 代表您调用堆栈中的资源。通过分配角色权限,比如创建RDS权限,来控制CloudFormation执行操作的权限。

所以,当部署CloudFormation堆栈时,分配允许执行的权限有两个选择:
1、使用您的IAM用户的自身的权限
2、指定CloudFormation服务角色,然后分配角色权限,CloudFormation创建堆栈使用该角色的权限。

另外还有一点要注意,如果您想要通过CloudFormation创建IAM资源,如:创建IAM用户、IAM策略、IAM组等,需要显式确认模板可创建IAM资源。使用控制台时通过创建时勾选确认;使用CLI通过指定 –capabilities 参数的 CAPABILITY_IAM 或 CAPABILITY_NAMED_IAM。

显式确认的目的是提醒我们正在通过CloudFormation创建IAM资源,可能会通过模板给与高权限,需要仔细确认。

CloudFormation 自定义资源(Lambda)

CloudFormation可以使用Lambda自定义资源,扩展您的CloudFormation。
那什么情况下使用自定义资源呢?比如:

  1. CloudFormation还没有支持的资源,如AWS新发布的服务。
  2. 想通过CloudFormation管理非AWS资源,比如您本地数据中心的资源。
  3. 或者执行一些和基础设施无关的动作,比如在删除前清空S3存储桶所有对象,或者实现创建堆栈期间动态查找AMI ID等等。
  4. 以及自定义资源可以执行任何你想做的实现。

整个逻辑是这样的,我们梳理一下:

Lambda函数需要做什么,实现什么功能,这些逻辑是您负责实现的;然后将 Lambda 函数与自定义资源关联,则在CloudFormation创建、更新或删除自定义资源时就会调用该函数,执行您在函数中实现的逻辑,比如在本地数据中心创建资源等等。总的来说,你想实现一些目前CloudFormation没有很好支持的功能,就可以考虑通过自定义资源的方式。

CloudFormation的跨堆栈引用 与 嵌套堆栈

我们继续,CloudFormation的跨堆栈引用 与 嵌套堆栈。

要将资源输出从一个 AWS CloudFormation 堆栈导出到另一个堆栈,可以创建跨堆栈引用。

利用跨堆栈引用,您可以使用分层架构或面向服务的架构。可以在单独的堆栈中创建相关的 AWS 资源,然后将资源输出并在其他堆栈中引用,而不是在单个堆栈中包含所有资源;

例如,我们可以单独创建一个包括VPC、安全组和子网等资源的网络堆栈,然后将这些网络资源的值都进行输出,比如子网ID、安全组ID等等;然后单独创建一个Web 应用程序堆栈,引用前面创建的网络堆栈的输出创建堆栈资源,比如EC2实例等待

要创建跨堆栈引用,可使用 Export 输出字段标记要导出的资源输出的值。然后,使用 Fn::ImportValue 内部函数在其他堆栈导入该值。

采用创建多个堆栈分层管理架构,尤其是在组织中有很多堆栈时,这么做对于堆栈的操作会更加的灵活。

比如前面的例子,创建单独的网络堆栈,负责创建网络资源,输出子网、安全组ID等值;然后您的组织中的多个其他的堆栈,如应用程序堆栈,都可以直接导入这些值来创建应用程序资源,如EC2实例等。跨堆栈引用这种方式是AWS建议的最佳实践。

然后嵌套堆栈。

随着组织的发展,基础设施可能会越来越多,这样就可能会出现相同的资源在多个CloudFormation模板中都存在。

比如,同一个负载均衡器可能存在于多个模板中,您可以分离这些常见资源并为其创建专用模板,比如创建一个单独的负载均衡器模板,其他模板中的资源来引用此模板,也就是创建嵌套堆栈。

这样做有什么好处呢? 如果更新这个负载均衡器模板,引用该模板的任何堆栈将使用更新过的负载均衡器 (仅当您更新该堆栈后)。

举个例子,假如我们现在的应用程序堆栈是采用的嵌套堆栈,引用了单独创建的RDS和ELB堆栈模板;这样的话如果我们需要创建应用程序V2堆栈,需要使用相同的RDS和ELB资源,就可以直接引用RDS和ELB堆栈模板。而不是将RDS和ELB资源在每个需要的模板中都复制/粘贴一遍。

好的,以上是跨堆栈引用 和 嵌套堆栈的内容,总结一下,跨堆栈引用是多个堆栈都可以引用单个堆栈输出的资源,比如安全组ID;而嵌套堆栈,可以理解成类似于独立的模块,可以在多个堆栈中多次进行引用。

CloudFormation其他

好的,本课时的最后,来看一下在认证考试中可能会出现的CloudFormation的一些其他知识点。

首先是CloudFormer,CloudFormer 是一种模板创建工具,可从您的账户中的现有 AWS 资源创建 AWS CloudFormation 模板,比如您手动创建了一个EC2和安全组,您想生成一个包括这些资源的CloudFormation模板,那么就可以使用CloudFormer。

ChangeSets,更改集,当您需要更新堆栈时,在实施之前可以通过更改集了解您的更改会如何影响正在运行的资源,当您确认更改是您预期的情况后,可以执行更改集,然后 CloudFormation 才会对您的堆栈进行更改。

StackSets,堆栈集,使用堆栈集可以跨多个AWS账户和区域创建、更新或删除堆栈。如果您的组织是多账户环境,需要跨多个AWS账户和区域部署堆栈的话,堆栈集功能就会非常有帮助。

最后堆栈策略,使用堆栈策略可以防止堆栈资源在堆栈更新过程中被意外更新或删除。
堆栈策略是一个 JSON 文档,该文档定义可对指定资源执行的更新操作。比如您有一个RDS数据库存储重要的数据,那么您可以配置一个堆栈策略,保护你的RDS数据库。防止堆栈更新过程中您的RDS被意外更新或删除。

好的,这节课我们讨论了CloudFormation相关的内容,希望能够给大家带来帮助。

希望此系列教程能为您通过 AWS解决方案架构师认证 Professional 认证考试带来帮助,如您有任何疑问,请联系我们:

  • 如果您想获取本课程全部课时,请扫PPT的二维码加入。
  • AWS爱好者的网址是www.iloveaws.cn,认证视频课程,免费的认证考试仿真题以及认证课程文章,都可以在网站找得到
  • 可以通过扫码加入【AWS爱好者】微信公众号,查看原创的AWS知识点相关文章。
  • 加入【AWS爱好者】微信群,和其他同学一起备考,以及探讨交流AWS相关知识。

我们今天的视频课程就到这里,感谢大家的观看,我们下一课程再见。

2022年4月12日

0 responses on "56-AWS CloudFormation"

Leave a Message

Setup Menus in Admin Panel

error: Content is protected !!