AWS Systems Manager
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

创建软件包

要创建软件包,请准备您的可安装软件或资产,每个操作系统平台一个文件。需要至少一个文件才能创建软件包。

有时,不同的平台可以使用同一个文件,但附加到软件包的所有文件都必须列在清单的 Files 部分中。如果您在控制台中使用简单工作流程创建软件包,则会为您生成清单。最多可以向一个文档附加 20 个文件。每个文件的最大大小为 1 GB。有关支持的平台的更多信息,请参阅 支持的软件包平台和架构

创建软件包时,您添加的是一个新的 SSM 文档。此文档让您能够将软件包部署到托管实例。

您可以从我们的网站下载示例软件包 ExamplePackage.zip。示例软件包中有一个完整的 JSON 清单和三个 ZIP 文件。虽然您必须将每个软件可安装文件和脚本压缩为 ZIP 文件以便在高级工作流程中创建软件包,但您不能在简单工作流程中压缩可安装资产。

创建软件包(简单)

本节介绍如何通过在 Distributor 控制台中选择简单软件包创建工作流程来在 Distributor 中创建软件包。要创建软件包,请准备您的可安装资产,每个操作系统平台一个文件。需要至少一个文件才能创建软件包。简单软件包创建过程为您生成安装和卸载脚本、文件哈希以及 JSON 格式的清单。简单工作流程处理上传和压缩可安装文件以及创建新软件包和关联的 SSM 文档的过程。有关支持的平台的更多信息,请参阅 支持的软件包平台和架构

创建软件包(简单)

  1. 通过以下网址打开 AWS Systems Manager 控制台:https://console.amazonaws.cn/systems-manager/

  2. 在导航窗格中,选择 Distributor

  3. 在 Distributor 主页上,选择 Create package (创建软件包),然后选择简单

  4. Create package (创建软件包) 页面上,输入软件包的名称。软件包名称可以包含字母、数字、句点、短划线和下划线。名称应足够通用,以适用于所有版本的软件包附件,但又足够具体,可用于识别软件包的用途。

  5. Version name (版本名称) 中,输入版本名称。版本名称最多为 512 个字符,并且不能包含特殊字符。

  6. 对于 S3 存储桶名称,从列表中选择现有的 S3 存储桶。

  7. S3 键前缀中,输入存储桶中存储可安装资产的子文件夹。

  8. Upload software (上传软件) 中,浏览后缀为 .rpm.msi.deb 的可安装软件文件。您可以在单个操作中上传多个软件文件。

  9. 对于目标平台,请验证为每个可安装文件显示的目标操作系统平台是否正确。如果显示的操作系统不正确,请从下拉列表中选择正确的操作系统。

    简单软件包创建工作流程中,由于您只上传每个可安装文件一次,因此需要额外的步骤来指示 Distributor 在多个操作系统上将单个文件指定为目标。例如,如果您上传名为 Logtool_v1.1.1.rpm 的可安装软件文件,则必须更改简单工作流程中的某些默认值,以同时在 Amazon Linux 和 Ubuntu 操作系统上将相同的软件指定为目标。您可以执行以下操作之一来解决此限制。

    • 改用高级工作流程,在开始之前将每个可安装文件压缩为 ZIP 文件,然后手动创建清单,以便可以在多个操作系统平台或版本中将一个可安装文件指定为目标。有关更多信息,请参阅 创建软件包(高级)

    • 简单工作流程中手动编辑清单文件,以便在多个操作系统平台或版本中将您的 ZIP 文件指定为目标。有关如何执行此操作的更多信息,请参阅步骤 2:创建 JSON 软件包清单中步骤 4 的末尾。

  10. 对于平台版本,验证所显示的操作系统平台版本是 _any 或您希望软件应用的确切的特定操作系统发行版本。有关指定操作系统平台版本的更多信息,请参阅步骤 2:创建 JSON 软件包清单中的步骤 4。

  11. 对于架构,请从下拉列表中为每个可安装文件选择正确的处理器架构。有关支持的处理器架构的更多信息,请参阅支持的软件包平台和架构

  12. (可选)展开 Installation and uninstallation scripts (安装和卸载脚本),并查看 Distributor 为可安装软件生成的脚本。

  13. 要添加更多可安装的软件文件,请选择 Add software (添加软件)。否则,转到下一步。

  14. (可选)展开清单,然后审核 Distributor 为您的可安装软件包生成的 JSON 清单。如果您在开始此过程后更改了有关软件的任何信息(例如平台版本或目标平台),请选择 Generate manifest (生成清单) 以显示更新的软件包清单。

    如果要将可在多个操作系统上安装的软件指定为目标,则可以手动编辑清单,如步骤 8 中所述。有关编辑该清单的更多信息,请参阅步骤 2:创建 JSON 软件包清单

  15. 完成添加软件并查看目标操作系统平台、版本和处理器架构数据后,选择 Upload software and create package (上传软件并创建软件包)

  16. 等待 Distributor 完成上传软件和创建软件包。 Distributor 显示每个可安装文件的上传状态。根据要添加的软件包的数量和大小,这可能需要几分钟时间。Distributor 会自动将您重定向到新软件包的 Package details (软件包详细信息) 页面,但您可以选择在上传软件之后自行打开此页面。Package details (软件包详细信息) 页面不会显示有关软件包的所有信息,直到 Distributor 完成软件包创建过程。要停止上传和软件包创建过程,请选择取消

  17. 如果 Distributor 无法上传任何软件可安装文件,它会显示 Upload failed (上传失败) 消息。要重试上传,请选择 Retry upload (重试上传)。有关如何排除软件包创建失败的更多信息,请参阅对 AWS Systems Manager Distributor 进行故障排除

创建软件包(高级)

在本节中,了解高级用户在将压缩有安装和卸载脚本的可安装资产以及 JSON 清单文件上传到 Amazon S3 存储桶后,如何在 Distributor 中创建软件包。

要创建软件包,请准备好可安装资产的 ZIP 文件(每个操作系统平台一个 ZIP 文件)。需要至少一个 ZIP 文件才能创建软件包。接下来,创建 JSON 清单。清单包含指向软件包代码文件的指针。将所需的代码文件添加到一个文件夹,并为清单填充正确的值。然后,将软件包上传到 Amazon S3 存储桶。

您可以从我们的网站下载示例软件包 ExamplePackage.zip。示例软件包中有一个完整的 JSON 清单和三个 ZIP 文件。

步骤 1:创建 ZIP 文件

软件包必须包含至少一个软件或可安装资产的 ZIP 文件。除了可在多个操作系统上安装同一个 ZIP 文件的情况,软件包必须为要支持的每个操作系统包含一个 ZIP 文件。例如,Red Hat Enterprise Linux 和 Amazon Linux 实例通常可以运行相同的 .RPM 可执行文件,因此只需在软件包中附加一个 ZIP 文件就能同时支持这两种操作系统。

每个 ZIP 文件都需要以下项目:

  • 一个 install 和一个 uninstall 脚本。基于 Windows 的实例需要 PowerShell 脚本(名为 install.ps1uninstall.ps1 的脚本)。基于 Linux 的实例需要 Shell 脚本(名为 install.shuninstall.sh 的脚本)。SSM 代理 运行 installuninstall 脚本中的指令。

    例如,您的安装脚本可以运行安装程序,如 RPM 或 MSI,它们可以复制文件或设置配置设置。

  • 可执行文件、安装软件包(RPM、DEB、MSI 等)、其他脚本或配置文件等。

有关 ZIP 文件的示例,包括示例 installuninstall 脚本,请下载示例软件包 ExamplePackage.zip

步骤 2:创建 JSON 软件包清单

准备并压缩可安装文件后,需要创建一个 JSON 清单。模板如下。本节中的过程将对清单模板的各个部分进行说明。您可以使用 JSON 编辑器在单独的文件中创建此清单。或者,也可以在创建软件包时在 AWS Systems Manager 控制台中创建清单。

{ "schemaVersion": "2.0", "version": "your-version", "publisher": "optional-publisher-name", "packages": { "platform": { "platform-version": { "architecture": { "file": "ZIP-file-name-1.zip" } } }, "another-platform": { "platform-version": { "architecture": { "file": "ZIP-file-name-2.zip" } } }, "another-platform": { "platform-version": { "architecture": { "file": "ZIP-file-name-3.zip" } } } }, "files": { "ZIP-file-name-1.zip": { "checksums": { "sha256": "checksum" } }, "ZIP-file-name-2.zip": { "checksums": { "sha256": "checksum" } } } }

创建 JSON 软件包清单

  1. 将架构版本添加到清单。在此版本中,架构版本始终为 2.0

    { "schemaVersion": "2.0",
  2. 将用户定义的软件包版本添加到清单。这也是将软件包添加到 Distributor 时指定的 Version name (版本名称) 的值。添加软件包时,它将成为 Distributor 创建的 AWS Systems Manager 文档的一部分。您还可以在 AWS-ConfigureAWSPackage 文档中将此值作为输入提供,以安装除最新版本以外的软件包版本。version 值可以包含字母、数字、下划线、连字符和句点,最大长度为 128 个字符。建议使用易读的软件包版本,以便您和其他管理员在部署时更轻松地指定确切的软件包版本。以下是示例。

    "version": "1.0.1",
  3. (可选)添加发布者名称。以下是示例。

    "publisher": "MyOrganization",
  4. 添加软件包。"packages" 部分描述软件包中的 ZIP 文件支持的平台、发行版本和架构。有关更多信息,请参阅 支持的软件包平台和架构

    platform-version 可以是通配符值 _any。使用它来指示 ZIP 文件支持任何版本的平台。但是,platform-version 值必须与您设定为目标的操作系统 AMI 的版本完全匹配。以下是用于获取正确的操作系统值的推荐资源。

    • 在基于 Windows 的实例上,发行版本可用作 Windows Management Instrumentation (WMI) 数据。您可以在基于 Windows 的实例上运行以下命令提示符命令来获取版本信息,然后解析 version 的结果。此命令不显示 Windows Server Nano 的版本;Windows Server Nano 的版本值为 nano

      wmic OS get /format:list
    • 在基于 Linux 的实例上,可以通过以下方式获取版本:先扫描操作系统版本(下面的命令)。然后查找 VERSION_ID 的值。

      cat /etc/os-release

      如果这未返回您需要的结果,请运行下面的命令从 /etc/lsb-release 文件获取 LSB 版本信息,并查找 DISTRIB_RELEASE 的值。

      lsb_release -a

      如果上述方法都不奏效,您通常可以根据分发软件包查找版本。例如,在 Debian 上,您可以扫描 /etc/debian_version 文件;在 Red Hat Enterprise Linux 上,则可以扫描 /etc/redhat-release 文件。

      hostnamectl
    "packages": { "platform": { "platform-version": { "architecture": { "file": "ZIP-file-name-1.zip" } } }, "another-platform": { "platform-version": { "architecture": { "file": "ZIP-file-name-2.zip" } } }, "another-platform": { "platform-version": { "architecture": { "file": "ZIP-file-name-3.zip" } } } }

    以下是示例。在此示例中,操作系统平台为 amazon,支持的发行版本为 2016.09,架构为 x86_64,支持此平台的 ZIP 文件为 test.zip

    { "amazon": { "2016.09": { "x86_64": { "file": "test.zip" } } } },

    您可以添加通配符值 _any 来指示此软件包支持父元素的所有版本。例如,要指示 Amazon Linux 的任何发行版本都支持此软件包,您应使用类似以下内容的软件包语句。您可以在版本或架构级别使用 _any 通配符来支持平台的所有版本、某个版本的所有架构或某个平台的所有版本和所有架构。

    { "amazon": { "_any": { "x86_64": { "file": "test.zip" } } } },

    以下示例添加 _any 来表明 Amazon Linux 2016.09 的所有架构都支持第一个软件包 data1.zip。Amazon Linux 的所有版本都支持第二个软件包 data2.zip,但此软件包仅适用于采用 x86_64 架构的实例。2016.09_any 版本都是 amazon 下的条目。只有一个平台 (Amazon Linux),但支持的版本、架构和关联的 ZIP 文件不同。

    { "amazon": { "2016.09": { "_any": { "file": "data1.zip" } }, "_any": { "x86_64": { "file": "data2.zip" } } } }

    如果某个 ZIP 文件支持多个平台,则可以在清单的 "packages" 部分中多次引用此 ZIP 文件。例如,如果有一个同时支持 Red Hat Enterprise Linux 和 Amazon Linux 的 ZIP 文件,则可以将 "packages" 部分中的两个条目都指向相同的 ZIP 文件,如以下示例所示。

    { "amazon": { "2018.03": { "x86_64": { "file": "test.zip" } } }, "redhat": { "_any": { "x86_64": { "file": "test.zip" } } } },
  5. 从步骤 4 添加属于此软件包的 ZIP 文件列表。每个文件条目都需要文件名和 sha256 哈希值校验和。清单中的校验和值必须与压缩资产中的 sha256 哈希值匹配,以防软件包安装失败。

    要从可安装资产获取确切的校验和,可以运行以下命令。在 Linux 上,运行 cat file-name.zip | openssl dgst -sha256。在 Windows 上,在 PowerShell 中运行 Get-FileHash -Path path-to-ZIP-file cmdlet。

    清单的 "files" 部分包含对软件包中每个 ZIP 文件的引用。

    "files": { "test-agent-x86.deb.zip": { "checksums": { "sha256": "EXAMPLE2706223c7616ca9fb28863a233b38e5a23a8c326bb4ae241dcEXAMPLE" } }, "test-agent-x86_64.deb.zip": { "checksums": { "sha256": "EXAMPLE572a745844618c491045f25ee6aae8a66307ea9bff0e9d1052EXAMPLE" } }, "test-agent-x86_64.nano.zip": { "checksums": { "sha256": "EXAMPLE63ccb86e830b63dfef46995af6b32b3c52ce72241b5e80c995EXAMPLE" } }, "test-agent-rhel5-x86.nano.zip": { "checksums": { "sha256": "EXAMPLE13df60aa3219bf117638167e5bae0a55467e947a363fff0a51EXAMPLE" } }, "test-agent-x86.msi.zip": { "checksums": { "sha256": "EXAMPLE12a4abb10315aa6b8a7384cc9b5ca8ad8e9ced8ef1bf0e5478EXAMPLE" } }, "test-agent-x86_64.msi.zip": { "checksums": { "sha256": "EXAMPLE63ccb86e830b63dfef46995af6b32b3c52ce72241b5e80c995EXAMPLE" } }, "test-agent-rhel5-x86.rpm.zip": { "checksums": { "sha256": "EXAMPLE13df60aa3219bf117638167e5bae0a55467e947a363fff0a51EXAMPLE" } }, "test-agent-rhel5-x86_64.rpm.zip": { "checksums": { "sha256": "EXAMPLE7ce8a2c471a23b5c90761a180fd157ec0469e12ed38a7094d1EXAMPLE" } } }
  6. 添加软件包信息后,保存并关闭清单文件。

下面是一个已完成的清单的示例。在此示例中,您有一个 ZIP 文件 NewPackage_LINUX.zip,它支持多个平台,但仅在 "files" 部分中引用一次。

{ "schemaVersion": "2.0", "version": "1.7.1", "publisher": "Amazon Web Services", "packages": { "windows": { "_any": { "x86_64": { "file": "NewPackage_WINDOWS.zip" } } }, "amazon": { "_any": { "x86_64": { "file": "NewPackage_LINUX.zip" } } }, "ubuntu": { "_any": { "x86_64": { "file": "NewPackage_LINUX.zip" } } } }, "files": { "NewPackage_WINDOWS.zip": { "checksums": { "sha256": "EXAMPLEc2c706013cf8c68163459678f7f6daa9489cd3f91d52799331EXAMPLE" } }, "NewPackage_LINUX.zip": { "checksums": { "sha256": "EXAMPLE2b8b9ed71e86f39f5946e837df0d38aacdd38955b4b18ffa6fEXAMPLE" } } } }

软件包示例

您可以从我们的网站下载示例软件包 ExamplePackage.zip。示例软件包中有一个完整的 JSON 清单和三个 ZIP 文件。

步骤 3:将软件包和清单上传到 Amazon S3 存储桶

通过将所有 ZIP 文件复制或移动到一个文件夹或目录中来准备软件包。有效的软件包需要您在步骤 2:创建 JSON 软件包清单中创建的清单以及清单文件列表中标识的所有 ZIP 文件。

将软件包和清单上传到 Amazon S3

  1. 将清单中指定的所有 ZIP 存档文件复制或移动到一个文件夹或目录中。

  2. 创建存储桶或选择现有的存储桶。有关更多信息,请参阅 Amazon Simple Storage Service 入门指南 中的创建存储桶。有关如何运行 AWS CLI 命令来创建存储桶的更多信息,请参阅 AWS CLI 命令参考 中的 mb

  3. 将此文件夹上传到存储桶。有关更多信息,请参阅 Amazon Simple Storage Service 入门指南 中的将对象添加到存储桶。如果打算将 JSON 清单粘贴到 AWS Systems Manager 控制台,则不要上传清单。有关如何运行 AWS CLI 命令将文件上传到存储桶的更多信息,请参阅 AWS CLI 命令参考 中的 mv

  4. 在存储桶的主页上,选择您上传的文件夹。如果您将文件上传到存储桶中的子文件夹,请务必记下子文件夹(也称为前缀)。您需要此前缀以将软件包添加到 Distributor。

步骤 4:将软件包添加到 Distributor

您可以使用 AWS Systems Manager 控制台或 AWS CLI 将新软件包添加到 AWS Systems Manager Distributor。添加软件包时,您添加的是一个新的 SSM 文档。此文档让您能够将软件包部署到托管实例。

添加软件包(控制台)

可使用 AWS Systems Manager 控制台创建软件包。准备好您在步骤 3:将软件包和清单上传到 Amazon S3 存储桶中将软件包上传到的存储桶的名称。

将软件包添加到 Distributor(控制台)

  1. 通过以下网址打开 AWS Systems Manager 控制台:https://console.amazonaws.cn/systems-manager/

  2. 在导航窗格中,选择 Distributor

  3. 在 Distributor 主页上,选择 Create package (创建软件包),然后选择高级

  4. Create package (创建软件包) 页面上,输入软件包的名称。软件包名称可以包含字母、数字、句点、短划线和下划线。名称应足够通用,以适用于所有版本的软件包附件,但又足够具体,可用于识别软件包的用途。

  5. Version name (版本名称) 中,输入清单文件中 version 条目的确切值。

  6. 对于 S3 存储桶名称,请选择在步骤 3:将软件包和清单上传到 Amazon S3 存储桶中将 ZIP 文件和清单上传到的存储桶的名称。

  7. S3 键前缀中,输入存储桶中存储 ZIP 文件和清单的子文件夹。

  8. 清单中,选择 Extract from package (从软件包提取) 以使用已通过 ZIP 文件上传到 S3 存储桶的清单。

    (可选)如果未将 JSON 清单上传到存储 ZIP 文件的 S3 存储桶,请选择 New manifest (新建清单)。您可以在 JSON 编辑器字段中编写或粘贴整个清单。有关如何创建 JSON 清单的更多信息,请参阅步骤 2:创建 JSON 软件包清单

  9. 当您处理完清单后,选择 Create package (创建软件包)

  10. 等待 Distributor 从您的 ZIP 文件和清单创建软件包。根据要添加的软件包的数量和大小,这可能需要几分钟时间。Distributor 会自动将您重定向到新软件包的 Package details (软件包详细信息) 页面,但您可以选择在上传软件之后自行打开此页面。Package details (软件包详细信息) 页面不会显示有关软件包的所有信息,直到 Distributor 完成软件包创建过程。要停止上传和软件包创建过程,请选择取消

添加软件包 (AWS CLI)

可使用 AWS CLI 创建软件包。准备好您在步骤 3:将软件包和清单上传到 Amazon S3 存储桶中将软件包上传到的存储桶的 URL。

将软件包添加到 Amazon S3 (AWS CLI)

  1. 要使用 AWS CLI 创建软件包,请运行以下命令,将 package-name 替换为您的软件包名称,将 S3-bucket-URL-to-manifest-file 替换为您在步骤 3:将软件包和清单上传到 Amazon S3 存储桶中复制的 JSON 清单的 URL。S3-bucket-URL-of-package 是存储整个软件包的 S3 存储桶的 URL。在 Distributor 中运行 create-document 命令时,为 --document-type 指定 Package 值。

    如果未将清单文件添加到 S3 存储桶,则 --content 参数值为 JSON 清单文件的全部内容(在引号中)。

    aws ssm create-document --name "package-name" --content "S3-bucket-URL-to-manifest-file" --attachments Key="SourceUrl",Values="S3-bucket-URL-of-package" --version-name version-value-from-manifest --document-type Package

    以下是示例。

    aws ssm create-document --name ExamplePackage --content "https://s3.amazonaws.com/mybucket/ExamplePackage/manifest.json" --attachments Key="SourceUrl",Values="https://s3.amazonaws.com/mybucket/ExamplePackage" --version-name 1.0.1 --document-type Package
  2. 通过运行以下命令验证软件包是否已添加并显示软件包清单,将 package-name 替换为您的软件包名称。要获取文档的特定版本(不同于软件包的版本),可以添加 --document-version 参数。

    aws ssm get-document --name "package-name"

有关可以在 create-document 命令中使用的其他选项的信息,请参阅AWS Systems Manager section of the AWS CLI Command Reference中的 create-document。有关可以与 get-document 命令配合使用的其他选项的信息,请参阅 get-document