协调大型云计算部署

cloudformation-seed的Python项目详细描述


云形成种子

构建状态

前言

这是一个脚本,可以帮助您无需麻烦地部署cloudformation项目:

  • 处理任何规模的云计算部署
  • 允许使用不同的安装名称对同一代码执行多个部署
  • 自动处理lambda代码
  • 去掉cloudformation导出的硬依赖,而是在堆栈之间传递输出值
  • 将整个部署打包到Docker映像中并进行版本化

它将:

  • 根据项目名称自动创建S3存储桶
  • 将cloudformation模板上载到bucket中
  • 将lambda代码打包并校验并上传到bucket中
  • 将任意工件上载到bucket中,以便它们可用于您的部署
  • 创建和管理云信息堆栈
  • 创建、推出和管理堆栈集

要求

你需要一个mac或linux机器/vm来运行种子。不支持Windows,但如果您真的需要,它也可以在Windows上运行。

您需要在工作站上安装Docker。

您使用的每个cloudformation模板都必须有4个必需的参数,这些参数将由seed提供:

  1. 模板s3 bucket-种子将自动创建一个s3 bucket,并且每个模板的名称都将在该参数中传递,因此它可以用于lambda函数、自动缩放组(e.t.c.)
  2. installation name-installation name使您能够多次部署项目,而不会出现名称冲突。每个模板都将在这个参数中包含它,您必须在资源的名称中使用它,以使它们在多个安装中都是唯一的
  3. 运行时环境-运行时环境的名称(读取部署配置)
  4. route53zonedomain-与您的部署关联的DNS域。种子不需要存在,您可以将其用作资源命名约定的一部分

这是一个您可以复制和粘贴的片段:

Parameters:
  TemplatesS3Bucket:
    Type: String
    Description: S3 Bucket with the components templates
  InstallationName:
    Type: String
    Description: Unique DNS stack installation name
  RuntimeEnvironment:
    Type: String
    Description: The runtime environment config tag
    Default: dev
  Route53ZoneDomain:
    Type: String
    Description: Route53 zone domain that represents the environment

快速启动

第一件事:

  1. 为项目创建新目录
  2. 将所有内容从examples目录复制到项目的根目录
  3. 编辑参数/dev.yaml以满足您的需要
  4. cloudformation目录下添加更多扩展名为.cf.yaml的模板,并将它们包含在parameters/dev.yaml

最后:

使用您选择的方法向aws进行身份验证,确保您设置了部署所需的aws区域。运行cloudformation seed-c my project-i x0-e dev-d my.domain.cld deploy

可选:

examples目录中获取dockerfile和makefile,并根据您的需要对它们进行按摩。

深潜

种子桶

seed将自动创建一个用于操作部署的s3 bucket。bucket的名称来自makefile.detacies中的安装名和项目名。bucket的名称将作为模板s3bucket传递给部署中的每个cloudformation模板

部署配置

deployment指令中的runtime_environment=dev子句指向位于parameters目录下的配置文件dev.yaml

同一个项目可以有多个运行时环境具有不同配置的CT,例如,如果您有使用相同云信息但需要不同配置(例如VPC和子网ID)的devtestprod环境。

运行时环境是一个yaml文件,它:

  • 定义部署cloudformation堆栈的顺序
  • 设置云信息堆栈的参数

运行时环境包含两个部分:

常用参数

在本节中,您可以指定cloudformation参数,该参数将由部署中的每个堆栈拾取作为默认值(即,如果堆栈上有相同的参数,则它将优先)

示例:

common-parameters:
  VpcId: vpc-00000000

您可以使用!stackoutput(如下所示)在公共参数中,它将按预期工作。

您也可以使用如下的yaml锚:

SAMLUsername: &SAML_USERNAME okta_sso

stacks:
  - name: centralservices-iam-set
    type: stackset
    template: sets/iam.cf.yaml
    parameters:
      SSMLogsLambdaS3Key: !LambdaZip ssmLogsConfig.zip
      SAMLUsername: *SAML_USERNAME

您还可以通过将标记定义为字典并使用堆栈中的yaml锚引用它们来标记堆栈/堆栈集,如下所示:

tags_a: &TAGSA
  testkey1: testvalue1
  testkey2: testvalue2

tags_b: &TAGSB
  testkey3: testvalue3

  stacks:
  - name: example-stackset-template
    type: stackset
    template: sets/example-stackset-template.cf.yaml
    rollout:
      - account: '000000000000'
    tags: *TAGA

  - name: my-project-kms-decrypt-lambda
    template: support/kms-parameters-lambda.cf.yaml
    parameters:
      LambdaSourceS3Key: !LambdaZip kmsParameters.zip
    tags: *TAGSB

堆栈

描述要部署的云信息堆栈的主配置。

示例:

stacks:
  - name: in-cld-managed-zone                            # name of the CF stack, INSTALLATION_NAME will be prepended
    template: centralservices/r53-zone.cf.yaml           # CF template relative to cloudformation directory
    parameters:                                          # Parameters to the CF stack
      ManagedZoneDomainName: in.cld
      ManagingAccountArns: arn:aws:iam::000000000000:root

  - name: in-cld-provisioning                            # name of CF stack, INSTALLATION_NAME will be prepended
    template: centralservices/r53-provisioning.cf.yaml   # CF template relative to cloudformation directory
    parameters:
      LambdaSourceS3Key: !LambdaZip provisionR53.zip     # points to the lambda function under src/provisionR53 (read below)
      SharedServiceR53ZoneRoleArn: !StackOutput in-cld-managed-zone.ManagedZoneCrossAccountRole    # will take the output called ManagedZoneCrossAccountRole from the above stack called in-cld-managed-zone
      Route53DomainName: !StackOutput in-cld-managed-zone.ManagedZoneDomainName
      ExportOutputs: 'false'                             # put numbers and booleans in quotes

  - name: centralservices-iam-set
    type: stackset                                       # set type to stackset
    template: sets/iam.cf.yaml
    parameters:                                          # parameters to the StackSet
      SSMLogsLambdaS3Key: !LambdaZip ssmLogsConfig.zip
      SAMLUsername: *SAML_USERNAME
      SAMLProviderName: *SAML_PROVIDER_NAME
    pilot:                                               # when StackSet is updated only update instances in these accounts
      accounts:
        - '000000000000'
    rollout:                                             # manage StackSet instances
      - account: '000000000000'
        override:                                        # parameter override
          Route53ZoneDomain: prod.innablr.lan
      - account: '111111111111'
        regions:                                         # in this account it goes into two regions
          - ap-southeast-2
          - eu-west-1
        override:
          Route53ZoneDomain: preprod.innablr.lan
      - account: '222222222222'
        override:
          Route53ZoneDomain: dev.innablr.lan
      - account: '999999999999'
        regions: []                                      # this is how you delete an instance
        override:
          Route53ZoneDomain: dontwant.innablr.lan

自动lambda功能

如果部署包含lambda函数,则seed可以自动处理这些函数。在examples目录中,您可以找到名为kmsparameters的lambda函数的示例

  1. src下为lambda创建一个目录,比如kmsparameters
  2. 进行开发
  3. 在您创建的目录中创建make file,并确保makefile的默认目标生成一个zip文件,例如kmsparameters.zip
  4. 在运行时环境配置中使用!lambdazip kmsparameters.zip将zip文件名传递给cloudformation模板(请参见上面的示例)

如果您的lambda函数在stackset中使用,并且需要从其他aws帐户获得,请确保您可以从这些帐户访问seed bucket。请参阅示例中包含的stackbucket policy.cf.yaml

任意工件

如果您想包含软件或其他相对轻量级工件的任何配置对象,可以在项目的根目录下创建一个名为config/<;runtime_environment>;的目录,您放入该目录中的任何内容都将上载到seed s3 buc中。在名为config

假设您有config/dev/myapp_cert.pem并且部署了一个名为dev的运行时配置。文件将作为config/myapp_cert.pem

配置标签

在运行时环境配置中,您可以在堆栈参数规范中使用以下标记:

  1. <代码>!lambda zip kmsparameters.zip-将正确的s3密钥传递给上载的kmsparameters.zip,因此您可以在lambda资源中与模板s3bucket一起使用它

  2. <代码>!cloudformationtemplate support/bucket policy.cf.yaml-工作原理与非常相似!lambdazip但用于cloudformation模板。将把正确的s3键传递给指定的cloudformation堆栈

  3. <代码>!stack output stack name.outputname-将从指定堆栈读取相应的输出并将其传递到此处。堆栈需要按上述顺序创建。

  4. <代码>!人工版本,!artifactrepo!工件图像-这三个标记与发布管理中的发布清单一起使用

发布管理

deploy_stack.py如果您在-m命令行参数中指定它。发布清单包含映像、它们的版本和有关种子正在部署的软件的其他信息。然后,您可以使用通知cloudformation堆栈您正在部署的版本和图像!人工版本!artifactrepo!工件图像运行时环境配置中的标记。

有关发布管理的更多文档即将提供。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在主循环中“优雅地”中断线程   java如何在用户更改url时强制重定向到httpshttp://whatever?   java如何线程化此应用程序   获取“未找到模块javafx.controls”错误Java Eclipse IDE   java如何在Android中获取一年的开始日期和结束日期?   当我释放内存时,java内存不足错误持续存在,几乎没有内存和文档   java将请求从struts2 action转发到非struts2 action?   java putExtra String Intent Android   java如何将XWPFDocument转换为PDF   java如何接收和接收多个隐含意图的数据?   java ClassNotFoundException在运行jar时发生,但在直接运行应用程序时发生   java是否可能在公共/共享上下文中使用Spring库?   java通过创建全局变量减少方法调用   Java什么是没有签名的方法   java NppExec控制台输出到CMD窗口   java我可以在接口中声明普通函数吗?