亚马逊AWS官方博客
基于Seedfarmer的云资源编排
一、背景
SeedFarmer是由AWS开发和开源的一套云资源编排工具。该工具提供一个基于Python的命令行接口,其编排引擎根据组件(Module),部署清单(Manifest)和部署规范(deployspec)来定义云资源和协调云资源的部署,销毁和变更检测。SeedFarmer可以简化云资源管理,轻松实现差异化部署。目前AWS数个开源项目都是基于该工具进行统一编排,例如ADDF(Autonomous Driving Data Framework)
二、基本用法
1、前提条件
Python版本大于或等于3.7.10
样例代码: https://github.com/shuai-devops/aws-seedfarmer-cn-example
2、安装依赖
Seedfarmer可以从PyPi安装。建议在Python中创建一个虚拟环境来隔离和分离你的库。
创建一个新目录并在该目录下创建一个新的虚拟环境。
然后安装seedfarmer及其依赖:
3、项目结构
安装SeedFarmer后,正确初始化项目结构非常重要。这个项目封装了SeedFarmer将项目部署和管理所需的一切。
符合Seedfarmer标准的部署项目如下:
模块(modules)、清单(manifests)和资源(resources)目录处于同一级别。其中模块(modules)为满足一定要求的供seedfarmer调用的可部署代码,并且可以通过组(group)进行逻辑划分;清单(manifests)有部署清单(deployment manifest)和模块清单(module manifest)之分,部署清单组织模块清单并驱动这个部署流程;资源(resources)管理一些通用的配置和脚本。
需要注意的是将seedfarmer.yaml置于项目的根目录非常重要,里面包含基本的项目配置信息。
4、Bootstrap
对于中国区部署,首先需要调整部分源码配置:
然后在获得相关权限的基础上部署codeseeder工具包 :
如果该环境从未运行过CDK(CDK 推荐使用Node 16.8.3 LTS版本),那么需要执行命令cdk bootstrap进行环境初始化。
如果执行成功,那么名为:aws-codeseeder-exampleproj的cloudformation stack会被创建。
5、云资源部署
如果执行成功,Seedfarmer会创建两个分别后缀名为networking和buckets的stack。
三、工作原理
Seed-Farmer不会创建自己的部署,而是通过 AWS CodeSeeder 充当模块代码和 AWS 云之间的代理来帮助部署模块。
(1) 调用Seedfarmer CLI
(2) Seedfarmer 使用 AWS Systems Manager 读取/写入部署元数据
(3) Seedfarmer 调用 AWS IAM 来创建特定于模块的角色,并附加适当的最低权限策略
(4) Seedfarmer 利用 AWS CodeSeeder 在 AWS CodeBuild 上进行远程部署
(5) AWS CodeSeeder 准备 AWS CodeBuild
(6) AWS CodeBuild 通过 AWS CodeSeeder 检查并从 AWS SecretsManager 获取数据(如有必要)
(7) AWS CodeBuild 通过 AWS CodeSeeder 执行模块的自定义部署规范
(8) AWS CodeBuild 通过 AWS CodeSeeder 使用完整的模块元数据更新 AWS Systems Manager
(9) Seedfarmer 更新 AWS Systems Manager 中的部署元数据
SeedFarmerCLI使用部署清单(Manifest)顺序来部署组(Group),同时组中的模块是并行部署的,并且保留此顺序。销毁部署时,将遵循组的相反顺序。重要的是要确定模块的相互依赖关系,并按正确的顺序将它们分配给适当的组。例如,如果需要在VPC中部署计算资源(例如ec2实例),则创建VPC的模块应位于在包含EC2模块的组之前部署的组中。
SeedFarmerCLI目前不支持模块间依赖关系管理,因此最佳做法是将彼此独立的模块分组,并根据模块依赖性对组进行排序。
部署规范(deployspec.yaml)支持使用任何可执行库,首选库是AWSCDKv2。deployspec还能够执行CDK结构之外的命令。Seedfarmer提供了对AWS资源的最低访问权限,而无需授予额外权限。
参考资料
Seedfarmer: https://github.com/awslabs/seed-farmer
Codeseeder: https://github.com/awslabs/aws-codeseeder