AWS Cloud Formation部署CLI
项目描述
该项目不再积极维护!
Senza 是一款命令行工具,它可以帮助您以合理、简单的方式生成和执行 AWS CloudFormation 模板。使用 Senza,您可以编写 YAML 文档并重用常见的应用程序堆栈解决方案,例如负载均衡、自动扩展、IAM 角色管理以及其他配置。Senza 还为 Web 应用程序、后台应用程序、PostgreSQL、Redis 集群和 Amazon ElastiCache 堆栈类型提供了基础 CloudFormation 模板。
Senza 解决的问题
AWS CloudFormation 在管理 AWS 上的不可变堆栈方面非常出色。然而,以 JSON 格式编写 CloudFormation 模板并不符合人类的使用习惯,这阻碍了开发者的生产力。此外,CloudFormation 模板的许多部分可以在同一类型的应用程序之间重用,但 CloudFormation 没有提供重用模板的方法。
Senza 通过支持以 YAML 作为 CloudFormation 模板的输入,并在其之上添加自己的“组件”来解决这些问题。组件是预定义的、易于配置的 CloudFormation 片段,可以生成 CloudFormation 所需的所有样板 JSON。
安装
$ sudo pip3 install --upgrade stups-senza
命令行使用
您可以轻松引导 Senza 定义以快速开始
$ senza init my-definition.yaml # bootstrap a new app
$ senza create ./my-definition.yaml 1 1.0
使用 create 命令从 Senza 定义创建 CloudFormation 堆栈
$ senza create myapp.yaml 1 0.1-SNAPSHOT
如何禁用自动 CloudFormation 失败回滚以进行“事后”调试(例如,在 EC2 实例上)
$ senza create --disable-rollback myerroneous-stack.yaml 1 0.1-SNAPSHOT
从 .yaml 文件传递参数
$ senza create --parameter-file parameters.yaml myapp.yaml 1 0.1-SNAPSHOT
使用 list 命令列出堆栈
$ senza list myapp.yaml # list only active stacks for myapp
$ senza list myapp.yaml --all # list stacks for myapp (also deleted ones)
$ senza list # list all active stacks
$ senza list --all # list all stacks (including deleted ones)
$ senza list "suite-.*" 1 # list stacks starting with "suite" and with version "1"
$ senza list ".*" 42 # list all stacks with version "42"
$ senza list mystack ".*test" # list all stacks for "mystack" with version ending in "test"
如果您需要有关堆栈的更详细的信息,Senza 提供了额外的命令
$ senza resources myapp.yaml 1 # list all CF resources
$ senza events myapp.yaml 1 # list all CF events
$ senza instances myapp.yaml 1 # list EC2 instances and IPs
$ senza console myapp.yaml 1 # get EC2 console output for all stack instances
$ senza console 172.31.1.2 # get EC2 console output for single instance
大多数命令都接受所谓的 STACK_REF 参数。您可以使用现有的 Senza 定义 YAML 文件(如上所示)或使用堆栈的名称和版本。您还可以使用正则表达式匹配多个应用程序和版本
$ senza inst # all instances, no STACK_REF argument given
$ senza inst mystack # list instances for all versions of "mystack"
$ senza inst mystack 1 # only list instances for "mystack" version "1"
$ senza inst "suite-.*" 1 # list instances starting with "suite" and with version "1"
$ senza inst ".*" 42 # list all instances with version "42"
$ senza inst mystack ".*test" # list all instances for "mystack" with version ending in "test"
路由流量
流量可以通过 Route53 DNS 路由到您的新堆栈
$ senza traffic myapp.yaml # show traffic distribution
$ senza traffic myapp.yaml 2 50 # give version 2 50% of traffic
删除旧堆栈
要删除不再使用的堆栈
$ senza delete myapp.yaml 1
$ senza del mystack # shortcut: delete the only version of "mystack"
Bash 完成功能
Bash 的可编程完成功能允许输入部分命令,然后按 [Tab] 键自动完成命令序列。如果有多个完成选项,则 [Tab] 会列出所有选项。
要激活 Senza CLI 的 bash 完成功能,只需运行
$ eval "$(_SENZA_COMPLETE=source senza)"
将 eval 行放入您的 .bashrc
$ echo 'eval "$(_SENZA_COMPLETE=source senza)"' >> ~/.bashrc
控制命令输出
Senza CLI 支持三种不同的输出格式
- 文本
默认的 ANSI 颜色输出,供人类用户使用。
- JSON
表格的 JSON 输出,用于脚本。
- tsv
将表格作为 制表符分隔值 (TSV) 打印。
JSON是最适合通过各种语言或使用jq(一个命令行JSON处理器)程序化处理输出的格式。文本格式便于人类阅读,而“tsv”格式与sed、grep和awk等传统的Unix文本处理工具配合良好。
$ senza list --output json | jq .
$ senza instances my-stack --output tsv | awk -F\\t '{ print $6 }'
Senza 定义
一个没有Senza组件的最小Senza定义可能看起来像这样:
Description: "A minimal Cloud Formation stack creating a SQS queue"
SenzaInfo:
StackName: example
Resources:
MyQueue:
Type: AWS::SQS::Queue
提示:使用senza init可以快速为大多数常见用例(例如,Web应用程序)创建新的Senza定义YAML。
SenzaInfo 键
SenzaInfo键配置全局Senza行为,并且必须始终存在于定义YAML中。适用于SenzaInfo部分的可用属性
- StackName
堆栈名称(必需)。
- OperatorTopicId
可选的SNS主题名称或CloudFormation通知的ARN。例如:您可以使用此功能将部署通知发送到邮件列表。
- Parameters
自定义Senza定义参数。用于在CloudFormation模板中动态替换变量。
# basic information for generating and executing this definition
SenzaInfo:
StackName: kio
OperatorTopicId: kio-operators
Parameters:
- ImageVersion:
Description: "Docker image version of Kio."
# a list of Senza components to apply to the definition
SenzaComponents:
- Configuration:
Type: Senza::StupsAutoConfiguration # auto-detect network setup
# will create a launch configuration and auto scaling group with min/max=1
- AppServer:
Type: Senza::TaupageAutoScalingGroup
InstanceType: t2.micro
SecurityGroups: [app-kio] # can be either name or id ("sg-..")
ElasticLoadBalancer: AppLoadBalancer
TaupageConfig:
runtime: Docker
source: stups/kio:{{Arguments.ImageVersion}}
ports:
8080: 8080
environment:
PGSSLMODE: verify-full
DB_SUBNAME: "//kio.example.eu-west-1.rds.amazonaws.com:5432/kio?ssl=true"
DB_USER: kio
DB_PASSWORD: aws:kms:abcdef1234567890abcdef=
# creates an ELB entry and Route53 domains to this ELB
- AppLoadBalancer:
Type: Senza::WeightedDnsElasticLoadBalancer
HTTPPort: 8080
HealthCheckPath: /ui/
SecurityGroups: [app-kio-lb]
Scheme: internet-facing
# Plain CloudFormation definitions are fully supported:
Outputs:
URL:
Description: "The ELB URL of the new Kio deployment."
Value:
"Fn::Join":
- ""
-
- "http://"
- "Fn::GetAtt":
- AppLoadBalancer
- DNSName
在评估期间,您可以使用mustache模板进行模板化,访问渲染的定义,包括SenzaInfo、SenzaComponents和Arguments键(包含所有提供的参数)。
您也可以按名称指定参数,这使得Senza CLI更具可读性。在具有大量参数的复杂场景中,这可能很有用。
$ senza create example.yaml 3 example MintBucket=<mint-bucket> ImageVersion=latest
在这里,ApplicationId被指定为位置参数。其他两个参数随后指定,按其名称指定。命令行上的命名参数可以按任何顺序给出,但不得在命名参数之后允许位置参数。
您可以通过传递任何支持的CloudFormation属性,例如AllowedPattern、AllowedValues、MinLength、MaxLength等。Senza本身将不会强制执行这些属性,但CloudFormation将评估生成的模板,如果任何属性未满足,则会引发异常。例如
$ senza create example.yaml 3 example latest mint-bucket "Way too long greeting"
Generating Cloud Formation template.. OK
Creating Cloud Formation stack hello-world-3.. EXCEPTION OCCURRED: An error occurred (ValidationError) when calling the CreateStack operation: Parameter 'GreetingText' must contain at most 15 characters
Traceback (most recent call last):
[...]
使用Default属性,您可以给任何参数提供一个默认值。如果未在命令行上指定参数(无论是作为位置参数还是命名参数),则使用默认值。我们建议将所有具有默认值的参数放在参数定义列表的底部。否则,将无法将它们映射到正确的位置,并且您必须使用name=value指定所有后续参数。
有一个选项可以从文件传递参数(文件需要格式化为.yaml)
$ senza create --parameter-file parameters.yaml example.yaml 3 1.0-SNAPSHOT
参数文件的示例
ApplicationId: example-app-id
MintBucket: your-mint-bucket
您还可以将参数文件和命令行上的参数组合起来,但不能重复命名相同的参数。此外,参数不能同时存在于文件和命令行上
$ senza create --parameter-file parameters.yaml example.yaml 3 1.0-SNAPSHOT Param=Example1
AccountInfo
Senza模板提供以下属性
{{AccountInfo.Region}}:堆栈创建的AWS区域。例如:‘eu-central-1’。在模板的许多部分中,您还可以使用{“Ref” : “AWS::Region”}。
{{AccountInfo.AccountAlias}}:AWS账户的别名名称。例如:‘super-team1-account’。
{{AccountInfo.AccountID}}:AWS账户ID。例如:‘353272323354’。
{{AccountInfo.TeamID}}:团队ID。例如:‘super-team1’。
{{AccountInfo.Domain}}:AWS账户域名。例如:‘super-team1.net’。
映射
Senza映射基本上是键值对,其行为类似于CloudFormation映射。为Images、ServerSubnets或LoadBalancerSubnets使用映射。
示例
Mappings:
Images:
eu-west-1:
MyImage: "ami-123123"
# (..)
Image: MyImage
Senza 组件
在顶级密钥SenzaComponents下方配置您所有的Senza组件。结构如下
SenzaComponents:
- ComponentName1:
Type: ComponentType1
SomeComponentProperty: "some value"
- ComponentName2:
Type: ComponentType2
自动扩展
AutoScaling属性包括
- 最小
要启动的实例的最小数量。
- 最大
要启动的实例的最大数量。
- SuccessRequires:
在堆栈启动期间,它定义了CloudFormation何时认为您的自动扩展组(ASG)处于健康状态。默认为每15分钟一个健康的实例。您可以更改设置——例如,“四个健康的实例/1:20:30”将看起来像“4 within 1h20m30s”。您可以按需省略小时/分钟/秒。看起来像整数的值将被计为健康实例:例如,“2”解释为在默认超时15分钟内有两个健康实例。
- MetricType
自动扩展时使用的度量值,这将在CloudWatch中为您创建自动警报。必须是CPU、NetworkIn或NetworkOut之一。如果您不提供任何信息,您的自动扩展组将不会动态扩展,您将不得不定义自己的警报。
- ScaleUpThreshold
度量值的上限缩放阈值。对于“CPU”度量:70表示70% CPU使用率。对于网络度量,100表示100字节。您可以传递单位(KB/GB/TB),例如:“100 GB”。
- ScaleDownThreshold
度量值的下限缩放阈值。对于“CPU”度量:40表示40% CPU使用率。对于网络度量,2表示2字节。您可以传递单位(KB/GB/TB),例如:“2 GB”。
- ScalingAdjustment
每次缩放操作添加/删除的实例数量。默认为1。
- Cooldown:
在缩放操作发生后,在此时间内不要再次进行缩放(以秒为单位)。默认为60(一分钟)。
- Statistic
在决定缩放阈值是否满足时跟踪的统计值。默认为“Average”,也可以是“SampleCount”、“Sum”、“Minimum”、“Maximum”。
- Period
计算统计值的周期(以秒为单位)。默认为300(五分钟)。
- EvaluationPeriods
数据与指定阈值比较的周期数。默认为2。
块设备映射与 Ebs 属性
BlockDeviceMappings属性包括DeviceName(例如,/dev/xvdk)和Ebs(EBS选项映射)。VolumeSize,一个Ebs属性,用于确定EBS应该有多少GB。
加权 DNS 弹性负载均衡器
Senza的WeightedDnsElasticLoadBalancer组件类型创建一个具有Route 53加权域的HTTPS ELB资源。您可以自动检测ELB使用的SSL证书名称,或者将其命名为SSLCertificateId。指定主域名(MainDomain),或者将应用默认的Route53托管区域。
默认情况下创建了一个内部负载均衡器,这与AWS的默认行为不同。要创建面向互联网的ELB,请显式设置Scheme为internet-facing。
SenzaComponents:
- AppLoadBalancer:
Type: Senza::WeightedDnsElasticLoadBalancer
HTTPPort: 8080
SecurityGroups:
- app-myapp-lb
WeightedDnsElasticLoadBalancer组件支持以下配置属性
- HTTPPort
EC2实例使用的HTTP端口。
- HealthCheckPath
用于健康检查的HTTP路径,例如:“/health”。必须返回200。
- HealthCheckPort
可选。用于健康检查的端口。默认为HTTPPort。
- SecurityGroups
ELB使用的安全组列表。安全组必须允许SSL流量。
- MainDomain
要使用的主要域名,例如:“myapp.example.org”。
- VersionDomain
要使用的版本域名,例如:“myapp-1.example.org”。您可以使用常规模板功能来集成堆栈版本,例如:myapp-{{SenzaInfo.StackVersion}}.example.org。
- Scheme
负载均衡器方案。可以是内部或面向互联网。默认为内部。
- SSLCertificateId
要使用的上传SSL/TLS服务器证书的名称或ARN ID,例如myapp-example-org-letsencrypt或arn:aws:acm:eu-central-1:123123123:certificate/abcdefgh-ijkl-mnop-qrst-uvwxyz012345。您可以使用
aws iam list-server-certificates
检查可用的IAM服务器证书。对于ACM证书,使用aws acm list-certificates
。
此外,您还可以指定以下任一有效的AWS CloudFormation ELB属性(例如,要覆盖监听器)。
加权 DNS 弹性负载均衡器 V2
与WeightedDnsElasticLoadBalancer组件类似,WeightedDnsElasticLoadBalancerV2创建一个具有Route 53加权域的HTTPs ELBv2资源。ELBv2监听器支持SNI,因此您可以指定多个SSL证书。
SenzaComponents:
- AppLoadBalancer:
Type: Senza::WeightedDnsElasticLoadBalancerV2
HTTPPort: 8080
SecurityGroups:
- app-myapp-lb
WeightedDnsElasticLoadBalancerV2组件支持以下配置属性
- HTTPPort
EC2实例使用的HTTP端口。
- HealthCheckPath
用于健康检查的HTTP路径,例如:“/health”。必须返回200。
- HealthCheckPort
可选。用于健康检查的端口。默认为HTTPPort。
- SecurityGroups
用于ELBv2的安全组列表。安全组必须允许SSL流量。
- MainDomain
要使用的主要域名,例如:“myapp.example.org”。
- VersionDomain
要使用的版本域名,例如:“myapp-1.example.org”。您可以使用常规模板功能来集成堆栈版本,例如:myapp-{{SenzaInfo.StackVersion}}.example.org。
- Scheme
负载均衡器方案。可以是内部或面向互联网。默认为内部。
- SSLCertificateId
用逗号分隔的证书名称或ARN ID列表,用于上传要使用的SSL/TLS服务器证书,例如myapp-example-org-letsencrypt或arn:aws:acm:eu-central-1:123123123:certificate/abcdefgh-ijkl-mnop-qrst-uvwxyz012345。您可以使用
aws iam list-server-certificates
检查可用的IAM服务器证书。对于ACM证书,使用aws acm list-certificates
。
跨堆栈引用
传统的CloudFormation模板仅允许您引用同一模板中定位的资源。这可能相当有限。为了补偿,Senza在模板的一些部分选择性地支持特殊的跨堆栈引用——例如,在SecurityGroups和IamRoles中。
AppServer:
Type: Senza::TaupageAutoScalingGroup
InstanceType: c4.xlarge
SecurityGroups:
- Stack: base-1
LogicalId: ApplicationSecurityGroup
IamRoles:
- Stack: base-1
LogicalId: ApplicationRole
使用这些引用,您可以为每个应用程序额外添加一个特殊的堆栈,该堆栈定义了跨不同版本共享的常用安全组和IAM角色。请注意,这与使用senza init不同。
单元测试
$ python3 setup.py test --cov-html=true
发布
$ ./release.sh <NEW-VERSION>
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
stups-senza-2.1.143.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ff072e3c8365d423f9c05dd49f388f0bdc8660fa26fdddeda56333ab36c4b7e3 |
|
MD5 | 845916b3e38bf05c94af0bfa2f0716c7 |
|
BLAKE2b-256 | 6aea01e4b20293b6bca24020b1cb8e67104bda61c0636d5e3cc0a37d3a5f389c |
stups_senza-2.1.143-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a0da3b277e9817fdf66d2ef883b3491d8bfd67d078a0d6caa224ebc71baee2eb |
|
MD5 | 8b1e065115a517d99774e4e33fd12c06 |
|
BLAKE2b-256 | ea79ee2978e232ad99dff0c03d3be722a2e61a439fd64e13dd4a7c052e519307 |