探索 AWS 云控制集合带来的新可能性
探索 AWS 云控制集合带来的新可能性
我们最近发布了一个实验性的 alpha 版本的集合,该集合使用 AWS 云控制 API 生成模块,用于与 AWS 服务进行交互。目前,此内容不适用于生产环境。我们发布此工作是因为我们认为分享我们的研究成果并获得您的反馈非常重要。
在这篇文章中,我们将重点介绍如何试用新版 amazon.cloud 内容集合 的 alpha 版本。
AWS 云控制 API
AWS 云控制 API 于 2021 年 9 月推出,并在 AWS re:Invent 上亮相,它是一套通用的应用程序编程接口 (API),为开发人员提供五种操作来创建、读取、更新、删除和列出 (CRUDL) 资源,并使开发人员和合作伙伴能够以标准方式轻松管理 AWS 和第三方服务的生命周期。
云控制 API 目前支持数百种 AWS 资源,未来几个月内还将支持更多现有的 AWS 资源,涵盖 Amazon Elastic Compute Cloud (Amazon EC2) 和 Amazon Simple Storage Service (Amazon S3) 等服务。
AWS 提供了广泛而深入的云服务组合。它始于 Amazon Simple Storage Service (Amazon S3),并发展到 200 多种服务。每个不同的 AWS 服务都有一个特定的 API,具有自己的词汇表、输入参数和错误报告。由于这些 API 对每个服务都是唯一的,因此开发人员必须了解他们使用的每个 API 的行为(输入、响应和错误代码)。随着应用程序变得越来越复杂,开发人员在使用更多 AWS 服务时,学习和管理不同 API 的难度也会增加。
随着 AWS 云控制 API 的推出,开发人员可以使用一致的方法来管理其云基础设施中定义的支持服务在其整个生命周期中的操作,从而减少了开发人员在基础设施中添加新服务时需要学习的 API 数量。
为什么 AWS 云控制 API 对 Ansible 很重要
虽然不会直接影响 Ansible 内容作者自动化 AWS 服务的方式,但我们相信云控制 API 将有助于提供更好的云自动化体验。
最值得注意的是,它能够快速引入新的 AWS 服务并对现有服务实施新功能。这还将能够更全面地涵盖大量可用的 AWS 服务。这可以进一步扩展到包括在 AWS 云中运行并已采用云控制 API 的第三方服务。
此集合中包含的模块是使用名为 amazon_cloud_code_generator 的工具生成的,该工具由 Ansible 云团队开发并开源。
如流程图所示,可以使用 tox -e refresh_modules
轻松部署该集合,默认情况下,它将在 cloud
子目录中生成。
基本上,生成过程利用了一些 Python 实用程序脚本,这些脚本包装了 AWS CloudFormation 客户端以抓取每个 Amazon 支持的资源的资源类型定义模式或元模式,并执行必要的处理以生成模块文档。
其他处理逻辑生成所有实用程序,包括模块、模块实用程序和测试。
例如,module_utils
包含一个基类,所有资源模块都可以使用它来提供创建、更新、删除、描述和列出所需的所有方法,并提供相应的逻辑来等待、分页和优雅地处理 botocore 异常。
使用 amazon.cloud 集合
此集合的所有模块都使用 boto3 Amazon Web Services (AWS) 软件开发工具包 (SDK) for Python 和 AWS Cloud Control API (CloudControlApi) 客户端。它需要
基本任务示例
让我们来看一个如何使用 amazon.cloud 集合的实际示例。也许您需要预配一个简单的 AWS S3 存储桶,然后对其进行描述。
如果您已经在使用 amazon.aws
和 community.aws
集合,您会发现任务语法非常相似。
您可能会注意到,我们不再有 info
模块,但 info
模块执行的“获取”或“描述”和“列出”功能在主模块中处理。这无疑简化了集合的使用并改善了用户体验。
- name: Create a simple S3 bucket with public access block configuration amazon.cloud.s3_bucket: state: present bucket_name: “{{ local_bucket_name }}” public_access_block_configuration: block_public_acls: true block_public_policy: true ignore_public_acls: true restrict_public_buckets: true register: _result_create - name: Gather information about the S3 bucket amazon.cloud.s3_bucket: state: get bucket_name: “{{ local_bucket_name }}” register: _result_info
- name: Create a simple S3 bucket with public access block configuration amazon.aws.s3_bucket: state: present name: “{{ local_bucket_name }}” public_access: block_public_acls: true block_public_policy: true ignore_public_acls: true restrict_public_buckets: true register: _result_create - name: Gather information about the S3 bucket community.aws.aws_s3_bucket_info: name: “{{ local_bucket_name }}” register: _result_info
amazon.cloud 内容集合的另一个相关功能是返回结果的结构。特别是,所有可用操作(存在、不存在、列表和获取或描述)返回的结果在所有模块中结构良好且统一。它始终包含资源的标识符和一个资源特定属性的字典。
这样,我们可以直接获取每个资源的标识符并在多个依赖资源中重复使用它。
此功能对用户体验产生了积极的影响。
[ { "identifier": "090ba2aa-cc0c-5a40-9b5f-a2d2b8fc6ceb", "properties": { "arn": "arn:aws:s3:::090ba2aa-cc0c-5a40-9b5f-a2d2b8fc6ceb", "bucket_name": "090ba2aa-cc0c-5a40-9b5f-a2d2b8fc6ceb", "domain_name": "090ba2aa-cc0c-5a40-9b5f-a2d2b8fc6ceb.s3.amazonaws.com", "dual_stack_domain_name": "090ba2aa-cc0c-5a40-9b5f-a2d2b8fc6ceb.s3.dualstack.us-east-1.amazonaws.com", "regional_domain_name": "090ba2aa-cc0c-5a40-9b5f-a2d2b8fc6ceb.s3.us-east-1.amazonaws.com", "website_url": "http://090ba2aa-cc0c-5a40-9b5f-a2d2b8fc6ceb.s3-website-us-east-1.amazonaws.com" } } ]
已知问题和不足
-
生成的模块与 API 及其模式一样好。并非所有模块选项的文档都完整。
-
缺少对重要 AWS 资源的支持,例如 EC2 实例、卷和快照、RDS 实例和快照、弹性负载均衡器等。预计未来几个月内将支持来自其中一些 AWS 服务的资源。
-
幂等性(所需状态)是 API 的功能,可能无法完全支持。在云控制 API 中,幂等性是使用
ClientToken
实现的。ClientToken
一旦使用,有效期为 36 小时。 -
- 此后,使用相同客户端令牌的资源请求将被视为新请求。
- 为了克服此限制,此集合中存在的模块通过执行第一个
get_resource(TypeName='', Identifier='')
操作(使用资源标识符)来处理幂等性。
-
缺少服务器端分页可能会对性能产生严重影响。您可能知道,某些 AWS 操作返回的结果不完整,需要后续请求才能获得整个结果集。分页器是 boto3 的一项功能,它充当在截断的 API 操作的整个结果集上迭代过程的抽象。云控制 API 目前缺乏此功能。此集合通过实现手动客户端端分页来处理此限制。
-
缺少提供基于名称的标识以支持所需状态(幂等性)逻辑(如 amazon.aws 中)的功能。在实践中,这意味着您无法列出所有资源并在服务器端筛选结果。
-
- 例如,一些模块不允许用户在创建时设置 primaryIdentifier。一个可能的解决方案是允许用户设置资源名称并使用该名称设置 [Tag:Name,但由于 API 不允许服务器端资源筛选,我们只能使用该标签信息实现客户端端筛选。这种方法肯定会对性能产生严重影响。
-
并非所有资源都支持可用状态。在实践中,这意味着某些资源无法更新或列出。
接下来是什么?
新的 amazon.cloud 自动生成集合除了可以使用生成器工具轻松生成,并且对所有模块都有一组非常抽象的 API 之外,使用起来非常简单,并且可以在多个依赖资源之间重复使用资源。
我们一直在努力
- 使集合的 API 生成的模块更易于使用和操作。
- 提高资源支持能力并更快地涵盖更广泛的用例场景。
- 改进集合模块的整体性能。
我们如何才能改进使用 Ansible 预配 AWS 云资源?更广泛地说,我们如何才能使 API 生成的模块更易于使用和操作?我们希望听到您的想法。
您可以通过针对 amazon.cloud GitHub 存储库 报告任何问题来提供反馈。
由于模块是自动生成的,您可以通过针对 amazon_cloud_code_generator 工具而不是生成的集合打开 GitHub 拉取请求来做出贡献。
总结
虽然处于 alpha 版本,但新的 amazon.cloud 内容集合展现了巨大的潜力,可以自动化您在 AWS 上使用 Ansible 的部署,并极大地提高了您的云计划成功的可能性。
希望您觉得这篇博文有所帮助!但更重要的是,我们希望它能激励您试用最新的 amazon.cloud 集合版本,并告诉我们您的想法。