Tag: AWS CloudFormation


使用 AWS CloudFormation StackSets 跨多个 AWS 账户和区域配置资源

AWS CloudFormation 可帮助 AWS 客户实施基础设施即代码模型。客户现在无需手动设置自己的环境和应用程序,他们可以生成一个模板,然后使用它来创建所有必需的资源 (统称为 CloudFormation 堆栈)。此模型彻底消除了人工错误的可能,提高了效率,能够确保始终一致的配置。

今天,我准备为大家介绍一个让 CloudFormation 变得更加有用的新功能。此功能可帮助您应对在包含多个 AWS 账户和/或 AWS 区域的情况下使用基础架构即代码时的挑战。快速回顾:

账户 – 正如前面提到的那样,很多组织使用大量的 AWS 账户,通常用 AWS Organizations 将这些账户组织为分层结构,分组为不同的组织部门 (OU) (阅读 AWS Organizations – 基于策略的多 AWS 账户管理了解更多信息)。我们的客户使用多个账户满足业务部门、应用程序和开发人员所需。他们通常为每一个应用程序的开发、测试、生产前调试及生产阶段创建不同的账户。

区域 – 客户也可以充分利用数量众多 (一直在增长) 的 AWS 区域。他们构建跨越两个或更多区域的全球应用程序,实施精巧的多区域灾难恢复模型,实时复制 S3AuroraPostgreSQLMySQL 数据,为依据国家和地区法规存储和处理敏感数据选择位置。

多账户和多区域的扩展对管理和一致性带来了新的挑战。客户告诉我们,他们希望确保每一个新账户都按照其内部标准进行设置。首先他们需要一致、可靠地设置 IAM 用户和角色、VPC 和 VPC 子网、安全组、配置规则、日志记录和 AWS Lambda 函数。

介绍 StackSet
为了满足这些重要的客户需求,我们今天推出 CloudFormation StackSet。现在通过几次单击操作,即可在 CloudFormation 模板中定义 AWS 资源配置,然后跨多个 AWS 账户和/或区域进行部署。您可以用它来设置 AWS 功能的基准水平,以满足上述跨账户和跨区域情形的需要。设置之后,可将覆盖范围轻松扩展到更多的账户和区域。

该功能始终只适用于多账户情形。管理员账户 拥有一个或多个 StackSet,用于控制对一个或多个目标账户 的部署。管理员账户必须包含一个可担任的 IAM 角色,目标账户必须信任管理员账户。要了解具体的操作方法,请阅读 StackSet 文档中的先决条件

每个 StackSet 都引用一个 CloudFormation 模板,它包含一系列账户和区域。所有操作都适用于 StackSet 中账户和区域的叉积。如果 StackSet 引用三个账户 (A1、A2 和 A3) 和四个区域 (R1、R2、R3 和 R4),则有 12 个目标:

  • 区域 R1:账户 A1、A2 和 A3。
  • 区域 R2:账户 A1、A2 和 A3。
  • 区域 R3:账户 A1、A2 和 A3。
  • 区域 R4:账户 A1、A2 和 A3。

部署模板按账户/区域对启动 CloudFormation 堆栈的创建。模板按顺序部署到区域 (您控制顺序),再部署到区域中的多个账户 (您控制并行量)。您可以设置错误阈值,以便在堆栈创建失败时终止部署。

您可以使用现有 CloudFormation 模板 (注意确保它们已准备好跨账户和区域工作)、创建新模板,或使用我们提供的示例模板。我们还要发布对 AWS 分区 (除了中国的几个区域外的其他所有公共区域) 的支持,希望不久将扩展到其他区域。

使用 StackSet
您可以从 CloudFormation 控制台、通过 CloudFormation API 或使用命令行创建和部署 StackSet。

如果使用控制台,首先单击 Create StackSet。我可以使用自己的模板,也可以使用一个示例模板。我使用最后一个示例 (添加配置规则加密卷):

单击 View template 了解模板及规则:

为 StackSet 提供名称。我选择的模板接受可选参数,可以现在输入:

接下来,选择账户和区域。我可以直接输入账号,引用 AWS 组织单元或上传一组账号:

我可以设置区域并控制部署顺序:

我还可以设置部署选项。完成后,单击 Next 继续:

我可以向 StackSet 添加标签。它们将应用于部署期间创建的 AWS 资源:

部署开始,我可以从控制台中跟踪状态:

我可以打开“Stacks”部分查看每个堆栈。开始时,每个堆栈的状态都是 OUTDATED,这表明模板尚未部署到堆栈;成功部署后,状态变为 CURRENT。如果无法删除某个堆栈,其状态将变为 INOPERABLE

初始部署完成后,可以单击 Manage StackSet 添加更多账户和/或区域来创建更多堆栈:

现在提供
这项新功能现已推出,您可以立即开始使用,无需额外费用 (只为您自己创建的 AWS 资源付费)。

Jeff

另外,如果您创建了一些有用的模板,愿与其他 AWS 用户分享,请向我们的 AWS 实验室 GitHub 存储库发送提交请求。

新增 – 面向 Amazon CloudWatch 控制面板的 API 和 CloudFormation 支持

我们在几年前发布了 CloudWatch 控制面板。在专为这次发布撰写的文章中,我介绍了如何以交互方式创建控制面板,以便以图形形式显示所选的 CloudWatch 指标。发布之后,我们增加了其他功能,包括全屏模式、深色主题、控制 Y 轴的范围、简化的重命名、持久性存储和新的可视化选项

新 API 和 CLI

虽然控制台支持非常有利于交互式使用,但许多客户要求我们提供对控制面板及其中小部件的编程式创建和操作的支持。这些客户想要动态构建和维护控制面板,从而在创建和销毁相应的 AWS 资源时添加和删除小部件。其他客户则希望在两个或多个 AWS 账户中设置和维护一组一致的控制面板。

我非常高兴地宣布,面向 CloudWatch 控制面板的 API、CLI 和 AWS CloudFormation 支持现已推出,您可以立即开始使用!

我们新增了四个 API 函数 (和等效的 CLI 命令):

ListDashboards / aws cloudwatch list-dashboards – 用于提取账户内所有控制面板的列表,或共享通用前缀的子集。

GetDashboard / aws cloudwatch get-dashboard – 用于提取单个控制面板的详细信息。

PutDashboard / aws cloudwatch put-dashboard – 用于创建新控制面板或更新现有控制面板。

DeleteDashboards / aws cloudwatch delete-dashboards – 用于删除一个或多个控制面板。

控制面板概念 我将要向您展示如何使用这些函数和命令。在转入正题之前,我应该介绍几个重要的控制面板概念和属性。

全局 – 控制面板是 AWS 账户的一部分,但未与特定 AWS 区域关联。每个账户最多可以包含 500 个控制面板。

命名 – 每个控制面板都有一个在 AWS 账户内唯一的名称。名称最长可达 255 个字符。

网格模式 – 每个控制面板都由网格单元格组成。网格包括 24 个单元格,高度可根据需要调整。控制面板中的每个小部件可位于一组特定的网格坐标上,大小可跨越一个整数的网格单元格。

小部件 (可视化) – 每个小部件可以显示文本或一组 CloudWatch 指标。文本通过 Markdown 指定;指标可以显示为单个值,或以折线图或堆积面积图的形式显示。每个控制面板最多可以包含 100 个小部件。显示指标的小部件还可以与 CloudWatch 警报相关联。控制面板有 JSON 表示形式,现在您可以在控制台中看到并编辑它。只需单击 Action 菜单并选择 View/edit source 即可:

下面是我的控制面板源:

您可以使用此 JSON 作为您自己的应用程序的起点。如您所见,控制面板中每个小部件的 widgets 数组中都有一个条目;每个条目描述一个小部件,从其类型、位置和大小开始。

使用 API 创建控制面板

假设我要在特定区域为我的每个 EC2 实例创建一个含有小部件的控制面板。我会使用 Python 和适用于 Python 的 AWS 软件开发工具包,然后按如下所示开始创建 (请原谅我的代码不够专业):

import boto3
import json

cw  = boto3.client("cloudwatch")
ec2 = boto3.client("ec2")

x, y          = [0, 0]
width, height = [3, 3]
max_width     = 12
widgets       = []

接着,我直接对实例进行迭代,以便为每个实例创建 widget 词典,并将其附加在 widgets 数组中:

instances = ec2.describe_instances()
for r in instances['Reservations']:
    for i in r['Instances']:

        widget = {'type'      : 'metric',
                  'x'         : x,
                  'y'         : y,
                  'height'    : height,
                  'width'     : width,
                  'properties': {'view'    : 'timeSeries',
                                 'stacked' : False,
                                 'metrics' : [['AWS/EC2', 'NetworkIn', 'InstanceId', i['InstanceId']],
                                              ['.',       'NetworkOut', '.',         '.']
                                             ],
                                 'period'  : 300,
                                 'stat'    : 'Average',
                                 'region'  : 'us-east-1',
                                 'title'   : i['InstanceId']
                                }
                 }

        widgets.append(widget)

我更新循环内的位置 (xy),并形成一个网格 (如果我不指定位置,则小部件会从左向右、从上至下进行排列):

        x += width
        if (x + width > max_width):
            x = 0
            y += height

处理完所有实例后,我创建一个 JSON 版本的小部件数组:

body   = {'widgets' : widgets}
body_j = json.dumps(body)

接下来,我创建或更新我的控制面板:

cw.put_dashboard(DashboardName = "EC2_Networking",
                 DashboardBody = body_j)

运行代码后,会获得以下控制面板:

CloudWatch 团队建议,以编程方式创建的控制面板应包括文本小部件 (用于说明控制面板是自动生成的) 以及指向所使用的源代码或 CloudFormation 模板的链接。这样可防止用户在外部对控制面板进行手动更改。如前所述,每个指标小部件还可以与一个 CloudWatch 警报相关联。您可以通过编程方式或使用 CloudFormation 模板来创建警报,如示例 CPU 使用率警报。如果您决定这样做,则警报阈值会显示在小部件中。要详细了解此操作,请阅读 Tara Walker 近期发布的文章 Amazon CloudWatch 发布了控制面板警报功能。更进一步的操作是,我可以使用 CloudWatch Events 和 Lamba 函数来跟踪某些资源的创建与删除,并在发生更改时更新控制面板。要了解如何执行此类操作,请阅读使用 AWS Lambda 让 CloudWatch 控制面板保持最新

使用 CLI 访问控制面板 我还可以通过命令行访问和操作我的控制面板。例如,我可以生成一个简单的列表:

$ aws cloudwatch list-dashboards --output table
----------------------------------------------
|               ListDashboards               |
+--------------------------------------------+
||             DashboardEntries             ||
|+-----------------+----------------+-------+|
||  DashboardName  | LastModified   | Size  ||
|+-----------------+----------------+-------+|
||  Disk-Metrics   |  1496405221.0  |  316  ||
||  EC2_Networking |  1498090434.0  |  2830 ||
||  Main-Metrics   |  1498085173.0  |  234  ||
|+-----------------+----------------+-------+|

然后,我删除 Disk-Metrics 控制面板:

$ aws cloudwatch delete-dashboards --dashboard-names Disk-Metrics

此外,也可以检索用于定义控制面板的 JSON:

使用 CloudFormation 创建控制面板

控制面板还可以在 CloudFormation 模板中进行指定。下面是一个简单的 YAML 格式的模板 ( DashboardBody 仍以 JSON 指定):

Resources:
  MyDashboard:
    Type: "AWS::CloudWatch::Dashboard"
    Properties:
      DashboardName: SampleDashboard
      DashboardBody: '{"widgets":[{"type":"text","x":0,"y":0,"width":6,"height":6,"properties":{"markdown":"Hi there from CloudFormation"}}]}'

我将模板放置在一个文件中,然后使用控制台或 CLI 创建堆栈:

$ aws cloudformation create-stack --stack-name MyDashboard --template-body file://dash.yaml
{
    "StackId": "arn:aws:cloudformation:us-east-1:xxxxxxxxxxxx:stack/MyDashboard/a2a3fb20-5708-11e7-8ffd-500c21311262"
}

下面是控制面板:

现已推出

此功能现已推出,您可以立即开始使用。您可以免费创建 3 个控制面板,每个控制面板最多包含 50 项指标;如果创建的控制面板超过 3 个,则每月需支付 3 USD (相关价格信息,请访问 CloudWatch 定价页面)。您每月最多可以免费调用 100 万次新 API 函数;如果超出此范围,则每调用 1000 次需支付 0.01 USD。

-Jeff

使用AWS Lambda和Amazon DynamoDB自动管理AWS CloudFormation模板中的Parameters和Mappings

背景介绍

相信AWS的用户对AWS CloudFormation都不会陌生。AWS CloudFormation是实现IAC(Infrastructure as Code)自动化运维的一项重要服务,可以帮助用户对 AWS资源进行建模和设置,以便能花较少的时间管理这些资源。CloudFormation中有两个重要选项:Mappings段和Parameters段,可以帮助用户组织模板里的参数和映射,让用户更好地自定义堆栈,以实现模板的重用和复用。比方说可以用Mappings管理对应AWS上不同region的AMI ID,或者管理企业内部的不同部门。

但是当用户所在的组织越来越多地采用IAC自动化时,mappings和parameters的数量也会急剧增长,给CloudFormation模板的编写和维护带来复杂度。

解决方案

本文里我们介绍一种方法:用当前流行的Serverless计算AWS Lambda 和Amazon DynamoDB自动地管理AWS CloudFormation模板中的Parameters和Mappings。

本文中主要用到了以下几种 AWS服务:

1、DynamoDB表:Amazon DynamoDB是一个NoSQL数据库,这里我们采用它保存CloudFormation模板中所有的mappings和parameters。不仅可以实现集中存放,而且可以依赖DynamoDB的接口实现方便快速地增删和查找。比方说在我们的sample code中,整个企业采用这样一张表:partition key包括组名(比如说team1、team2等)和环境(比如说development、test、production等),sort key保存应用的名字。这个表里的数据类似这样:

当我们把这些数据都insert到DynamoDB中后,可以在AWS console里看到表中的内容是这样的:

2、Lambda方法:AWS Lambda又称为Serverless的计算,通过它你可以运行你的code而不需要预配置或者管理任何服务器。这里我们采用Lambda方法实现CloudFormation和DynamoDB之间的关联,它从CloudFormation模板接收primary key和sort key作为输入,查找DynamoDB表,并且返回所有的key-value数据。

3、Custom lookup resource:这是CloudFormation里的一个自定义资源,与一个Lambda方法绑定。CloudFormation除了可以定义已有的AWS资源,还支持几种自定义资源,包括这种以Lambda方法作为后端的自定义资源。当这种自定义资源创建、更新或者删除时,CloudFormation自动地向Lambda API发起请求,引发方法并将请求的数据传给Lambda方法,本例中所请求的数据是primary key,返回的数据是key-value数据。通常在一个组织中只需要建立这一个custom resource,所有的CloudFormation模板都可以复用它。下图是sample code里建立的custom resource:

让我们将这几种服务组合起来,并且定义好它们之间的交互顺序,整个解决方案就是下图展示的这样:

那么整个的交互顺序如下:

1、用户创建DynamoDB表,插入所需的mappings和parameters数据。

2、CloudFormation模板中的custom resource调用Lambda方法,用组名和环境名称(“teamname-environment”)作为partition key,用应用名称(”appname”)作为sort key。

3、Lambda方法用partition key和sort key作为输入查询DynamoDB表。

4、DyanamoDB将结果返回给Lambda方法。

5、Lambda方法将这些key-value数据作为结果返回给模板中的custom resource。

6、custom resource拿到数据后,堆栈里的其他资源可以通过Fn::GetAtt的方式获得这些数据。

结论

通过这种方式,可以将我们创建堆栈所需的固定部分保存在模板中,而将可变部分mappings和parameters保存在方便增删改查的DynamoDB中,用Lambda实现两者之间的关联。对于大型组织来说,这样可以提高运维效率,也是使用CloudFormation的一种最佳实践。

参考

可以在我们的网站上下载到相关的sample code:https://github.com/awslabs/custom-lookup-lambda

关于AWS Lambda的更多内容请参考网站:https://aws.amazon.com/lambda/

关于CloudFormation自定义资源的更多内容请参考网站:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html

作者介绍

张芸

AWS云架构咨询顾问,获得AWS解决方案架构师专业级认证和DevOps工程师专业级认证,为企业客户和合作伙伴提供迈向云端的专业服务。目前已为多家跨国公司及本土公司、合作伙伴提供上云迁移、应用优化、架构设计等咨询设计和实施服务。在加入AWS之前有近10年的云计算和大数据开源技术研究和开发经验,拥有多项美国和中国专利及专利申请,涉及云计算及服务,分布式系统,软件定义数据中心和自动化运维等领域,合作编著图书《大数据–战略·技术·实践》。

 

一键搞定云端网络环境,让您轻松迁移至AWS!

一键搞定云端网络环境,让您轻松迁移至AWS!

知识补充:什么是AWS CloudFormation?

AWS CloudFormation 模板是一个文本文件,其格式符合 JSON 格式标准。您可使用任何扩展名(如.json、.template 或 .txt)保存这些文件。AWS CloudFormation可帮助您对AWS资源进行建模和设置,包括EC2实例、RDS实例、Auto Scaling Group、Elastic Load Balancing以及整个AWS VPC的网络环境。点击部署模板,成功创建堆栈之后,AWS 资源将正常运行。点击删除模板,所有堆栈中涉及到的资源将都删除。详细参考

http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/Welcome.html

注:此文章所用的AWS CloudFormation模板适合:

(1)由于项目紧急,您在一两天内就想上线,将资源部署在AWS平台上,之后再花时间学习AWS服务与功能。

(2)您想基于AWS实现自动化基础设施部署,比如快速实现开发 / 测试 / 生产环境,这个模板是您学习AWS一个好的开始。

模板下载:

AWS中国区模板:

https://s3.cn-north-1.amazonaws.com.cn/danrong-share/external/aws-template-bjs-addELB-V3.txt

AWS海外区模板:

https://s3.cn-north-1.amazonaws.com.cn/danrong-share/external/aws-template-global-addELB-V3.txt

注:为节约成本,此模板所启用的EC2配置很低,为t2.small。

模板主要解决的问题:

(1)启动VPC,网段为10.40.0.0/16(当然,模板可以自定义IP地址范围)。自动启动6个子网

Public Subnet 1(子网范围10.40.1.0/24)

Public Subnet 2(子网范围10.40.2.0/24)

Private Subnet 1(子网范围10.40.3.0/24)

Private Subnet 2(子网范围10.40.4.0/24)

Private DB Subnet 1(子网范围10.40.5.0/24)

Private DB Subnet 2(子网范围10.40.6.0/24)

打开DNS解析和主机名功能。

(2)启动2个路由表,添加规则Public Route table指向IGW,Private Route table指向NAT Instance。

(3)启动互联网网关IGW,并附加到VPC上。

(4)启动一台Nginx Based AMI作为Web Server,并申请弹性IP、Role(这里的权限是admin)绑定到这台EC2。

(注意:如果客户需要Apache HTTP,只需要把模板中的注释去掉换一下即可)

(5)启动一台NAT Instance作为网络地址转换。如果NAT需要高可用,使用模板(支持中国区)

https://s3.cn-north-1.amazonaws.com.cn/danrong-share/external/nat_monitor_cn.template

(6)启动一台Bastion Host,作为跳板控制,配置所需安全组。

(7)启动Web Server安全组,配置HTTP/22、SSH/22、ICMP/All

(8)启动NAT instance安全组,入站配置Private Subnet子网(只有Private Subnet内的EC2可以访问)。

(9)启动ELB作为负载均衡,启用跨AZ,设置对应所需安全组,添加HTTP/80监听器,健康检查等功能。

此模板启动的资源以及部署图

模板如何使用?

1.       打开AWS EC2服务,创建一个密钥对,比如awskey(用于SSH远程登录虚拟机)

2.       点击AWS CloudFormation服务

3.       点击“创建堆栈”,指定 Amazon S3 模板 URL,复制以下地址(如果海外区也一样)

https://s3.cn-north-1.amazonaws.com.cn/danrong-share/external/aws-template-bjs-addELB-V3.txt

4.       点击“下一步”,看到如下界面,再次点击“下一步”。

5.       勾选“我确认,AWS CloudFormation可能创建IAM资源”。

6.       最后一步点击“创建”,自动生成如下所有资源。

当模板点击创建完成之后,您只需要上传服务器代码以及配置所需要的数据库引擎,比如MySQL。

如果用到其它AWS服务,比如Amazon S3存储、Amazon ElastiCache缓存服务,也基于此模板之上继续创建资源,本文将不再阐述。

注意:当应用进入到生产系统时,可以修改安全组和数据库路由指向,只让前端应用可以访问数据库,以“最小权限”为原则。

作者介绍:

毛郸榕

亚马逊AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,毕业于北京航空航天大学云计算专业,硕士,毕业后直接加入亚马逊AWS中国。在大规模后台架构、自动化运维等方面有着丰富的实践经验。目前在集中精力学习新一代无服务器架构设计。