协调大型云计算部署
cloudformation-seed的Python项目详细描述
云形成种子
前言
这是一个脚本,可以帮助您无需麻烦地部署cloudformation项目:
- 处理任何规模的云计算部署
- 允许使用不同的安装名称对同一代码执行多个部署
- 自动处理lambda代码
- 去掉cloudformation导出的硬依赖,而是在堆栈之间传递输出值
- 将整个部署打包到Docker映像中并进行版本化
它将:
- 根据项目名称自动创建S3存储桶
- 将cloudformation模板上载到bucket中
- 将lambda代码打包并校验并上传到bucket中
- 将任意工件上载到bucket中,以便它们可用于您的部署
- 创建和管理云信息堆栈
- 创建、推出和管理堆栈集
要求
你需要一个mac或linux机器/vm来运行种子。不支持Windows,但如果您真的需要,它也可以在Windows上运行。
您需要在工作站上安装Docker。
您使用的每个cloudformation模板都必须有4个必需的参数,这些参数将由seed提供:
模板s3 bucket
-种子将自动创建一个s3 bucket,并且每个模板的名称都将在该参数中传递,因此它可以用于lambda函数、自动缩放组(e.t.c.)installation name
-installation name使您能够多次部署项目,而不会出现名称冲突。每个模板都将在这个参数中包含它,您必须在资源的名称中使用它,以使它们在多个安装中都是唯一的运行时环境
-运行时环境的名称(读取部署配置)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
快速启动
第一件事:
- 为项目创建新目录
- 将所有内容从
examples
目录复制到项目的根目录 - 编辑
参数/dev.yaml
以满足您的需要 - 在
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的名称来自 deployment指令中的 同一个项目可以有多个运行时环境具有不同配置的CT,例如,如果您有使用相同云信息但需要不同配置(例如VPC和子网ID)的dev、test和prod环境。 运行时环境是一个yaml文件,它: 运行时环境包含两个部分: 在本节中,您可以指定cloudformation参数,该参数将由部署中的每个堆栈拾取作为默认值(即,如果堆栈上有相同的参数,则它将优先) 示例: 您可以使用 您也可以使用如下的yaml锚: 您还可以通过将标记定义为字典并使用堆栈中的yaml锚引用它们来标记堆栈/堆栈集,如下所示: 描述要部署的云信息堆栈的主配置。 示例: 如果部署包含lambda函数,则seed可以自动处理这些函数。在 如果您的lambda函数在stackset中使用,并且需要从其他aws帐户获得,请确保您可以从这些帐户访问seed bucket。请参阅示例中包含的stack 如果您想包含软件或其他相对轻量级工件的任何配置对象,可以在项目的根目录下创建一个名为 假设您有 在运行时环境配置中,您可以在堆栈参数规范中使用以下标记: <代码>!lambda zip kmsparameters.zip <代码>!cloudformationtemplate support/bucket policy.cf.yamlmakefile.detacies
中的安装名和项目名。bucket的名称将作为模板s3bucket传递给部署中的每个cloudformation模板
部署配置
runtime_environment=dev
子句指向位于parameters
目录下的配置文件dev.yaml
。常用参数
-工作原理与common-parameters:
VpcId: vpc-00000000
!stackoutput
(如下所示)在公共参数中,它将按预期工作。
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
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功能
examples
目录中,您可以找到名为kmsparameters的lambda函数的示例
-将正确的s3密钥传递给上载的kmsparameters.zip,因此您可以在lambda资源中与src
下为lambda创建一个目录,比如kmsparameters
make file
,并确保makefile的默认目标生成一个zip文件,例如kmsparameters.zip
!lambdazip kmsparameters.zip
将zip文件名传递给cloudformation模板(请参见上面的示例)bucket policy.cf.yaml
。任意工件
config/<;runtime_environment>;
的目录,您放入该目录中的任何内容都将上载到seed s3 buc中。在名为config
config/dev/myapp_cert.pem
并且部署了一个名为dev
的运行时配置。文件将作为config/myapp_cert.pem
配置标签
模板s3bucket一起使用它
非常相似!lambdazip
但用于cloudformation模板。将把正确的s3键传递给指定的cloudformation堆栈
<代码>!stack output stack name.outputname-将从指定堆栈读取相应的输出并将其传递到此处。堆栈需要按上述顺序创建。
<代码>!人工版本,!artifactrepo
和!工件图像
-这三个标记与发布管理中的发布清单一起使用
发布管理
deploy_stack.py
如果您在-m
命令行参数中指定它。发布清单包含映像、它们的版本和有关种子正在部署的软件的其他信息。然后,您可以使用通知cloudformation堆栈您正在部署的版本和图像!人工版本
,!artifactrepo
和!工件图像
运行时环境配置中的标记。
有关发布管理的更多文档即将提供。