监控多个 Amazon Web Services account 之间共享 Amazon Machine Image 的使用情况 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

监控多个 Amazon Web Services account 之间共享 Amazon Machine Image 的使用情况

由 Naveen Suthar (AWS) 和 Sandeep Gawande (AWS) 创建

代码存储库:cross-account-ami-auditing-terraform-sam ples

环境:PoC 或试点

技术:管理和治理; DevOps;无服务器;运营

AWS 服务:亚马逊 DynamoDB;AWS Lambda;亚马逊 EventBridge

Summary

Amazon Machine Images (AMI) 用于在 Amazon Web Services (AWS) 环境中创建 Amazon Elastic Compute Cloud (Amazon EC2) 实例。您可以在单独的集中式 Amazon Web Services account 中创建 AMI,该账户在此模式中称为创建者账户。然后,您可以在同一 AWS 区域 中的多个 Amazon Web Services account(在此模式中称为消费者账户)之间共享 AMI。从单个账户管理 AMI 可提供可扩展性并简化治理。在消费者账户中,您可以引用 Amazon EC2 Auto Scaling 启动模板和 Amazon Elastic Kubernetes Service (Amazon EKS) 节点组中的共享 AMI。

当共享 AMI 被弃用取消注册取消共享时,在消费者账户中引用 AMI 的 Amazon Web Services 无法使用此 AMI 启动新实例。任何自动扩缩事件或同一实例的重新启动都失败。这可能会导致生产环境中出现问题,例如应用程序停机或性能下降。当多个 Amazon Web Services account 中发生 AMI 共享和使用事件时,可能很难监控此活动。

此模式可帮助您监控同一区域中账户之间的共享 AMI 使用情况和状态。它使用无服务器 AWS 服务,例如亚马逊、亚马逊 DynamoDB EventBridge、AWS Lambda 和亚马逊简单电子邮件服务 (Amazon SES) Semple Service。您可以使用 HashiCorp Terraform 来配置基础设施即代码 (IaC)。当消费者账户中的服务引用已取消注册或未共享的 AMI 时,此解决方案会发出警报。

先决条件和限制

先决条件

  • 两个或多个活跃 Amazon Web Services account :一个创建者账户和一个或多个消费者账户

  • 从创建者账户共享给消费者账户的一个或多个 AMI

  • 已安装 Terraform CLI(Terraform 文档)

  • Terraform AWS 提供程序,已配置(Terraform 文档)

  • (可选,但推荐)Terraform 后端,已配置(Terraform 文档)

  • Git,已安装

限制

  • 此模式使用账户 ID 监控已共享到特定账户的 AMI。此模式不会监控已使用组织 ID 共享给组织的 AMI。

  • AMI 只能共享给同一 AWS 区域 内的账户。此模式监控单个目标区域内的 AMI。要监控多个区域中 AMI 的使用情况,请在每个区域中部署此解决方案。

  • 此模式不会监控在部署此解决方案之前共享的任何 AMI。如果要监控以前共享的 AMI,可以取消共享 AMI,然后与消费者账户重新共享。

产品版本

  • Terraform 版本 1.2.0 或更高版本

  • Terraform AWS Provider 版本 4.20 或更高版本

架构

目标技术堆栈

以下资源通过 Terraform 预配为 IaC:

  • Amazon DynamoDB 表

  • 亚马逊 EventBridge 规则

  • AWS Identity and Access Management (IAM) 角色

  • AWS Lambda 函数

  • Amazon SES

目标架构

用于监控共享 AMI 使用情况并在 AMI 取消共享或取消注册时提醒用户的架构

图表显示了以下工作流:

  1. 创建者账户中的 AMI 与同一 AWS 区域 中的消费者账户共享。

  2. 共享 AMI 时,创建者账户中的 Amazon EventBridge 规则会捕获该ModifyImageAttribute事件并在创建者账户中启动 Lambda 函数。

  3. Lambda 函数将与 AMI 相关的数据存储在创建者账户的 DynamoDB 表中。

  4. 当消费者账户中的 AWS 服务使用共享 AMI 启动 Amazon EC2 实例,或者当共享 AMI 与启动模板关联时,使用者账户中的 EventBridge 规则会捕获共享 AMI 的使用情况。

  5. 该 EventBridge 规则在使用者账户中启动 Lambda 函数。Lambda 函数执行以下操作:

    1. Lambda 函数更新消费者账户的 DynamoDB 表中与 AMI 相关的数据。

    2. Lambda 函数代入创建者账户中的 IAM 角色,并更新创建者账户中的 DynamoDB 表。在 Mapping 表中,它创建一个项目,用于将实例 ID 或启动模板 ID 映射到其各自的 AMI ID。

  6. 在创建者账户中集中管理的 AMI 已弃用、取消注册或取消共享。

  7. 创建者账户中的 EventBridge 规则通过remove操作捕获ModifyImageAttributeDeregisterImage事件并启动 Lambda 函数。

  8. Lambda 函数检查 DynamoDB 表,以确定 AMI 是否在任何消费者账户中使用。如果 Mapping 表中没有与 AMI 关联的实例 ID 或启动模板 ID,则该过程已完成。

  9. 如果任何实例 ID 或启动模板 ID 与 Mapping 表中的 AMI 关联,则 Lambda 函数将使用 Amazon SES 向配置的订阅用户发送电子邮件通知。

工具

Amazon Web Services

  • Amazon DynamoDB 是一项完全托管的 NoSQL 数据库服务,可提供快速、可预测和可扩展的性能。

  • Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如,AWS Lambda 函数、使用 API 目标的 HTTP 调用端点或其他 Amazon Web Services account 中的事件总线。

  • AWS Identity and Access Management (AWS IAM) 通过控制验证和授权使用您 AWS 资源的用户,帮助您安全地管理对您 AWS 资源的访问。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,而无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

  • Amazon Simple Email Service (Amazon SES) 可帮助您使用自己的电子邮件地址和域发送和接收电子邮件。

其他工具

  • HashiCorp Terraform 是一种开源基础设施即代码 (IaC) 工具,可帮助您使用代码来配置和管理云基础架构和资源。

  • Python 是通用的计算机编程语言。

代码存储库

此模式的代码可在 GitHub cross-account-ami-monitoring-terraform- samples 存储库中找到。

最佳实践

操作说明

任务描述所需技能

创建名为配置文件的 AWS CLI。

为创建者账户和每个消费者账户创建名为配置文件的 AWS 命令行界面(AWS CLI)。有关说明,请参阅 AWS 入门资源中心中的设置 AWS CLI

DevOps 工程师

克隆存储库。

输入以下 命令。这将使用 SSH 从中克隆 cross-account-ami-monitoring-terraform-samples 存储库。 GitHub

git clone git@github.com:aws-samples/cross-account-ami-monitoring-terraform-samples.git
DevOps 工程师

更新 provider.tf 文件。

  1. 输入以下命令以导航到克隆存储库中的 terraform文件夹。

    cd cross-account-ami-monitoring/terraform
  2. 打开 provider.tf文件。

  3. 更新创建者账户和消费者账户的 Terraform AWS Provider 配置,如下所示:

    • 对于 alias,输入提供程序配置的名称。

    • 对于 region,输入您想要部署此解决方案的目标 AWS 区域。

    • 对于 profile,输入用于访问账户的 AWS CLI 命名配置文件。

  4. 如果要配置多个消费者账户,请为每个其他消费者账户创建一个配置文件。

  5. 保存并关闭 provider.tf文件。

有关配置提供程序的详细信息,请参阅 Terraform 文档中的多个提供程序配置

DevOps 工程师

更新 terraform.tfvars 文件。

  1. 打开 terraform.tfvars文件。

  2. account_email_mapping 参数中,为创建者账号和消费者账号配置告警,如下所示:

    • 对于 account,输入账户 ID。

    • 对于 email,输入要发送警报的电子邮件地址。每个账户只能输入一个电子邮件地址。

  3. 如果要配置多个消费者账户,请为每个其他消费者账户输入一个账户和电子邮件地址。

  4. 保存并关闭 terraform.tfvars文件。

DevOps 工程师

更新 main.tf 文件。

仅当将此解决方案部署到多个消费者账户时,才完成这些步骤。如果仅将此解决方案部署到一个消费者账户,则无需修改此文件。

  1. 打开 main.tf文件。

  2. 对于每个额外的消费者账户,创建一个基于模板中 consumer_account_A 模块的新模块。对于每个消费者账户,对于 provider,该值应与您在 provider.tf 文件中输入的别名匹配。

  3. 保存并关闭 main.tf文件。

DevOps 工程师
任务描述所需技能

部署解决方案。

在 Terraform CLI 中,输入以下命令以在创建者和消费者账户中部署 AWS 资源:

  1. 输入以下命令,以初始化 Terraform。

    terraform init
  2. 输入以下命令以验证 Terraform 配置。

    terraform validate
  3. 输入以下命令以创建 Terraform 执行计划。

    terraform plan
  4. 查看 Terraform 计划中的配置更改,并确认要实现这些更改。

  5. 输入以下命令以部署资源。

    terraform apply
DevOps 工程师

验证电子邮件地址身份。

在部署 Terraform 计划时,Terraform 为 Amazon SES 中的每个消费者账户创建了一个电子邮件地址身份。在向该电子邮件地址发送通知之前,您必须验证该电子邮件地址。有关说明,请参阅 Amazon SES 文档中的验证电子邮件地址身份

常规 AWS
任务描述所需技能

验证创建者账户中的部署。

  1. 登录创建者账户。

  2. 在导航栏中,确认正在查看目标区域。如果您位于其他区域,请选择当前显示的区域的名称,然后选择目标区域。

  3. 打开 DynamoDB 控制台:https://console.aws.amazon.com/dynamodb/

  4. 在导航窗格中,选择

  5. 在表列表中,验证 AmiShare 表是否存在。

  6. 通过 https://console.aws.amazon.com/lambda 打开 Lambda 控制台。

  7. 在导航窗格中,选择函数

  8. 在函数列表中,验证 ami-share 函数是否存在。

  9. 打开 IAM 控制台,网址为 https://console.aws.amazon.com/iamv2/

  10. 在导航窗格中,选择角色

  11. 在角色列表中,验证 external-ddb-role 角色是否存在。

  12. 打开 EventBridge 控制台,网址为 https://console.aws.amazon.com/events/

  13. 在导航窗格中,选择规则

  14. 在规则列表中,验证 modify_image_attribute_event 规则是否存在。

  15. 通过以下网址打开 Amazon SES 控制台:https:/console.aws.amazon.com/ses/

  16. 在导航窗格中,选择已验证身份

  17. 在身份列表中,验证是否已为每个消费者账户注册并验证了电子邮件地址身份。

DevOps 工程师

验证消费者账户中的部署。

  1. 登录消费者账户。

  2. 在导航栏中,确认正在查看目标区域。如果您位于其他区域,请选择当前显示的区域的名称,然后选择目标区域。

  3. 打开 DynamoDB 控制台:https://console.aws.amazon.com/dynamodb/

  4. 在导航窗格中,选择

  5. 在表列表中,验证 Mapping 表是否存在。

  6. 通过 https://console.aws.amazon.com/lambda 打开 Lambda 控制台。

  7. 在导航窗格中,选择函数

  8. 在函数列表中,验证 ami-usage-functionami-deregister-function 函数是否存在。

  9. 打开 EventBridge 控制台,网址为 https://console.aws.amazon.com/events/

  10. 在导航窗格中,选择规则

  11. 在规则列表中,验证 ami_usage_eventsami_deregister_events 规则是否存在。

DevOps 工程师
任务描述所需技能

在创建者账户中创建 AMI。

  1. 在创建者账户中,创建私有 AMI。有关说明,请参阅从 Amazon EC2 实例创建 AMI

  2. 与消费者账户之一共享新的 AMI。有关说明,请参阅与特定 Amazon Web Services account 共享 AMI

DevOps 工程师

使用消费者账户中的 AMI。

在消费者账户中,使用共享 AMI 创建 EC2 实例或启动模板。有关说明,请参阅如何从自定义 AMI 启动 EC2 实例(AWS re:Post 知识中心)或如何创建启动模板(Amazon EC2 Auto Scaling 文档)。

DevOps 工程师

验证监控和警报。

  1. 登录创建者账户。

  2. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  3. 在导航窗格中,选择 AMI

  4. 在列表中选择您的 AMI,然后选择操作、然后选择编辑 AMI 权限

  5. 共享账户部分中,选择消费者账户,然后选择删除所选项

  6. 选择保存更改

  7. 验证您为消费者账户定义的目标电子邮件地址是否收到 AMI 共享已取消的通知。

DevOps 工程师
任务描述所需技能

删除资源。

  1. 输入以下命令以删除此模式部署的资源并停止监控共享 AMI。

    terraform destroy
  2. 输入 yes 确认 destroy 命令。

DevOps 工程师

故障排除

问题解决方案

我没有收到电子邮件提醒。

未发送 Amazon SES 电子邮件的原因可能有多种。请检查以下事项:

  1. 操作说明部分中,使用验证资源部署操作说明来确认所有 Amazon Web Services account 中的基础设施均已正确配置。

  2. 验证 Ama CloudWatch zon 日志中的 Lambda 函数事件。有关说明,请参阅 Lambda 文档中的使用 CloudWatch 控制台。确认不存在权限问题,例如任何基于身份或基于资源的策略中的显式拒绝。有关更多信息,请参阅 IAM 文档中的策略评估逻辑

  3. 在 Amazon SES 中,验证电子邮件地址身份的状态是否为已验证。有关更多信息,请参阅验证电子邮件地址身份

相关资源

AWS 文档

Terraform 文档