为 Amazon 集装箱队列创建 GameLift 容器组定义 - Amazon GameLift

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

为 Amazon 集装箱队列创建 GameLift 容器组定义

本文档适用于公开预览版中的一项功能。本文档随时可能更改。

容器组定义描述了如何将容器化游戏服务器应用程序部署到容器队列。它是一个蓝图,用于确定要在舰队上运行的容器集以及如何运行它们。创建容器队列时,您需要指定要部署到队列的容器组定义。有关容器组的更多信息,请参阅集装箱船队组件

开始之前

完成以下任务:

  • 设计用于托管游戏服务器的容器架构。请参阅 设计一支亚马逊 GameLift 集装箱船队

  • 规划要包含在容器组中的容器定义。如果您使用的是 AWS CLI,请在 JSON 文件中创建容器定义。

  • 将最终的容器镜像推送到亚马逊弹性容器注册表 (Amazon ECR) Container Registry,该注册表与您计划创建容器组的位置 AWS 区域 相同。Amazon 会在您创建容器组定义时 GameLift 存储每个图像的快照,并在部署到容器队列时使用该副本。请参阅 使用游戏服务器软件准备容器镜像

  • 验证您的 AWS 用户是否具有 IAM 权限来访问 Amazon ECR 存储库。请参阅 管理 Amazon 的用户权限 GameLift。您至少需要权限才能执行以下操作:

    • ecr:DescribeImages

    • ecr:BatchGetImage

    • ecr:GetDownloadUrlForLayer

克隆容器组定义

您可以使用 Amazon GameLift 控制台克隆现有的容器组定义。

克隆容器组
  1. Amazon GameLift 控制台中,前往左侧导航窗格并选择容器组

  2. 容器组列表页面上,选择要克隆的现有容器组。选择容器组后,“克隆” 按钮处于活动状态。

  3. 选择克隆。此操作将打开带有预填设置的容器组创建向导。

  4. 为克隆的容器组输入新名称。同一区域中的容器组必须具有唯一的名称。

  5. 浏览容器组和容器定义页面,查看并创建新的容器组。

创建副本容器组定义

副本容器组管理您的游戏服务器软件。副本容器组至少有一个运行 Amazon A GameLift gent 和您的游戏服务器进程的容器。该小组可能还有其他 “sidecar” 容器来运行支持软件。

本主题介绍如何使用 Amazon GameLift 控制台或 AWS CLI 工具创建容器组定义。有关设置容器组配置的更多详细信息,请参阅设计一支亚马逊 GameLift 集装箱船队

Console

Amazon GameLift 控制台中,选择要创建容器组 AWS 区域 的位置。

打开控制台的左侧导航栏并选择容器组。在容器组页面上,选择创建容器组

步骤 1:定义群组详细信息。
  1. 输入容器组定义名称。此名称必须是 AWS 账户 和区域所独有的。在控制台中,群组定义按名称列出,因此分配有意义的标签会很有帮助。

  2. 选择本调度策略。

  3. 总内存限制中,输入容器组可用的最大内存。有关计算此值的帮助,请参阅设置资源限制

  4. CPU 总限制中,输入容器组可用的最大计算能力。有关计算此值的帮助,请参阅设置资源限制

步骤 2:添加容器定义。

使用您的游戏服务器应用程序和 Amazon A GameLift gent 定义容器。这是您的必备复制容器。

  1. 提供容器定义名称。为该组定义的每个容器都必须具有唯一的名称值。

  2. 识别容器镜像的 Amazon ECR 镜像 URI。输入以下任意格式:

    • 仅限图片 URI:[AWS 账户].dkr.ecr.[AWS 区域].amazonaws.com/[repository ID]

    • 图片 URI + 摘要:[AWS 账户].dkr.ecr.[AWS 区域].amazonaws.com/[repository ID]@[digest]

    • 图片 URI + 标签:[AWS 账户].dkr.ecr.[AWS 区域].amazonaws.com/[repository ID]:[tag]

  3. 对于基本容器,第一个容器定义自动选择 “”。如果您添加其他容器定义,则可以为每个定义开启或关闭此设置。有关更多详细信息,请参阅指定基本容器

  4. 设置一个或多个内部容器端口范围。此容器托管您的游戏服务器,因此请定义一个具有足够端口的范围,以便每个服务器进程在容器组中运行。有关更多详细信息,请参阅配置网络连接

  5. 可选设置 Overrides 和 E nvironment 变量允许您指定在启动时传递给容器的值。您在此处设置的值会覆盖容器镜像中已有的所有设置。

  6. 设置可选的容器限制以管理此容器的资源分配。有关更多详细信息,请参阅设置资源限制

  7. 根据需要定义其他非必要容器:

    • 提供容器定义名称ECR 镜像 URI。非必需容器不得运行 Amazon GameLift 代理。

    • 仅当容器具有需要网络访问的进程时,才设置内部容器端口范围。

    • (可选)为容器设置 He alth 检查。当非必要容器未通过运行状况检查时,它只会提示重启失败的容器。

    • (可选)根据需要设置覆盖环境变量和资源分配限制

步骤 3:配置依赖关系。

如果您的容器组定义中有多个容器,则可以定义它们之间的依赖关系。使用依赖关系根据容器条件设置启动和关闭顺序。有关更多详细信息,请参阅设置容器依赖关系

  1. 确定要为其添加依赖项的容器名称。在满足依赖条件之前,此容器不会启动。

  2. 确定依赖项容器名称条件。在依赖容器启动之前,此容器必须满足条件。

  3. 根据需要设置其他依赖关系。您可以为任何容器创建多个依赖关系。避免创建循环依赖关系。

步骤 4:查看并创建。
  1. 查看所有容器组定义设置。创建容器组定义后,您无法更改其配置。使用 “编辑” 对任何部分进行更改,包括群组的每个容器定义。

  2. 审阅完毕后,选择 “创建”。

    如果您的请求成功,控制台将显示新容器组定义资源的详细信息页面。最初的状态是COPYING,当 Amazon GameLift 开始为该群组拍摄所有容器映像的快照时。此阶段完成后,容器组定义状态将更改为READY。容器组定义必须处于READY状态,然后才能使用它创建容器队列。

AWS CLI

使用 AWS CLI 创建容器组定义时,请将容器定义配置保存在单独JSON的文件中。您可以在 CLI 命令中引用该文件。创建容器定义JSON文件有关架构示例,请参阅。

创建容器组定义

要创建新的容器组定义,请使用 create-container-group-definition CLI 命令。有关此命令的更多信息,请参见《AWS CLI 命令参考create-container-group-definition中的。

例 : 副本容器组

此示例说明了对副本容器组定义的请求。用于创建副本和守护程序组定义的命令结构基本相同。每种类型的群组的具体细节在各个容器定义中进行了描述。

此示例假设您已使用该组的容器定义创建了一个 JSON 文件。

aws gamelift create-container-group-definition \ --name MyAdventureGameContainerGroup \ --operating-system AMAZON_LINUX_2023 \ --scheduling-strategy REPLICA \ --total-memory-limit 4096 \ --total-cpu-limit 1024 \ --container-definitions file://SimpleServer.json

创建容器定义JSON文件

创建容器组定义时,还要为该组定义容器。容器定义指定存储容器映像的 Amazon ECR 存储库,以及网络端口的可选配置、CPU 和内存使用限制以及其他设置。我们建议创建一个包含容器组中所有容器的配置的单个JSON文件。维护文件对于存储、共享、版本跟踪这些关键配置非常有用。如果您使用 AWS CLI 创建容器组定义,则可以在命令中引用该文件。

创建容器定义
  1. 创建并打开一个新.JSON文件。例如:

    [~/work/glc]$ vim SimpleServer.json
  2. 为该组的每个容器创建单独的容器定义。复制以下示例内容,并根据需要对其进行修改,以适应您的容器。有关容器定义语法的详细信息,请参阅 Amazon GameLift API 参考ContainerDefinitionInput中的。

  3. 将文件保存在本地,以便您可以在 AWS CLI 命令中引用该文件。

此示例描述了您的副本容器组的基本容器。必不可少的副本容器包括您的游戏服务器应用程序、Amazon A GameLift gent,还可能包括用于托管游戏的其他支持软件。定义必须包括名称、图像 URI 和端口配置。此示例还设置了一些特定于容器的资源限制。

[ { "ContainerName": "SimpleServer", "ImageUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/gl-containers:complex-server", "Essential": true, "Cpu": 256, "MemoryLimits": { "HardLimit": 128 }, "PortConfiguration": { "ContainerPortRanges": [ { "FromPort": 2000, "Protocol": "TCP", "ToPort": 2100 } ] } } ]