亚马逊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中创建一个虚拟环境来隔离和分离你的库。

创建一个新目录并在该目录下创建一个新的虚拟环境。

python -m venv.venv
source .venv /bin/activate

然后安装seedfarmer及其依赖:

pip install seed-farmer==0.1.0
pip install aws-codeseeder==0.3.1 # codeseeder是aws的另一个开源项目,作为seederfarmer的依赖存在 

3、项目结构

安装SeedFarmer后,正确初始化项目结构非常重要。这个项目封装了SeedFarmer将项目部署和管理所需的一切。

符合Seedfarmer标准的部署项目如下:

<project-name>
-manifests(dir)
--<group>
-modules(dir)
--<group>(dir)
--<module>(dir)
--<module>(dir)
--<module>(dir)
...
-resources(dir)
--projectpolicy.yaml
-seedfarmer.yaml

模块(modules)、清单(manifests)和资源(resources)目录处于同一级别。其中模块(modules)为满足一定要求的供seedfarmer调用的可部署代码,并且可以通过组(group)进行逻辑划分;清单(manifests)有部署清单(deployment manifest)和模块清单(module manifest)之分,部署清单组织模块清单并驱动这个部署流程;资源(resources)管理一些通用的配置和脚本。

需要注意的是将seedfarmer.yaml置于项目的根目录非常重要,里面包含基本的项目配置信息。

4、Bootstrap

对于中国区部署,首先需要调整部分源码配置:

python3 patch/seedfarmer_cn_fix.py

然后在获得相关权限的基础上部署codeseeder工具包 :

export AWS_ACCESS_KEY_ID=XXXX
export AWS_SECRET_ACCESS_KEY=XXXX
export AWS_REGION=cn-northwest-1
export AWS_DEFAULT_REGION=cn-northwest-1
codeseeder deploy seedkit exampleproj #部署工具包

如果该环境从未运行过CDK(CDK 推荐使用Node 16.8.3 LTS版本),那么需要执行命令cdk bootstrap进行环境初始化。

如果执行成功,那么名为:aws-codeseeder-exampleproj的cloudformation stack会被创建。

5、云资源部署

cd exampleproject/
seedfarmer apply manifests/examples/deployment.yaml # 如果codeseeder的seedkit没有部署的话,这时候会先部署对应seedkit,然后才会部署module

如果执行成功,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

本篇作者

王帅

AWS ProServe DevOps顾问。提倡融合文化,实践和工具的Devops理念,致力于帮助客户使组织能够以更高的速度和可靠性交付产品并获得业务价值。擅长平台规划,迁移和工具链设计。对新鲜事物充满热情

黄书昊

AWS ProServe DevOps顾问,致力于解决企业客户DevOps咨询和实施,在云原生/DevOps/微服务框架/性能优化和加速研发效能领域有深入研究的热情