

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

# 在预留容量实例集上运行构建
<a name="fleets"></a>

CodeBuild 提供以下计算队列：
+ 按需车队
+ 预留容量实例集

使用按需队列，为您的构建 CodeBuild 提供计算。构建完成后，计算机就会被销毁。按需实例集是完全托管式的，并包括自动扩展功能以应对需求激增。

**注意**  
按需实例集不支持 macOS。

CodeBuild 还提供预留容量队列，其中包含由 Amazon EC2 提供支持并由维护的 CodeBuild实例。使用预留容量实例集，您可以为构建环境配置一组专用实例。这些计算机保持闲置状态，可以立即处理生成或测试，并缩短构建持续时间。使用预留容量实例集，您的计算机将始终处于运行状态，并且只要预调配完毕，它们就会继续产生成本。

**重要**  
无论您运行实例多长时间，预留容量实例集的每个实例都会产生初始费用，之后可能会有额外的相关费用。有关更多信息，请参阅 [https://aws.amazon.com/codebuild/pricing/](https://aws.amazon.com/codebuild/pricing/)。

**Topics**
+ [创建预留容量实例集](#fleets.how-to)
+ [最佳实践](#fleets.best-practices)
+ [我能否在多个 CodeBuild 项目之间共享预留容量队列？](#fleets.share)
+ [基于属性的计算是如何工作的？](#fleets.attribute-compute)
+ [我能否为我的实例集手动指定 Amazon EC2 实例？](#fleets.manual-input-compute)
+ [哪些区域支持预留容量实例集？](#fleets.regions)
+ [如何配置 macOS 预留容量实例集？](#fleets.configure-macos)
+ [如何为预留容量实例集配置自定义亚马逊机器映像（AMI）？](#fleets.custom-ami)
+ [预留容量实例集的局限性](#fleets.limitations)
+ [预留容量实例集属性](fleets.reserved-capacity-fleets.md)
+ [预留容量样品包含 AWS CodeBuild](reserved-capacity-samples.md)

## 创建预留容量实例集
<a name="fleets.how-to"></a>

按照以下说明创建预留容量实例集。

**创建预留容量实例集**

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /hom AWS CodeBuild e 中打开控制台。

1. 在导航窗格中，选择**计算实例集**，然后选择**创建实例集**。

1. 在**计算实例集名称**文本字段中，输入实例集的名称。

1. 从**操作系统**下拉菜单中，选择操作系统。

1. 从**架构**下拉菜单中，选择架构。

1. （可选）选择**使用实例运行模式 - 可选**，以便直接在 Amazon EC2 实例而不是 Docker 容器上运行。然后选择**主要版本**和**次要版本**。

1. （可选）在**其他配置**中，执行以下操作：
   + 选择**配置 VPC - 可选**以将实例集连接到 VPC，以便在使用期间访问私有资源。
     + 从 **VPC** 下拉菜单中，选择您的 CodeBuild 队列将访问的 VPC。
     + 从**子网**下拉菜单中，选择 CodeBuild 应用于设置 VPC 配置的子网。
     + 从**安全组**下拉菜单中，选择 CodeBuild 应用于与您的 VPC 配合使用的安全组。
     + 在**实例集服务角色**字段中，选择已有服务角色。
**注意**  
确保实例集角色具有必要的权限。有关更多信息，请参阅 [允许用户为实例集服务角色添加权限策略](auth-and-access-control-iam-identity-based-access-control.md#customer-managed-policies-example-permission-policy-fleet-service-role)。
     + 如果您选择了 Amazon Linux 操作系统，请选择**定义代理配置 - 可选**，以便对您的预留容量实例应用网络访问控制。
     + 对于**默认行为**，选择在默认情况下是允许还是拒绝发往所有目标的传出流量。
     + 对于**代理规则**，选择**添加代理规则**以指定目标域或 IPs 允许或拒绝网络访问控制。
   + 选择**配置自定义 AMI - 可选**，以使用自定义亚马逊机器映像（AMI）。
     + 从 **AMI** 下拉菜单中，为您的实例集选择亚马逊机器映像（AMI）。
     + 在**实例集服务角色**字段中，选择已有服务角色。
**注意**  
确保实例集角色具有必要的权限。有关更多信息，请参阅 [允许用户为实例集服务角色添加权限策略](auth-and-access-control-iam-identity-based-access-control.md#customer-managed-policies-example-permission-policy-fleet-service-role)。

1. 在**容量配置**中，从**计算选择模式**中选择以下选项之一：
   + 如果您选择**引导式选择**，请执行以下操作：
     + 对于**计算**，请选择此实例集中包含的实例类型。
     + 在**容量**文本字段中，输入实例集中的最少实例数。
     + （可选）在**其他配置**中，执行以下操作：
       + 选择**配置扩展 - 可选**，以根据此配置自动扩展您的实例集。从**扩展模式 - 可选**下拉菜单中，选择在需求超过实例集容量时的行为。
   + 如果选择**自定义实例**，请执行以下操作：
     + 从**计算实例类型**下拉菜单中，选择此实例集中包含的实例类型。
     + 在**其他 EBS 卷大小 - 可选**文本字段中，输入提供的 64 GB 磁盘空间之外的额外容量。
     + 在**容量**文本字段中，输入实例集中的最少实例数。
     + （可选）在**其他配置**中，执行以下操作：
       + 选择**配置扩展 - 可选**，以根据此配置自动扩展您的实例集。从**扩展模式 - 可选**下拉菜单中，选择在需求超过实例集容量时的行为。

1. 选择**创建计算实例集**。

1. 创建计算队列后，创建一个新 CodeBuild 项目或编辑现有项目。从**环境**中，选择**预置模型**下的**预留容量**，然后在**实例集名称**下选择指定的实例集。

## 最佳实践
<a name="fleets.best-practices"></a>

使用预留容量实例集时，我们建议您遵循以下这些最佳实践。
+ 我们建议使用源代码缓存模式，通过缓存源代码来帮助提高构建性能。
+ 我们建议使用 Docker 层缓存，通过缓存现有 Docker 层来帮助提高构建性能。

## 我能否在多个 CodeBuild 项目之间共享预留容量队列？
<a name="fleets.share"></a>

可以，您可以通过在多个项目中使用实例集的容量来最大限度地提高其利用率。

**重要**  
使用预留容量特征时，同一账户内的其他项目可以访问实例集实例中缓存的数据，包括源文件、Docker 层和 buildspec 中指定的缓存目录。这是设计使然，让同一账户内的项目可以共享实例集实例。

## 基于属性的计算是如何工作的？
<a name="fleets.attribute-compute"></a>

如果您选择 `ATTRIBUTE_BASED_COMPUTE` 作为实例集的 `computeType`，则可以在名为 `computeConfiguration` 的新字段中指定属性。这些属性包括 v CPUs、内存、磁盘空间和`machineType`。此 `machineType` 为 `GENERAL` 或 `NVME`。指定一个或一些可用属性后， CodeBuild 将从支持的可用实例类型中选择一种计算类型作为最终版本`computeConfiguration`。

**注意**  
CodeBuild 将选择符合所有输入要求的最便宜的实例。所选实例的内存CPUs、v 和磁盘空间都将大于或等于输入要求。您可以在已创建或更新的实例集中检查已解析的 `computeConfiguration`。

如果您输入`computeConfiguration`的 a 无法满足 CodeBuild，则会收到验证异常。另请注意，如果 `computeConfiguration` 不适用于按需情况，则按需实例集溢出行为将被覆盖为队列行为。

## 我能否为我的实例集手动指定 Amazon EC2 实例？
<a name="fleets.manual-input-compute"></a>

可以，您可以通过选择**自定义实例**或配置 API 参数 `InstanceType`，直接在控制台中输入所需的 Amazon EC2 实例。此字段用于以下用途 APIs： CreateFleet UpdateFleet、 CreateProject、 UpdateProject 和 StartBuild。有关更多信息，请参阅 [Compute instance type](fleets.reserved-capacity-fleets.md#compute)。

## 哪些区域支持预留容量实例集？
<a name="fleets.regions"></a>

以下地区支持预留容量 Amazon Linux 和 Windows 队列 AWS 区域：美国东部（弗吉尼亚北部）、美国东部（俄亥俄州）、美国西部（俄勒冈）、亚太地区（孟买）、亚太地区（新加坡）、亚太地区（悉尼）、亚太地区（东京）、欧洲（法兰克福）、欧洲（爱尔兰）和南美洲（圣保罗）。有关 AWS 区域 何处 CodeBuild 可用的更多信息，请参阅[按地区划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。

以下地区支持预留容量 macOS 中型舰队 AWS 区域：美国东部（弗吉尼亚北部）、美国东部（俄亥俄州）、美国西部（俄勒冈）、亚太地区（悉尼）和欧洲（法兰克福）。预留容量 macOS 以下地区支持大型机群 AWS 区域：美国东部（弗吉尼亚北部）、美国东部（俄亥俄州）、美国西部（俄勒冈）和亚太地区（悉尼）。

## 如何配置 macOS 预留容量实例集？
<a name="fleets.configure-macos"></a>

**配置 macOS 预留容量实例集**

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /hom AWS CodeBuild e 中打开控制台。

1. 在导航窗格中，选择**计算实例集**，然后选择**创建实例集**。

1. 在**计算实例集名称**文本字段中，输入实例集的名称。

1. 在**操作系统**下拉菜单中，选择 **macOS**。

1. 在 “**计算**” 字段中，选择以下计算机类型之一：**Apple M2、24 GB 内存、8 v CPUs** 或 **Apple M2、32 GB 内存、12 v CPUs**。

1. 在**容量**文本字段中，输入实例集中的最少实例数。

1. （可选）要为实例集使用自定义映像，请参阅[如何为预留容量实例集配置自定义亚马逊机器映像（AMI）？](#fleets.custom-ami)，以确保您的亚马逊机器映像（AMI）满足所需的先决条件。

1. （可选）要使用您的实例集配置 VPC，请在**其他配置**中执行以下操作：
   + 从 **VPC-可选**下拉菜单中，选择您的 CodeBuild 队列将访问的 VPC。
   + 从**子网**下拉菜单中，选择 CodeBuild 应用于设置 VPC 配置的子网。
   + 从**安全组**下拉菜单中，选择 CodeBuild 应用于与您的 VPC 配合使用的安全组。
   + 在**实例集服务角色**字段中，选择已有服务角色。
**注意**  
确保实例集角色具有必要的权限。有关更多信息，请参阅 [允许用户为实例集服务角色添加权限策略](auth-and-access-control-iam-identity-based-access-control.md#customer-managed-policies-example-permission-policy-fleet-service-role)。

1. 选择**创建计算实例集**并等待实例集实例启动。启动后，容量将在`n/n`，提供的容量在*n*哪里。

1. 计算队列启动后，创建一个新 CodeBuild 项目或编辑现有项目。从**环境**中，选择**预置模型**下的**预留容量**，然后在**实例集名称**下选择指定的实例集。

## 如何为预留容量实例集配置自定义亚马逊机器映像（AMI）？
<a name="fleets.custom-ami"></a>

**为预留容量实例集配置自定义亚马逊机器映像（AMI）**

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /hom AWS CodeBuild e 中打开控制台。

1. 在导航窗格中，选择**计算实例集**，然后选择**创建实例集**。

1. 在**计算实例集名称**文本字段中，输入实例集的名称。

1. 为实例集选择**自定义映像**，并确保您的亚马逊机器映像（AMI）满足以下先决条件：
   + 如果环境类型为 `MAC_ARM`，请确保 AMI **架构**为 64 位 `Mac-Arm`。
   + 如果环境类型为 `LINUX_EC2`，请确保 AMI **架构**为 64 位 `x86`。
   + 如果环境类型为 `ARM_EC2`，请确保 AMI **架构**为 64 位 `Arm`。
   + 如果环境类型为 `WINDOWS_EC2`，请确保 AMI **架构**为 64 位 `x86`。
   + AMI 允许 CodeBuild 服务**组织 ARN**。有关组织的列表 ARNs，请参阅[Amazon Machine Images (AMI)](fleets.reserved-capacity-fleets.md#ami)。
   + 如果 AMI 使用 AWS KMS 密钥加密，则该 AWS KMS 密钥还必须允许 CodeBuild 服务**组织 ID**。有关组织的列表 IDs，请参阅[Amazon Machine Images (AMI)](fleets.reserved-capacity-fleets.md#ami)。有关 AWS KMS 密钥的更多信息，请参阅 *Amazon EC2 用户指南*中的[允许组织和 OUs 使用 KMS 密钥](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/share-amis-with-organizations-and-OUs.html#allow-org-ou-to-use-key)。要向 CodeBuild 组织授予使用 KMS 密钥的权限，请在密钥策略中添加以下语句：

     ```
     {
         "Sid": "Allow access for organization root",
         "Effect": "Allow",
         "Principal": "*",
         "Action": [
             "kms:Describe*",
             "kms:List*",
             "kms:Get*",
             "kms:Encrypt",
             "kms:Decrypt",
             "kms:ReEncrypt*",
             "kms:GenerateDataKey*",
             "kms:CreateGrant"
         ],
         "Resource": "*",
         "Condition": {
             "StringEquals": {
                 "aws:PrincipalOrgID": "o-123example"
             }
         }
     }
     ```
   + 在**实例集服务角色**字段中，授予以下 Amazon EC2 权限：

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Statement": [
             {
                 "Effect": "Allow",
                 "Action": [
                    "ec2:DescribeImages",
                    "ec2:DescribeSnapshots"
                 ],
                 "Resource": "*"
             }
         ]
     }
     ```

------

## 预留容量实例集的局限性
<a name="fleets.limitations"></a>

在预留容量实例集不支持的某些用例中，如果它们对您产生影响，请改用按需实例集：
+ 预留容量实例集不支持构建利用率指标。
+ macOS 预留容量实例集不支持调试会话。

有关限制和限额的更多信息，请参阅[计算实例集](limits.md#fleet-limits)。

# 预留容量实例集属性
<a name="fleets.reserved-capacity-fleets"></a>

预留容量实例集包含以下属性。有关预留容量实例集的更多信息，请参阅[在预留容量实例集上运行构建](fleets.md)。

**操作系统**  
操作系统 以下操作系统可用：  
+ Amazon Linux
+ macOS
+ Windows Server 2019
+ Windows Server 2022

**架构**  
处理器架构。以下架构可用：  
+ x86\$164
+ Arm64

**环境类型**  
选择 **Amazon Linux** 时可用的环境类型。以下环境类型可用：  
+ Linux EC2
+ Linux GPU

**计算实例类型**  
实例集实例的计算配置。    
**引导式选择**  
通过选择 vCPU、内存和磁盘空间设置来指定不同的计算类型。有关按区域划分的计算类型可用性的信息，请参阅[关于预留容量环境类型](build-env-ref-compute-types.md#environment-reserved-capacity.types)。  
**自定义实例**  
手动指定所需的实例类型。

**Capacity**  
分配给实例集的计算机的初始数量，它定义了可以并行运行的构建数量。

**溢出行为**  
定义构建数量超过实例集容量时的行为。    
**按需**  
溢出版本按 CodeBuild 需运行。  
如果您在创建与 VPC 连接的实例集时选择将溢出行为设置为按需，请务必向项目服务角色添加所需的 VPC 权限。有关更多信息，请参阅[允许 CodeBuild 访问创建 VPC 网络接口所需的 AWS 服务的策略声明示例](auth-and-access-control-iam-identity-based-access-control.md#customer-managed-policies-example-create-vpc-network-interface)。
如果您选择将溢出行为设置为按需，请注意，溢出构建将单独计费，类似于按需型 Amazon EC2。有关更多信息，请参阅 [https://aws.amazon.com/codebuild/pricing/](https://aws.amazon.com/codebuild/pricing/)。  
**队列**  
构建运行将放在队列中，直到有计算机可用。这限制了额外成本，因为没有分配额外的计算机。

**亚马逊机器映像（AMI）**  
实例集的亚马逊机器映像（AMI）属性。支持以下属性 CodeBuild：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/fleets.reserved-capacity-fleets.html)

**其他配置**    
**VPC - 可选**  
您的 CodeBuild 队列将访问的 VPC。有关更多信息，请参阅 [AWS CodeBuild 与亚马逊 Virtual Private Cloud 一起使用](vpc-support.md)。  
如果在调用 StartBuild API 时指定了队列覆盖，则 CodeBuild 将忽略项目 VPC 配置。  
**子网**  
 CodeBuild 用于设置 VPC 配置的 VPC 子网。请注意，预留容量实例集仅支持单个可用区中的一个子网。此外，确保您的子网包括 NAT 网关。  
**安全组**  
与您的 VPC 一起 CodeBuild 使用的 VPC 安全组。确保您的安全组允许出站连接。  
**实例集服务角色**  
根据您账户中的现有服务角色为您的实例集定义服务角色。  
**定义代理配置 - 可选**  
对预留容量实例应用网络访问控制的代理配置。有关更多信息，请参阅 [AWS CodeBuild 与托管代理服务器一起使用](run-codebuild-in-managed-proxy-server.md)。  
代理配置不支持 VPC、Windows 或 macOS。  
**默认行为**  
定义传出流量的行为。    
**允许**  
默认情况下，允许流向所有目标的传出流量。  
**拒绝**  
默认情况下，拒绝流向所有目标的传出流量。  
**代理规则**  
指定目标域或 IPs 允许或拒绝网络访问控制。

# 预留容量样品包含 AWS CodeBuild
<a name="reserved-capacity-samples"></a>

这些样本可用于在预留容量舰队中 CodeBuild进行实验。

**Topics**
+ [使用预留容量进行缓存示例](#reserved-capacity-samples.caching)

## 使用预留容量进行缓存示例
<a name="reserved-capacity-samples.caching"></a>

缓存可以存储构建环境的可重用部分，并在多个构建中使用它们。此示例演示了如何使用预留容量在构建项目中启用缓存。有关更多信息，请参阅 [缓存构建以提高性能](build-caching.md)。

您可以先在项目设置中指定一种或多种缓存模式：

```
Cache:
        Type: LOCAL
        Modes:
          - LOCAL_CUSTOM_CACHE
          - LOCAL_DOCKER_LAYER_CACHE
          - LOCAL_SOURCE_CACHE
```

**注意**  
要使用 Docker 层缓存，请务必启用特权模式。

您的项目构建规范设置应如下所示：

```
version: 0.2
      phases:
        build:
          commands:
            - echo testing local source cache
            - touch /codebuild/cache/workspace/foobar.txt
            - git checkout -b cached_branch
            - echo testing local docker layer cache
            - docker run alpine:3.14 2>&1 | grep 'Pulling from' || exit 1
            - echo testing local custom cache
            - touch foo
            - mkdir bar && ln -s foo bar/foo2
            - mkdir bar/bar && touch bar/bar/foo3 && touch bar/bar/foo4
            - "[ -f foo ] || exit 1"
            - "[ -L bar/foo2 ] || exit 1"
            - "[ -f bar/bar/foo3 ] || exit 1"
            - "[ -f bar/bar/foo4 ] || exit 1"
      cache:
        paths:
           - './foo'
           - './bar/**/*'
           - './bar/bar/foo3'
```

您可以先用新项目运行构建，为缓存做种子。完成后，您应该使用重写的构建规范开始另一个构建，如下所示：

```
version: 0.2
      phases:
        build:
          commands:
            - echo testing local source cache
            - git branch | if grep 'cached_branch'; then (exit 0); else (exit 1); fi
            - ls /codebuild/cache/workspace | if grep 'foobar.txt'; then (exit 0); else (exit 1); fi
            - echo testing local docker layer cache
            - docker run alpine:3.14 2>&1 | if grep 'Pulling from'; then (exit 1); else (exit 0); fi
            - echo testing local custom cache
            - "[ -f foo ] || exit 1"
            - "[ -L bar/foo2 ] || exit 1"
            - "[ -f bar/bar/foo3 ] || exit 1"
            - "[ -f bar/bar/foo4 ] || exit 1"
      cache:
        paths:
           - './foo'
           - './bar/**/*'
           - './bar/bar/foo3'
```