探索 AWS 云控制集合的新可能性
探索 AWS 云控制集合的新可能性
我们最近发布了使用 AWS 云控制 API 生成模块的实验性 alpha 集合,用于与 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 很重要
虽然不会直接影响自动执行 AWS 服务的 Ansible 内容作者,但我们相信云控制 API 将有助于提供更好的云自动化体验。
最值得注意的是,它能够快速引入新的 AWS 服务以及对现有服务的实施新功能。这也将能够更全面地涵盖大量可用的 AWS 服务。这可以进一步扩展到包括在已采用云控制 API 的 AWS 云中运行的第三方服务。
此集合中包含的模块使用名为 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 云控制 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 内容集合显示出巨大的潜力,可以帮助您使用 Ansible 自动执行对 AWS 的部署,并大大提高云计划成功的可能性。
希望您发现这篇博文对您有所帮助!但更重要的是,我们希望它能激励您试用最新的 amazon.cloud 集合版本,并告诉我们您的想法。