監控跨多個 AWS 帳戶共用 Amazon 機器映像的使用 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

監控跨多個 AWS 帳戶共用 Amazon 機器映像的使用

由納文·薩塔爾(AWS)和桑迪普·蓋萬德(AWS)創建

代碼存儲庫:cross-account-ami-auditing-地形樣本

環境:PoC 或試點

技術:管理與治理 DevOps;無伺服器;營運

AWS 服務:Amazon DynamoDB;AWS Lambda;Amazon EventBridge

Summary

Amazon 機器映像(AMI)用於在 Amazon 網絡服務(AWS)環境中創建亞馬遜彈性計算雲(亞馬遜 EC2)實例。您可以在單獨的集中式 AWS 帳戶中建立 AMI,此帳戶在此模式中稱為建立者帳戶。然後,您可以在同一個 AWS 區域中的多個 AWS 帳戶共用 AMI,這些帳戶在此模式中稱為消費者帳戶。從單一帳戶管理 AMI 可提供擴充性並簡化控管。在消費者帳戶中,您可以參考 Amazon EC2 自動擴展啟動範本和 Amazon Elastic Kubernetes Service (Amazon EKS) 節點群組中的共用 AMI。

當共用 AMI 遭到淘汰、取消註冊取消共用時,在消費者帳戶中參考 AMI 的 AWS 服務將無法使用此 AMI 啟動新執行個體。相同執行個體的任何 auto 縮放事件或重新啟動都會失敗。這可能會導致生產環境中的問題,例如應用程式停機或效能降低。當 AMI 共用和使用事件發生在多個 AWS 帳戶中時,可能很難監控此活動。

此模式可協助您監控相同區域中帳戶之間的共用 AMI 使用情況和狀態。它使用無伺服器 AWS 服務,例如 Amazon EventBridge、亞 Amazon DynamoDB、AWS Lambda 和 Amazon Simple Email Service (Amazon SES)。您可以使用 HashiCorp Terraform 將基礎架構佈建為程式碼 (IaC)。當消費者帳戶中的服務參考已取消註冊或未共用的 AMI 時,此解決方案會提供警示。

先決條件和限制

先決條件

  • 兩個或多個有效 AWS 帳戶:一個創作者帳戶和一個或多個消費者帳戶

  • 從建立者帳戶共用至消費者帳戶的一或多個 AMI

  • 地形 CLI,已安裝(地形文檔)

  • 地形 AWS 供應商,已設定 (地形文件)

  • (可選,但建議使用)地形後端,已配置(地形文檔)

  • Git,已安裝

限制

  • 此病毒碼會使用帳戶 ID 監控已共用至特定帳戶的 AMI。此模式不會使用組織 ID 監視已共用給組織的 AMI。

  • AMI 只能共用至相同 AWS 區域內的帳戶。此病毒碼會監控單一目標區域內的 AMI。若要監控多個區域中 AMI 的使用情況,請在每個區域部署此解決方案。

  • 此病毒碼不會監控在部署此解決方案之前共用的任何 AMI。如果您想要監視先前共用的 AMI,您可以取消共用 AMI,然後與消費者帳戶重新共用。

產品版本

  • 地形版本 1.2.0 或更高版本

  • 地形 AWS 供應商 4.20 版或更新版本

架構

目標技術堆疊

以下資源被佈建為 IaC 通過地形:

  • Amazon DynamoDB 資料表

  • Amazon 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 規則會使用動作擷取ModifyImageAttributeDeregisterImage事件,並啟remove動 Lambda 函數。

  8. Lambda 函數會檢查 DynamoDB 資料表,以判斷是否在任何取用者帳戶中使用 AMI。如果Mapping表格中沒有與 AMI 相關聯的執行個體 ID 或啟動範本 ID,則程序已完成。

  9. 如果任何執行個體 ID 或啟動範本 ID 與Mapping表格中的 AMI 相關聯,則 Lambda 函數會使用 Amazon SES 傳送電子郵件通知給已設定的訂閱者。

工具

AWS 服務

  • Amazon DynamoDB 是一項全受管 NoSQL 資料庫服務,可提供快速、可預期且可擴展的效能。

  • Amazon EventBridge 是無伺服器事件匯流排服務,可協助您將應用程式與來自各種來源的即時資料連接起來。例如,AWS Lambda 函數、使用 API 目的地的 HTTP 叫用端點,或其他 AWS 帳戶中的事件匯流排。

  • AWS Identity and Access Management (IAM) 可透過控制誰經過身份驗證和授權使用 AWS 資源,協助您安全地管理對 AWS 資源的存取。

  • AWS Lambda 是一種運算服務,可協助您執行程式碼,而不需要佈建或管理伺服器。它只會在需要時執行程式碼並自動調整規模,因此您只需為使用的運算時間付費。

  • Amazon Simple Email Service (Amazon SES) 可協助您使用自己的電子郵件地址和網域來傳送和接收電子郵件。

其他工具

  • HashiCorp Terraform 是一種開放原始碼基礎結構即程式碼 (IaC) 工具,可協助您使用程式碼來佈建和管理雲端基礎架構和資源。

  • Python 是一種通用的計算機編程語言。

代碼存儲庫

此模式的代碼可在 GitHub cross-account-ami-monitoring-terra form 樣本存儲庫中找到。

最佳實務

史诗

任務描述所需技能

建立 AWS CLI 命名的設定檔。

對於建立者帳戶和每個消費者帳戶,請建立一個名為 AWS Command Line Interface (AWS CLI) (AWS CLI) 的設定檔。如需指示,請參閱 AWS 入門資源中心中的設定 AWS CLI

DevOps 工程師

複製儲存庫。

輸入以下命令。這通過使用 SSH 克隆 cross-account-ami-monitoring-terraform 樣本存儲庫。 GitHub

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

更新提供程序 .tf 文件。

  1. 輸入下列命令以導覽至複製儲存庫中的terraform資料夾。

    cd cross-account-ami-monitoring/terraform
  2. 開啟 provider.tf 檔案。

  3. 更新建立者帳戶和消費者帳戶的 Terraform AWS 供應商組態,如下所示:

    • 在中alias,輸入提供者組態的名稱。

    • 對於region,輸入您要在其中部署此解決方案的目標 AWS 區域。

    • 對於profile,輸入用於存取帳戶的 AWS CLI 命名設定檔。

  4. 如果您要設定一個以上的消費者帳戶,請為每個額外的消費者帳戶建立設定檔。

  5. 儲存並關閉 provider.tf 檔案。

如需有關設定提供者的詳細資訊,請參閱 Terraform 文件中的多個提供者組態

DevOps 工程師

更新地界形 .tfvars 檔案。

  1. 開啟 terraform.tfvars 檔案。

  2. account_email_mapping參數中,設定建立者帳戶和消費者帳戶的警示,如下所示:

    • 對於account,輸入帳戶 ID。

    • 對於email,輸入您要傳送警示的電子郵件地址。每個帳戶只能輸入一個電子郵件地址。

  3. 如果您要設定多個消費者帳戶,請為每個額外的消費者帳戶輸入一個帳戶和電子郵件地址。

  4. 儲存並關閉 terraform.tfvars 檔案。

DevOps 工程師

更新主要 .tf 檔案。

只有在將此解決方案部署到多個用戶帳戶時,才完成這些步驟。如果您只將此解決方案部署到一個消費者帳戶,則不需要修改此檔案。

  1. 開啟 main.tf 檔案。

  2. 對於每個額外的消費者帳戶,請根據模板中的consumer_account_A模塊創建一個新模塊。對於每個消費者帳戶而言provider,值應與您在provider.tf檔案中輸入的別名相符。

  3. 儲存並關閉 main.tf 檔案。

DevOps 工程師
任務描述所需技能

部署解決方案。

在 Terraform CLI 中,輸入下列命令,在建立者和消費者帳戶中部署 AWS 資源:

  1. 輸入以下命令來初始化地形。

    terraform init
  2. 輸入下列指令以驗證地形組態。

    terraform validate
  3. 輸入下列命令以建立 Terraform 執行計畫。

    terraform plan
  4. 檢閱 Terraform 計劃中的組態變更,並確認您要實作這些變更。

  5. 輸入以下命令以部署資源。

    terraform apply
DevOps 工程師

驗證電子郵件地址身份。

部署 Terraform 方案時,Terraform 會在 Amazon SES 中為每個消費者帳戶建立電子郵件地址身分。您必須先驗證電子郵件地址,才能將通知傳送到該電子郵件地址。如需指示,請參閱 Amazon SES 文件中的驗證電子郵件地址身分

一般 AWS
任務描述所需技能

驗證建立者帳戶中的部署。

  1. 登入建立者帳戶。

  2. 在導覽列中,確認是否正在檢視目標「區域」。如果您位於不同的區域,請選擇目前顯示的區域名稱,然後選擇目標地區。

  3. 請在 https://console.aws.amazon.com/dynamodb/ 開啟 DynamoDB 主控台。

  4. 在導覽窗格中,選擇 Tables (資料表)。

  5. 在表格清單中,驗證資料AmiShare表是否存在。

  6. 開啟 Lambda 主控台,網址為 https://console.aws.amazon.com/lambda

  7. 在導覽視窗中,選擇函數

  8. 在函數清單中,驗證ami-share函數是否存在。

  9. 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. 請在 https://console.aws.amazon.com/dynamodb/ 開啟 DynamoDB 主控台。

  4. 在導覽窗格中,選擇 Tables (資料表)。

  5. 在表格清單中,驗證資料Mapping表是否存在。

  6. 開啟 Lambda 主控台,網址為 https://console.aws.amazon.com/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。如需指示,請參閱與特定 AWS 帳戶共用 AMI

DevOps 工程師

在消費者帳戶中使用 AMI。

在消費者帳戶中,使用共用 AMI 建立 EC2 執行個體或啟動範本。如需指示,請參閱如何從自訂 AMI 啟動 EC2 執行個體 (AWS RE: POST 知識中心) 或如何建立啟動範本 (Amazon EC2 Auto Scaling 文件)。

DevOps 工程師

驗證監控和警示。

  1. 登入建立者帳戶。

  2. https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  3. 在導覽窗格中,選擇 AMIs (AMI)。

  4. 選取清單中的 AMI,然後選擇 [動作]、[編輯 AMI 權限]。

  5. 在 [共用帳戶] 區段中,選取消費者帳戶,然後選擇 [移除選取項目]。

  6. 選擇儲存變更

  7. 驗證您為消費者帳戶定義的目標電子郵件地址是否會收到 AMI 已取消共用的通知。

DevOps 工程師
任務描述所需技能

刪除資源。

  1. 輸入下列命令以移除此病毒碼部署的資源,並停止監視共用 AMI。

    terraform destroy
  2. 輸入以確認destroy指令yes

DevOps 工程師

故障診斷

問題解決方案

我沒有收到電子郵件提示。

未傳送 Amazon SES 電子郵件的原因可能有多種。請檢查以下內容:

  1. Epics 區段中,使用驗證資源部署史詩來確認基礎設施已在所有 AWS 帳戶中正確佈建。

  2. 驗證 Amazon CloudWatch 日誌中的 Lambda 函數事件。如需指示,請參閱 Lambda 文件中的使用 CloudWatch 主控台。確認沒有權限問題,例如在任何以身分識別為基礎或以資源為基礎的策略中明確拒絕。如需詳細資訊,請參閱 IAM 文件中的政策評估邏輯

  3. 在 Amazon SES 中,驗證電子郵件地址身分的狀態是否為「驗證」。如需詳細資訊,請參閱驗證電子郵件地址身分

相關資源

AWS 文件

地形文件