

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

# 的亚马逊 Elastic File System 示例 AWS CodeBuild
<a name="sample-efs"></a>

 您可能需要在 Amazon Elastic File System 上创建您的 AWS CodeBuild 构建，这是一种适用于 Amazon EC2 实例的可扩展共享文件服务。Amazon EFS 中的存储容量是弹性的，因此会随着文件的添加和删除而增长或收缩。它具有简单的 Web 服务界面，可用于创建和配置文件系统。它还为您管理所有文件存储基础设施，因此您无需担心部署、修补或维护文件系统配置。有关更多信息，请参阅 *Amazon Elastic File System 用户指南*中的[什么是 Amazon Elastic File System？](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html)。

 此示例向您展示如何配置 CodeBuild 项目，使其安装并构建 Java 应用程序到 Amazon EFS 文件系统。在开始之前，您必须准备好构建并上传到 S3 输入存储桶或 AWS CodeCommit、 GitHub、 GitHub 企业服务器或 Bitbucket 存储库的 Java 应用程序。

系统会加密文件系统的传输中数据。要使用其他映像来加密传输中的数据，请参阅[加密传输中的数据](https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html)。

**Topics**
+ [AWS CodeBuild 与亚马逊 Elastic File System 一起使用](#sample-efs-high-level-steps)
+ [排查 Amazon EFS 集成问题](sample-efs-troubleshooting.md)

## AWS CodeBuild 与亚马逊 Elastic File System 一起使用
<a name="sample-efs-high-level-steps"></a>

该示例涵盖了使用 Amazon EFS 所需的四个高级步骤 AWS CodeBuild。它们是：

1. 在您的 AWS 账户中创建虚拟私有云 (VPC)。

1. 创建使用此 VPC 的文件系统。

1. 创建并构建使用 VPC 的 CodeBuild 项目。该 CodeBuild 项目使用以下内容来标识文件系统：
   +  文件系统的唯一标识符。当您在构建项目中指定文件系统时，可以选择该标识符。
   + 文件系统 ID。当您在 Amazon EFS 控制台中查看文件系统时，系统会显示该 ID。
   +  挂载点。这是 Docker 容器中用于挂载文件系统的目录。
   + 挂载选项。这些选项包含了有关如何挂载文件系统的详细信息。

1. 查看构建项目，确保生成了正确的项目文件和变量。

**注意**  
 只有 Linux 平台支持在 Amazon EFS 中创建的文件系统。

 

**Topics**
+ [步骤 1：使用创建 VPC CloudFormation](#sample-efs-create-vpc)
+ [步骤 2：使用 VPC 创建 Amazon Elastic File System 文件系统](#sample-efs-create-efs)
+ [第 3 步：创建要用于 Amazon EFS 的 CodeBuild 项目](#sample-efs-create-acb)
+ [步骤 4：检查构建项目](#sample-efs-summary)

### 步骤 1：使用创建 VPC CloudFormation
<a name="sample-efs-create-vpc"></a>

 使用 CloudFormation 模板创建您的 VPC。

1.  按照中的说明进行操作[CloudFormation VPC 模板](cloudformation-vpc-template.md)， CloudFormation 使用创建 VPC。
**注意**  
 此 CloudFormation 模板创建的 VPC 有两个私有子网和两个公有子网。当您使用 AWS CodeBuild 挂载在 Amazon EFS 中创建的文件系统时，只能使用私有子网。如果您使用其中一个公有子网，则构建会失败。

1. 登录 AWS 管理控制台 并打开 Amazon VPC 控制台，网址为[https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

1.  选择您创建时使用的 VPC CloudFormation。

1. 在**描述**选项卡上，记下 VPC 的名称及其 ID。在本示例的后面部分中创建您的 AWS CodeBuild 项目时，需要这两者。

### 步骤 2：使用 VPC 创建 Amazon Elastic File System 文件系统
<a name="sample-efs-create-efs"></a>

 使用您之前创建的 VPC 为本示例创建简单的 Amazon EFS 文件系统。

1. 登录 AWS 管理控制台 并打开 Amazon EFS 控制台，网址为[ https://console.aws.amazon.com/efs/](https://console.aws.amazon.com/efs/)。

1.  选择**创建文件系统**。

1.  从 **VPC**，选择您之前在本示例中记录的 VPC 名称。

1.  保持可用区与您选定子网的关联。

1.  选择**下一步**。

1.  在**添加标签**中，对于默认的**名称**键，在**值**中，输入 Amazon EFS 文件系统的名称。

1.  保留**突增**和**通用型**选定为您的默认性能和吞吐量模式，然后选择**下一步**。

1. 对于**配置客户端访问**，请选择**下一步**。

1.  选择**创建文件系统**。

1.  （可选）我们建议您为您的 Amazon EFS 文件系统添加策略，以强制对传输中的数据进行加密。在 Amazon EFS 控制台中，选择**文件系统策略**，选择**编辑**，选中标有**针对所有客户端强制执行传输中加密**的复选框，然后选择**保存**。

### 第 3 步：创建要用于 Amazon EFS 的 CodeBuild 项目
<a name="sample-efs-create-acb"></a>

 创建一个使用您在本示例前面创建的 VPC 的 AWS CodeBuild 项目。运行构建时，它会挂载之前创建的 Amazon EFS 文件系统。接下来，它会将 Java 应用程序创建的 .jar 文件存储在文件系统的挂载点目录中。

1. 在 [https://console.aws.amazon.com/codesuite/codebuild](https://console.aws.amazon.com/codesuite/codebuild/home) /home 中打开 AWS CodeBuild 控制台。

1.  从导航窗格中选择**构建项目**，然后选择**创建构建项目**。

1.  在**项目名称**中输入项目名称。

1.  从**源提供商**中，选择包含要构建的 Java 应用程序的存储库。

1.  输入 CodeBuild 用于定位应用程序的信息，例如存储库 URL。每个源提供商的选项有所不同。有关更多信息，请参阅 [Choose source provider](create-project.md#create-project-source-provider)。

1.  从**环境映像**中，选择**托管映像**。

1.  从**操作系统**中，选择 **Amazon Linux 2**。

1. 从**运行时**中，选择**标准**。

1.  从**图片中**，选择 **aws/codebuild/amazonlinux-x** 86\$164-standards: 4.0。

1.  从**环境类型**中，选择 **Linux**。

1.  在**服务角色**下，选择**新建服务角色**。在**角色名称**中，输入为您 CodeBuild 创建的角色的名称。

1. 展开**其他配置**。

1.  选择**如果要构建 Docker 映像或希望您的构建获得提升的特权，请启用此标志**。
**注意**  
默认情况下，为非 VPC 构建启用 Docker 进程守护程序。如果您想使用 Docker 容器进行 VPC 构建，请参阅 Docker 文档网站上的[运行时权限和 Linux 功能](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)并启用特权模式。此外，Windows 不支持特权模式。

1.  从 **VPC** 中，选择 VPC ID。

1.  从**子网**中，选择一个或多个与您的 VPC 关联的私有子网。您必须在挂载 Amazon EFS 文件系统的构建项目中使用私有子网。如果您使用公有子网，则构建会失败。

1.  从**安全组**中，选择默认安全组。

1.  在**文件系统**中，输入以下信息：
   + 针对**标识符**，输入文件系统的唯一标识符。该标识符必须少于 129 个字符，并且只能包含字母数字字符和下划线。 CodeBuild 使用此标识符来创建用于标识弹性文件系统的环境变量。该环境变量的格式为采用大写字母的 `CODEBUILD_<file_system_identifier>`。例如，如果输入 `my_efs`，则环境变量为 `CODEBUILD_MY_EFS`。
   + 对于 **ID**，请选择文件系统 ID。
   + （可选）输入文件系统中的一个目录。 CodeBuild 装入此目录。如果将 **Directory path (目录路径)** 留为空白，则 CodeBuild 会挂载整个文件系统。该路径相对于文件系统的根目录指定。
   + 对于**挂载点**，输入构建容器中用于挂载文件系统的目录的绝对路径。如果此目录不存在，则在构建过程中 CodeBuild 创建该目录。
   + （可选）输入挂载选项。如果将**装载选项**留空，则 CodeBuild 使用其默认装载选项：

     ```
     nfsvers=4.1
     rsize=1048576
     wsize=1048576
     hard
     timeo=600
     retrans=2
     ```

     有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的[建议的 NFS 挂载选项](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs-nfs-mount-settings.html)。

1.  对于**构建规范**，选择**插入构建命令**，然后选择**切换到编辑器**。

1.  在编辑器中输入以下构建规范命令。将 `<file_system_identifier>` 替换为您在步骤 17 中输入的标识符。使用大写字母（例如 `CODEBUILD_MY_EFS`）。

   ```
   version: 0.2
   phases:
     install:
       runtime-versions:
         java: corretto11    
     build:
       commands:
         - mvn compile -Dgpg.skip=true -Dmaven.repo.local=$CODEBUILD_<file_system_identifier>
   ```

1.  对所有其他设置使用默认值，然后选择**创建构建项目**。构建完成后，系统会显示项目的控制台页面。

1.  选择**开始构建**。

### 步骤 4：检查构建项目
<a name="sample-efs-summary"></a>



 AWS CodeBuild 项目构建完成后：
+  您会拥有一个由 Java 应用程序创建的 .jar 文件，该文件已被构建到您的挂载点目录下的 Amazon EFS 文件系统中。
+  系统会使用您在创建项目时输入的文件系统标识符，创建标识文件系统的环境变量。

 有关更多信息，请参阅《Amazon Elastic File System 用户指南》**中的[装载文件系统](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html)。

# 排查 Amazon EFS 集成问题
<a name="sample-efs-troubleshooting"></a>

以下是您在设置 Amazon EFS 时可能遇到的错误 CodeBuild。

**Topics**
+ [CLIENT\$1ERROR：挂载 127.0.0.1:/ 失败。权限被拒绝](#sample-efs-troubleshooting.permission-denied)
+ [CLIENT\$1ERROR：挂载 127.0.0.1:/ 失败。连接被对等方重置](#sample-efs-troubleshooting.connection-reset)
+ [VPC\$1CLIENT\$1ERROR：意外的 EC2 错误： UnauthorizedOperation](#sample-efs-troubleshooting.unauthorized-operation)

## CLIENT\$1ERROR：挂载 127.0.0.1:/ 失败。权限被拒绝
<a name="sample-efs-troubleshooting.permission-denied"></a>

通过挂载 Amazon EFS 不支持 IAM 授权 CodeBuild。如果您使用的是自定义 Amazon EFS 文件系统策略，则需要向所有 IAM 主体授予读写权限。例如：

```
"Principal": {
  "AWS": "*"
}
```

## CLIENT\$1ERROR：挂载 127.0.0.1:/ 失败。连接被对等方重置
<a name="sample-efs-troubleshooting.connection-reset"></a>

有两种可能的原因会导致此错误：
+  CodeBuild VPC 子网与 Amazon EFS 挂载目标位于不同的可用区中。您可以通过在 Amazon EFS 挂载目标所在的同一可用区中添加 VPC 子网来解决此问题。
+ 安全组不具备与 Amazon EFS 通信的权限。您可以通过添加入站规则来允许来自 VPC（为您的 VPC 添加主要 CIDR 块）或安全组本身的所有流量，从而解决此问题。

## VPC\$1CLIENT\$1ERROR：意外的 EC2 错误： UnauthorizedOperation
<a name="sample-efs-troubleshooting.unauthorized-operation"></a>

当 CodeBuild项目的 VPC 配置中的所有子网均为公有子网时，就会发生此错误。您在 VPC 中必须至少有一个私有子网才能确保网络连接正常。