其他分享
首页 > 其他分享> > AWS 18 AWS_CloudFormation

AWS 18 AWS_CloudFormation

作者:互联网

作为代码的基础设施

•目前,我们已经做了大量的手工工作
•所有这些手工工作都很难复制:
•在另一个地区
•在另一个AWS账户中
•如果删除了所有内容,则在同一区域内

•如果我们所有的基础设施都是……代码,那不是很棒吗?
•该代码将被部署并创建/更新/删除我们的基础设施
--------------------------------------------------------------------------------------
什么是CloudFormation

•CloudFormation是概述AWS的一种声明性方式
基础设施,用于任何资源(大多数都受支持)。

•例如,在CloudFormation模板中,您可以说:
•我想要一个安全小组
•我想要两台使用此安全组的EC2机器
•我想要两个用于这些EC2机器的弹性IP
•我想要一个S3桶
•我想在这些机器前面安装一个负载平衡器(ELB)
•然后CloudFormation会以正确的顺序,通过您指定的确切配置

AWS云计算的好处(1/2)
•作为代码的基础设施
•无需手动创建资源,这非常有利于控制
•代码可以进行版本控制,例如使用git
•通过代码审查基础设施的变更
•成本
•堆栈中的每个资源都带有一个标识符,因此您可以很容易地看到你花了很多钱
•您可以使用CloudFormation模板估计资源的成本
•节约策略:在Dev中,您可以在下午5点和下午6点自动删除模板上午8点重新创建,安全

AWS云计算的好处(2/2)

•生产力
•能够在云端动态摧毁和重建基础设施
•为模板自动生成图表!
•声明式编程(无需考虑顺序和编排)

•关注点分离:为多个应用和多个层次创建多个堆栈。
ex:
•专有网络栈
•网络堆栈
•应用程序堆栈

•不要重新发明轮子
•利用网络上现有的模板!
•利用文档

--------------------------------------------------------------------------------------
云层形成的原理
•模板必须上传到S3中,然后在S3中引用云层形成
•要更新模板,我们不能编辑以前的模板。我们必须向AWS重新发布新版本的模板
•堆栈由名称标识
•删除堆栈会删除CloudFormation创建的每个工件。

部署云信息模板
•手动方式:
•在CloudFormation Designer中编辑模板
•使用控制台输入参数等
•自动化方式:
•在YAML文件中编辑模板
•使用AWS CLI(命令行界面)部署模板
•当您完全想要自动化流程时,推荐的方法

云形成积木 CloudFormation Building Blocks
模板组件(每个模块一个课程部分):
1.资源:模板中声明的AWS资源(必需)
2.参数:模板的动态输入
3.映射:模板的静态变量
4.输出:对已创建内容的引用
5.条件:执行资源创建的条件列表
6.元数据

模板帮助程序:
1.参考文献
2.功能


注:
这是云形成的介绍
•正确学习和掌握云信息可能需要3个多小时
•本节旨在让你对其工作原理有一个很好的了解
•与其他部分相比,我们的实际操作会稍微少一些
•我们将学习回答考试问题所需的一切
•考试不要求你实际写作
•考试要求你理解如何阅读

--------------------------------------------------------------------------------------

介绍性例子
•我们将创建一个简单的EC2实例。
•然后我们将创建一个弹性IP
•我们将向其中添加两个安全组
•现在,忘掉代码语法吧。
•稍后我们将查看文件的结构
•我们将很快了解如何开始云形成!
--------------------------------------------------------------------------------------

YAML Crash Course
•YAML和JSON是可以用于CloudFormation的语言。
•JSON对CF来说太可怕了
•YAML在很多方面都很棒
•让我们了解一下!
•键值对
•嵌套对象
•支持数组(小减号)
•多行字符串
•可以包含评论!

什么是资源?
•资源是云信息模板的核心(必选)
•它们代表将要创建和安装的不同AWS组件配置
•资源已声明,可以相互引用

•AWS为我们计算资源的创建、更新和删除
•有超过224种资源(!)
•资源类型标识符的形式如下:
AWS::aws-product-name::data-type-name

我该怎么找到资源文件?
•我不能教你所有的224种资源,但我可以教你如何学习如何使用它们。
•所有资源都可以在这里找到:
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html
•然后,我们只需阅读文档
•此处的示例(针对EC2实例):
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html

云形成模板分析
•回到介绍部分的示例,让我们了解为什么是这样写的。
•相关文件可在此处找到:
• http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/awsproperties-ec2-instance.html
• http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/awsproperties-ec2-security-group.html
• http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/awsproperties-ec2-eip.html

资源常见问题解答

•我可以创建动态的资源量吗?
Ø不,你不能CloudFormation模板中的所有内容都必须声明。你不能在那里执行代码生成
•是否支持所有AWS服务?
几乎。只有少数几个利基市场尚未出现
Ø您可以使用AWS Lambda定制资源解决这个问题
--------------------------------------------------------------------------------------
什么是参数?
•参数是向AWS CloudFormation提供输入的一种方式样板

•如果:
•您希望在整个公司重复使用模板
•某些输入无法提前确定
•参数非常强大、可控,可以防止错误
感谢类型,避免在模板中发生。

什么时候应该使用参数?
•问问自己:
•这种云信息资源配置在未来可能会发生变化吗?
•如果是,将其作为一个参数。
•您无需重新上传模板即可更改其内容

参数设置
所有这些设置都可以控制参数:
Type:
• String
• Number
• CommaDelimitedList
• List<Type>
• AWS Parameter (to help catch invalid values – match against existing values in the AWS Account)
• Description
• Constraints
• ConstraintDescription (String)
• Min/MaxLength
• Min/MaxValue
• Defaults
• AllowedValues (array)
• AllowedPattern (regexp)
• NoEcho (Boolean

如何引用参数
•可以利用Fn::Ref函数来引用参数
•参数可以在模板中的任何位置使用。
•YAML中的简写是!Ref
•该功能还可以引用模板中的其他元素

概念:伪参数 Pseudo Parameters
•AWS在任何云信息模板中为我们提供伪参数。
•可随时使用,默认情况下启用

AWS::AccountId 1234567890
AWS::NotificationARNs
[arn:aws:sns:us-east-
1:123456789012:MyTopic]
AWS::NoValue Does not return a value.
AWS::Region us-east-2
AWS::StackId
arn:aws:cloudformation:us-east-
1:123456789012:stack/MyStack/1c2fa62
0-982a-11e3-aff7-50e2416294e0
AWS::StackName
MyStack

--------------------------------------------------------------------------------------

什么是映射?
•映射是CloudFormation模板中的固定变量。
•它们非常便于区分不同的环境
(开发vs产品)、地区(AWS地区)、AMI类型等
•所有值都在模板中硬编码

何时使用映射与参数?
•当您提前知道所有可能的值时,映射是非常好的
它们可以从变量中推导出来,比如
•区域
•可用区
•AWS账户
•环境(开发与产品)
•等等…
•它们允许对模板进行更安全的控制。
•当值确实是特定于用户时,使用参数

n::FindInMap
访问映射值
• 我们使用 Fn::FindInMap 从特定键返回命名值
• !FindInMap [ MapName, TopLevelKey, SecondLevelKey ]

访问映射值
•我们使用Fn::FindInMap从特定键返回命名值
• !FindInMap[MapName,TopLevelKey,SecondLevelKey]

--------------------------------------------------------------------------------------

什么是产出?
•输出部分声明我们可以导入其他堆栈的可选输出值(如果您先导出它们)!
•您还可以在AWS控制台或使用AWS CLI查看输出
•它们非常有用,例如,如果您定义网络云信息,以及输出VPC ID和子网ID等变量
•这是执行跨堆栈协作的最佳方式,正如您所希望的那样处理堆栈中自己的部分
•如果另一个云层引用了CloudFormation堆栈的输出,则无法删除该堆栈

输出示例
•作为一个模板的一部分创建SSH安全组
•我们创建一个引用该安全组的输出

交叉堆栈引用
•我们利用该安全组创建第二个模板
•为此,我们使用Fn::ImportValue函数
•在删除所有引用之前,无法删除基础堆栈

--------------------------------------------------------------------------------------

conditions used for?是什么?
•条件用于控制资源或输出的创建基于一个条件。
•条件可以是你想要的任何东西,但一般的条件
是:
•环境(开发/测试/产品)
•AWS地区
•任何参数值
•每个条件可以参考另一个条件、参数值或映射

逻辑ID由您选择。这是你命名条件的方式
•内在功能(逻辑)可以是以下任何一种:
• Fn::And
• Fn::Equals
• Fn::If
• Fn::Not
• Fn::Or

条件可应用于资源/输出等…
--------------------------------------------------------------------------------------

云层形成
必须知道内在功能

• Ref
• Fn::GetAtt
• Fn::FindInMap
• Fn::ImportValue
• Fn::Join
• Fn::Sub
• Condition Functions (Fn::If, Fn::Not, Fn::Equals, etc…)

Fn::Ref
•Fn::Ref函数可用于引用
•Parameters=>返回参数的值
•Resources=>返回基础资源的物理ID(例如:EC2 ID)
•YAML中的简写是!Ref

Fn::GetAtt
•属性附加到您创建的任何资源
•要了解资源的属性,最好的方法看文档。
•例如: the AZ of an EC2 machine

Fn::FindInMap
访问映射值
•我们使用Fn::FindInMap从特定键返回命名值
• !FindInMap[MapName,TopLevelKey,SecondLevelKey]

Fn::ImportValue
•导入在其他模板中导出的值
•为此,我们使用Fn::ImportValue函数

Fn::Join
•使用分隔符连接值
•这会产生“a:b:c

Fn::Sub
•Fn::Sub,或!Sub作为简写,用于替换文本这是一个非常方便的功能,可以让你完全自定义模板。
•例如,您可以将Fn::Sub与引用或AWS Pseudo组合变量!
•String必须包含${VariableName}并将替换它们

Condition Functions
•逻辑ID由您选择。这是你命名条件的方式
•内在功能(逻辑)可以是以下任何一种:
• Fn::And
• Fn::Equals
• Fn::If
• Fn::Not
• Fn::Or

--------------------------------------------------------------------------------------

云形成回滚
•堆栈创建失败:
•默认设置:所有内容都会回滚(被删除)。我们可以看看日志
•禁用回滚并排除故障的选项

•堆栈更新失败:
•堆栈自动回滚到之前已知的工作状态
•能够在日志中查看发生的情况和错误消息
--------------------------------------------------------------------------------------

变更集 ChangeSets
•当你更新一个堆栈时,你需要知道它之前发生了什么变化
这会让你更加自信
•变更集不会说明更新是否成功

嵌套堆栈 Nested stacks
•嵌套堆栈Nested stacks是其他堆栈的一部分
•它们可以让你在工作中隔离重复的模式/常见组件
将堆栈分开,并从其他堆栈中调用它们
•例如:
•可重复使用的负载平衡器配置
•重复使用的安全组
•嵌套堆栈被认为是最佳实践
•要更新嵌套堆栈,请始终更新父堆栈(根堆栈)

CloudFormation–交叉堆叠与嵌套堆叠
•交叉堆叠
•当堆栈具有不同的生命周期时很有用
•使用输出导出和Fn::ImportValue
•当您需要将导出值传递到多个堆栈时(VPC Id等)

•嵌套堆栈
•当部件必须重复使用时有帮助
•示例:重复使用如何正确配置应用程序负载平衡器
•嵌套堆栈仅对更高级别的堆栈重要(不共享)

云形成-堆栈集
•通过单个操作跨多个帐户和地区创建、更新或删除堆栈
•创建堆栈集的管理员帐户
•可从堆栈集中创建、更新和删除堆栈实例的受信任帐户
•更新堆栈集时,所有关联的堆栈实例在所有客户和地区更新。

--------------------------------------------------------------------------------------


云层漂移
•CloudFormation允许您创建基础设施
•但它不能保护您免受手动配置更改的影响
•我们如何知道我们的资源是否已经流失?
•我们可以使用云层漂移!

•尚未支持所有资源:
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html

--------------------------------------------------------------------------------------

标签:18,AWS,CloudFormation,----------------------------------------------------------
来源: https://www.cnblogs.com/ives-xu/p/16133461.html