跳转到主要内容

AWS Cloud Formation部署CLI

项目描述

Build Status Code Coverage PyPI Downloads Latest PyPI version License

该项目不再积极维护!

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模板进行模板化,访问渲染的定义,包括SenzaInfoSenzaComponentsArguments键(包含所有提供的参数)。

您也可以按名称指定参数,这使得Senza CLI更具可读性。在具有大量参数的复杂场景中,这可能很有用。

$ senza create example.yaml 3 example MintBucket=<mint-bucket> ImageVersion=latest

在这里,ApplicationId被指定为位置参数。其他两个参数随后指定,按其名称指定。命令行上的命名参数可以按任何顺序给出,但不得在命名参数之后允许位置参数。

您可以通过传递任何支持的CloudFormation属性,例如AllowedPatternAllowedValuesMinLengthMaxLength等。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映射。为ImagesServerSubnetsLoadBalancerSubnets使用映射。

示例

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中为您创建自动警报。必须是CPUNetworkInNetworkOut之一。如果您不提供任何信息,您的自动扩展组将不会动态扩展,您将不得不定义自己的警报。

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,请显式设置Schemeinternet-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-letsencryptarn: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-letsencryptarn: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在模板的一些部分选择性地支持特殊的跨堆栈引用——例如,在SecurityGroupsIamRoles中。

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>

项目详情


发布历史 发布通知 | RSS源

下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

stups-senza-2.1.143.tar.gz (123.3 kB 查看哈希值)

上传时间

构建分布

stups_senza-2.1.143-py3-none-any.whl (120.2 kB 查看哈希值)

上传时间 Python 3

由以下支持