使用 Terraform 在 AWS Organizations 中集中分发软件包 - AWS 规范指引

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

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

Pradip kumar Pandey、Chintamani Aphale、T.V.R.L.Phani Kumar Dadi、Pratap Kumar Nanda、Aarti Rajput 和 Mayuri Shinde,Amazon Web Services

Summary

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

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

此解决方案适用于由 Systems Manager 管理的 Amazon、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 会向 Distributor 发送部署命令。

  7. Distributor 跨实例分发软件包。

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

工具

Amazon Web Services

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

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

    • Distributor 可以帮助您打包软件并将其发布到 Systems Manager 托管实例。

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

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

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

其他工具

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

代码存储库

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

最佳实践

  • 要向关联分配标签,请使用 AWS Command Line Interface (AWS CLI)AWS Tools for PowerShell。不支持使用 Systems Manager 控制台将标签添加到关联。有关更多信息,请参阅 Systems Manager 文档中的标记 Systems Manager 资源

  • 要使用共享自另一个账户的文档的新版本来运行关联,将文档版本设置为 default

  • 要仅为目标节点添加标签,请使用一个标签键。如果要使用多个标签键将您的节点设为目标,请使用资源组选项。

操作说明

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:将部署 Distributor 解决方案的账户的 ID。

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

DevOps 工程师

更新账户变量。

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

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

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

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

DevOps 工程师
Task说明所需技能

更新 State Manager 关联的输入参数。

更新 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 前缀。

  • AutomationAssumeRoleSystemsManager-AutomationAdministrationRole 的 Amazon 资源名称(ARN)。

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 的情况下通过从 account-customization 文件夹中运行 Terraform 命令来部署此解决方案。要初始化包含 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 工程师

问题排查

问题解决方案

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

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

计划关联无法运行。

您的日程安排可能无效。State Manager 目前不支持在 cron 表达式中为关联指定月数。使用 cron 或 rate 表达式来确认计划。

相关资源