

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

# 监控多个共享的 Amazon 系统映像的使用情况 AWS 账户
<a name="monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts"></a>

*Naveen Suthar 和 Sandeep Gawande，Amazon Web Services*

## Summary
<a name="monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts-summary"></a>

[亚马逊系统映像 (AMIs)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) 用于在您的亚马逊网络服务 ( EC2) 环境中创建亚马逊弹性计算云 (Amazon AWS) 实例。您可以在单独的集中式 AWS 账户 AMIs 中创建，在这种模式中该*账户称为创建者账户*。然后，您可以跨多个相同 AWS 账户 的 AMI 共享 AWS 区域，在此模式中这些*账户称为消费者账户*。通过单 AMIs 一账户进行管理可提供可扩展性并简化治理。[在消费者账户中，您可以在 Amazon A EC2 uto Scaling [启动模板](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-asg-launch-template.html)和亚马逊 Elastic Kubernetes Service (Amazon EKS) 节点组中引用共享的 AMI。](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html)

当共享 AMI [被弃用](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-deprecate.html)、[取消注册](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/deregister-ami.html)或[取消共享](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sharingamis-explicit.html)时，在使用者账户中引用 AMI 的 AWS 服务 无法使用此 AMI 启动新实例。任何自动扩缩事件或同一实例的重新启动都失败。这可能会导致生产环境中出现问题，例如应用程序停机或性能下降。当 AMI 共享和使用事件多次发生时 AWS 账户，可能很难监控此活动。

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

## 先决条件和限制
<a name="monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts-prereqs"></a>

**先决条件**
+ 两个或更多活跃账户 AWS 账户：一个创作者账户和一个或多个消费者账户
+ 一个或多个 AMIs 从创作者账户共享给消费者账户
+ [已安装](https://developer.hashicorp.com/terraform/cli) Terraform CLI（Terraform 文档）
+ Terraform P AWS rovider，[已配置](https://hashicorp.github.io/terraform-provider-aws/)（Terraform 文档）
+ （可选，但推荐）Terraform 后端，[已配置](https://developer.hashicorp.com/terraform/language/backend)（Terraform 文档）
+ Git，[已安装](https://github.com/git-guides/install-git)

**限制**
+ 此模式使用账户 ID 监视 AMIs 已共享给特定账户的内容。此模式不会监控 AMIs 已使用组织 ID 共享给组织的内容。
+ AMIs 只能共享给同一个账号 AWS 区域。这种模式 AMIs 在单个目标区域内进行监视。要监控多个区域 AMIs 的使用情况，请在每个区域部署此解决方案。
+ 此模式不会监视部署此解决方案之前共享的任何 AMIs 内容。如果您想监控之前共享的 AMIs，可以取消共享 AMI，然后将其重新共享给使用者账户。

**产品版本**
+ Terraform 版本 1.2.0 或更高版本
+ Terraform P AWS rovider 版本 4.20 或更高版本

## 架构
<a name="monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts-architecture"></a>

**目标技术堆栈**

以下资源通过 Terraform 预配为 IaC：
+ Amazon DynamoDB 表
+ 亚马逊 EventBridge 规则
+ AWS Identity and Access Management (IAM) 角色
+ AWS Lambda 函数
+ Amazon SES

**目标架构**

![\[用于监控共享 AMI 使用情况并在 AMI 取消共享或取消注册时提醒用户的架构\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/2d709249-0c68-47d7-be5d-46e8a73071ed/images/8c48c4dd-d681-4c32-9ba8-8f5ad2d66f64.png)


下图显示了如下工作流：

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

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

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

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

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

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

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

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

1. 创建者账户中的 EventBridge 规则通过`remove`操作捕获`ModifyImageAttribute`或`DeregisterImage`事件并启动 Lambda 函数。

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

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

## 工具
<a name="monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts-tools"></a>

**AWS 服务**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 是一项无服务器事件总线服务，可帮助您将应用程序与来自各种来源的实时数据连接起来。例如， AWS Lambda 函数、使用 API 目的地的 HTTP 调用端点或其他 AWS 账户目的地的事件总线。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用您的 AWS 资源，从而帮助您安全地管理对这些资源的访问。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [Amazon Simple Email Service (Amazon SES)](https://docs.aws.amazon.com/ses/latest/dg/Welcome.html) 可帮助您使用自己的电子邮件地址和域发送和接收电子邮件。

**其他工具**
+ [HashiCorp Terraform](https://www.terraform.io/docs) 是一款基础设施即代码（IaC）工具，可帮助您使用代码来预调配和管理云基础设施和资源。
+ [Python](https://www.python.org/) 是通用的计算机编程语言。

**代码存储库**

此模式的代码可在 GitHub [cross-account-ami-monitoring-terraform-](https://github.com/aws-samples/cross-account-ami-monitoring-terraform-samples) samples 存储库中找到。

## 最佳实践
<a name="monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts-best-practices"></a>
+ 遵循[使用 AWS Lambda 函数的最佳实践](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)。
+ 遵循[建筑的最佳实践 AMIs](https://docs.aws.amazon.com/marketplace/latest/userguide/best-practices-for-building-your-amis.html)。
+ 在创建 IAM 角色时，请遵循最低权限原则，并授予执行任务所需最小权限。有关更多信息，请参阅 IAM 文档中的[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)和[安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAMBestPracticesAndUseCases.html)。
+ 为这些 AWS Lambda 功能设置监控和警报。有关更多信息，请参阅 [Lambda 函数监控和故障排除](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html)。

## 操作说明
<a name="monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts-epics"></a>

### 自定义 Terraform 配置文件
<a name="customize-the-terraform-configuration-files"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建已命 AWS CLI 名的配置文件。 | 为创建者账户和每个消费者账户创建一个 AWS Command Line Interface (AWS CLI) 命名的个人资料。有关说明，请参阅 AWS CLI在[AWS 入门资源中心进行设置](https://aws.amazon.com/getting-started/guides/setup-environment/module-three/)。 | DevOps 工程师 | 
| 克隆存储库。 | 输入如下命令。这将使用 SSH 从中克隆 [cross-account-ami-monitoring-terraform-samples 存储库](https://github.com/aws-samples/cross-account-ami-monitoring-terraform-samples)。 GitHub <pre>git clone git@github.com:aws-samples/cross-account-ami-monitoring-terraform-samples.git</pre> | DevOps 工程师 | 
| 更新 provider.tf 文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.html)有关配置提供程序的详细信息，请参阅 [Terraform 文档中的多个提供程序配置](https://developer.hashicorp.com/terraform/language/providers/configuration#alias-multiple-provider-configurations)。 | DevOps 工程师 | 
| 更新 terraform.tfvars 文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.html) | DevOps 工程师 | 
| 更新 main.tf 文件。 | 仅当将此解决方案部署到多个消费者账户时，才完成这些步骤。如果仅将此解决方案部署到一个消费者账户，则无需修改此文件。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.html) | DevOps 工程师 | 

### 使用 Terraform 部署解决方案
<a name="deploy-the-solution-by-using-terraform"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署解决方案。 | 在 Terraform CLI 中，输入以下命令以在创建者和使用者账户中部署 AWS 资源：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.html) | DevOps 工程师 | 
| 验证电子邮件地址身份。 | 在部署 Terraform 计划时，Terraform 为 Amazon SES 中的每个消费者账户创建了一个电子邮件地址身份。在向该电子邮件地址发送通知之前，您必须验证该电子邮件地址。有关说明，请参阅 Amazon SES 文档中的[验证电子邮件地址身份](https://docs.aws.amazon.com/ses/latest/dg/creating-identities.html#just-verify-email-proc)。 | 常规 AWS | 

### 验证资源部署
<a name="validate-resource-deployment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证创建者账户中的部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.html) | DevOps 工程师 | 
| 验证消费者账户中的部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.html) | DevOps 工程师 | 

### 验证监控
<a name="validate-monitoring"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在创建者账户中创建 AMI。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.html) | DevOps 工程师 | 
| 使用消费者账户中的 AMI。 | 在消费者账户中，使用共享的 AMI 创建 Amazon EC2 实例或启动模板。有关说明，请参阅[如何从自定义 AMI 启动亚马逊 EC2 实例（re AWS : Post 知识中心）或为](https://repost.aws/knowledge-center/launch-instance-custom-ami) Auto S [caling 组创建启动模板（Ama EC2 zon Auto Sc](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html) aling 文档）。 | DevOps 工程师 | 
| 验证监控和警报。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.html) | DevOps 工程师 | 

### （可选）停止监控共享 AMIs
<a name="optional-stop-monitoring-shared-amis"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除资源。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.html) | DevOps 工程师 | 

## 问题排查
<a name="monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 我没有收到电子邮件提醒。 | 未发送 Amazon SES 电子邮件的原因可能有多种。请检查以下事项：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts.html) | 

## 相关资源
<a name="monitor-use-of-a-shared-amazon-machine-image-across-multiple-aws-accounts-resources"></a>

**AWS 文档**
+ [使用 Python 构建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)（Lambda 文档）
+ [创建 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-ami.html)（亚马逊 EC2 文档）
+ [与特定人员共享 AMI AWS 账户](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sharingamis-explicit.html)（亚马逊 EC2 文档）
+ [注销您的 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/deregister-ami.html)（亚马逊 EC2 文档）

**Terraform 文档**
+ [安装 Terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli)
+ [Terraform 后端配置](https://www.terraform.io/language/settings/backends/configuration)
+ [Terraform AWS Provider](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)
+ [Terraform 二进制下载](https://developer.hashicorp.com/terraform/install)