使用 Terraform 在 AWS Organizations 中集中分发软件包 - AWS Prescriptive Guidance

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

使用 Terraform 在 AWS Organizations 中集中分发软件包

由 Pradip kumar Pandey (AWS)、Aarti Rajput (AWS)、Chintamani Aphale (AWS)、T.V.R.L.Phani Kumar Dadi (AWS)、Mayuri Shinde (AWS) 和 Pratap Kumar Nanda (AWS) 创作

摘要

为了 AWS 区域 在工作负载之间建立强大的隔离屏障 AWS 账户 ,企业通常会维护多个分散在多个工作负载中的多个分布。为了保持安全和合规,他们的管理团队安装了基于代理的工具,例如CrowdStrikeSentinelOne、或用于安全扫描的TrendMicro工具,以及用于监控的 Amazon CloudWatch 代理Datadog Agen t 或代AppDynamics 理。当这些团队想要在这个广阔的环境中集中自动化软件包管理和分发时,他们通常会面临挑战。

Dist@@ ri butor 是一项功能 AWS Systems Manager,它通过一个简化的界面,自动将软件打包和发布到云端和本地服务器上的托管 Microsoft Windows 和 Linux 实例。此模式演示了如何使用 Terraform 进一步简化管理软件安装的过程,并以最少的努力在大量实例和成员帐户中 AWS Organizations 运行脚本。

此解决方案适用于由 Systems Manager 管理的亚马逊、Linux 和 Windows 实例。

先决条件和限制

架构

资源详细信息

此模式使用 Account F actory for Terraform (AFT) 创建所有必需的 AWS 资源,并使用代码管道在部署账户中部署资源。代码管道在两个存储库中运行:

  • 全局自定义包含 Terraform 代码,该代码将在所有在 AFT 注册的账户中运行。

  • 账户自定义包含将在部署账户中运行的 Terraform 代码。

您也可以在不使用 AFT 的情况下部署此解决方案,方法是在账户自定义文件夹中运行 Terraform 命令。

Terraform 代码部署了以下资源:

  • AWS Identity and Access Management (IAM) 角色和策略

  • 压缩文件和软件包的 manifest.json

    • 在 Systems Manager 中,软件至少包含一个包含软件或可安装资产的.zip 文件。

    • JSON 清单包含指向您的软件包代码文件的指针。

  • S3 存储桶

    • 跨组织共享的分布式包安全地存储在 Amazon S3 存储桶中。

  • AWS Systems Manager 文档(SSM 文档)

    • DistributeSoftwarePackage包含将软件包分发到成员账户中每个目标实例的逻辑。

    • AddSoftwarePackageToDistributor包含打包可安装软件资产并将其添加到 Automation 的逻辑,该功能为 AWS Systems Manager。

  • Systems Manager 关联

    • Systems Manager 关联用于部署解决方案。

架构和工作流程

在 AWS Organizations 中集中分发软件包的架构图

下图说明了以下步骤:

  1. 要从集中式账户运行解决方案,您需要将软件包或软件以及部署步骤上传到 S3 存储桶。

  2. 您的自定义包将显示在 Systems Manager 控制台的 “文档” 部分的 “我所有” 选项卡中。

  3. State Manager 是 Systems Manager 的一项功能,用于在整个组织中创建、安排和运行软件包的关联。该关联规定,必须先在托管节点上安装并运行软件包,然后才能将其安装到目标节点上。

  4. 该关联指示 Systems Manager 在目标节点上安装软件包。

  5. 对于后续的任何安装或更改,用户可以定期运行相同的关联,也可以从单个位置手动运行相同的关联,以跨账户执行部署。

  6. 在成员账户中,Automation 会向分销商发送部署命令。

  7. 分销商跨实例分发软件包。

此解决方案使用其中的管理帐户 AWS Organizations,但您也可以指定一个帐户(委托管理员)来代表组织对其进行管理。

工具

Amazon Web Services

  • Amazon Simple Storage Service(Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。这种模式使用 Amazon S3 来集中和安全地存储分发的软件包。

  • AWS Systems Manager 可帮助您管理在 AWS 云中运行的应用程序和基础设施。它简化了应用程序和资源管理,缩短了检测和解决操作问题的时间,并帮助您大规模安全地管理 AWS 资源。此模式使用以下 Systems Manager 功能:

    • Dist@@ ri butor 可以帮助您将软件打包并发布到 Systems Manager 托管实例。

    • 自动化简化了许多 AWS 服务的常见维护、部署和补救任务。

    • 文档在您的组织和账户中对您的 Systems Manager 托管实例执行操作。

  • AWS Organizations是一项账户管理服务,可帮助您将多个 AWS 账户整合到一个由您创建和集中管理的组织中。

其他工具

  • Terraform 是一款基础设施即代码 (IaC) 工具 HashiCorp ,可帮助您创建和管理云和本地资源。

代码存储库

此模式的说明和代码可在 GitHub 集中式包分发存储库中找到。

最佳实践

操作说明

Task描述所需技能

克隆存储库。

  1. 克隆 GitHub 集中式软件包分发存储库:

    git clone https://github.com/aws-samples/aws-organization-centralised-package-distribution
  2. Terraform 代码存储库需要两个由 AFT 管理的自定义文件夹。确认存储库的本地副本包含以下文件夹:

    $ cd centralised-package-distribution $ ls global-customization account-customization
DevOps 工程师

更新全局变量。

更新global-customization/variables.tf文件中的以下输入参数。这些变量适用于由 AFT 创建和管理的所有账户。

  • account_id:将在其中部署分销商解决方案的账户的 ID。

  • aws_region: 协会将部署到 AWS 区域 哪里。

DevOps 工程师

更新账户变量。

更新account-customization/variables.tf文件中的以下输入参数。这些变量仅适用于由 AFT 创建和管理的特定账户。

  • package_bucket_name:包含软件包分发文件的 S3 存储桶的名称。

  • package_name:软件包分发文件的名称。

  • package_version:安装程序的软件包版本。

DevOps 工程师
Task描述所需技能

更新状态管理器关联的输入参数。

更新account-customization/association.tf文件中的以下输入参数以定义要在实例上保持的状态。如果默认参数值支持您的用例,则可以使用它们。

  • targetAccounts:AWS Organizati IDs ons 中的组织单位 (OU),代表拥有要分配的目标实例的账户。OU 以 “ou” IDs 开头。

  • targetRegions: 目标实例正在 AWS 区域 运行的(例如 “us-east-1” 或 “ap-southeast-2”)。

  • action指定是安装还是卸载软件包。

  • installationType: 以下安装类型之一:

    • uninstall: 软件包已卸载。

    • reinstall:在重新安装过程完成之前,应用程序将处于离线状态。

    • In-place update:在安装中添加新的或更新的文件时,应用程序可用。

  • name:要安装或卸载的软件包的名称。

  • version要安装或卸载的软件包的版本。如果未安装任何版本的软件包,系统将返回错误。

  • bucketName软件包已部署到的 S3 存储桶名称。此存储桶应仅包含软件包和清单文件。

  • bucketPrefix: 存储包资产的 S3 前缀。

  • AutomationAssumeRole: 的亚马逊资源名称 (ARN)。SystemsManager-AutomationAdministrationRole

DevOps 工程师

准备压缩文件和软件包的manifest.json文件。

此模式在文件夹中提供了带有 PowerShell 安装和卸载脚本的可安装文件示例(Windows 为.msi,Linux 为.rpm)。account-customization/package

  1. 用您自己的文件替换 PowerShell 可安装文件,或者提供可安装文件、安装和卸载脚本以及清单文件,以便在您账户的account-customization文件夹中创建软件包。

  2. 根据您的要求自定义 Terraform 在account-customization文件夹中生成的默认manifest.json文件。

DevOps 工程师
Task描述所需技能

初始化 Terraform 配置。

要使用 AFT 自动部署解决方案,请将代码推送到 AWS CodeCommit:

$ git add * $ git commit -m "message" $ git push

您也可以在不使用 AFT 的情况下通过从文件夹中运行 Terraform 命令来部署此解决方案。account-customization要初始化包含 Terraform 文件的工作目录,请运行:

$ terraform init
DevOps 工程师

预览更改。

要预览 Terraform 将对基础架构所做的更改,请运行以下命令:

$ terraform plan

此命令评估 Terraform 配置,以确定已声明资源的所需状态。它还将所需状态与要在工作空间中配置的实际基础架构进行比较。

DevOps 工程师

应用更改。

运行以下命令以实现您对variables.tf文件所做的更改:

$ terraform apply
DevOps 工程师
Task描述所需技能

验证 SSM 文档的创建。

  1. Systems Manager 控制台的左侧导航窗格中,选择 “文档”。

  2. 选择 我拥有的选项卡。

您应该会看到DistributeSoftwarePackageAddSoftwarePackageToDistributor软件包。

DevOps 工程师

验证自动化是否成功部署。

  1. 在 Systems Manager 控制台的左侧导航窗格中,选择自动化

  2. 自动化执行列表中,您应该看到最新的执行DistributeSoftwarePackageAddSoftwarePackageToDistributor部署。

  3. 选择 “执行 ID” 以验证他们是否成功完成。

DevOps 工程师

验证软件包是否已部署到目标成员账户实例。

  1. 在 Systems Manager 控制台的导航窗格中,选择运行命令

  2. 命令历史记录中,您将看到每次调用及其状态。

  3. 选择任意命令 ID 以查看每个目标实例的部署历史记录。

  4. 选择实例 ID,然后在 “输出” 部分查看分布。

DevOps 工程师

故障排除

事务解决方案

状态经理关联失败或停留在待处理状态。

请参阅 AWS 知识中心中的疑难解答信息

计划关联无法运行。

您的日程安排规格可能无效。状态管理器目前不支持在 cron 表达式中为关联指定月份。使用 cron 或费率表达式来确认日程安排。

相关资源