AWS CodeBuild 疑难解答 - AWS CodeBuild
来自错误存储库的 Apache Maven 构建参考构件默认情况下,以根用户身份运行构建命令当文件名包含非美国英语字符时, 英语字符当从 Amazon EC2 Parameter Store 获取参数时,构建可能失败无法在 CodeBuild 控制台中访问分支筛选条件 无法查看构建是成功还是失败 未向源提供商报告的构建状态无法找到并选择 Windows Server Core 2019 平台的基本映像 构建规范文件中的前期命令无法被后续命令识别错误:尝试下载缓存时的“访问被拒绝”错误:使用自定义构建映像时为“BUILD_CONTAINER_UNABLE_TO_PULL_IMAGE” 错误:“Build container found dead before completing the build. build container dead because it was out of memory, or the Docker image is not supported. (生成容器在完成构建之前发现了死信。生成容器因内存不足或 Docker 映像不受支持 ErrorCode:500 英寸 错误:运行构建时的“Cannot connect to the Docker daemon (无法连接到 Docker 守护程序)”错误:“CodeBuild “is experiencing an issue (遇到了一个问题)”错误:“CodeBuild 在创建或更新构建项目时, 无权执行:sts:AssumeRole” 错误:“调用 GetBucketAcl 时出错:存储桶拥有者已更改或服务角色不再具有调用 s3:GetBucketAcl 的权限 错误:“无法上传构件:“Invalid arn”(在运行构建时无效 ARN)错误:“Git clone failed:无法访问 'your-repository-URL':SSL 证书问题:自签名证书”错误:在运行构建时,“必须使用指定的终端节点来寻址您尝试访问的存储桶”错误:“策略的默认版本不是通过增强的零单击角色创建创建的,或者不是通过增强的零单击角色创建创建的最新版本。”错误:“此构建映像要求至少选择一个运行时版本。”错误:“QUEUED:INSUFFICIENT_SUBNET”,当构建队列中的构建失败时错误:“Unable to download cache:RequestError:发送请求失败原因:x509:Failed to load system roots and no roots provided (无法加载系统根并且未提供根)”错误:“无法从 S3 下载证书。AccessDenied "错误:“找不到凭证” 在代理服务器中运行 RequestError 时出现 CodeBuild 超时错误bourne shell (sh) 必须存在于构建映像中警告:运行构建时“Skipping install of runtimes. runtime version selection are not supported by this build image (跳过运行时安装。此构建映像不支持运行时版本选择)”错误:“无法验证 JobWorker 身份”访问本地缓存构建中的 GitHub 元数据
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS CodeBuild 疑难解答

使用本主题中的信息来帮助您识别、诊断和解决问题。要了解如何记录和监控 CodeBuild 版本以排查问题,请参阅日志记录和监控

主题

来自错误存储库的 Apache Maven 构建参考构件

问题: 在将 Maven 与 AWS CodeBuild 提供的 Java 构建环境结合使用时,Maven 从安全的 Maven 中央存储库 (https://repo1.maven.org/maven2) 中提取构建和插件依赖项。即使您构建项目的 pom.xml 文件明确声明会改用其他位置,也会发生这种情况。

可能的原因:CodeBuild 提供的 Java 构建环境包含一个名为 settings.xml 的文件,该文件预先安装在构建环境的 /root/.m2 目录中。该 settings.xml 文件包含以下声明,这些声明将指示 Maven 始终从安全的 Maven 中央存储库 (网址为 https://repo1.maven.org/maven2) 中提取构建和插件依赖项。

<settings> <activeProfiles> <activeProfile>securecentral</activeProfile> </activeProfiles> <profiles> <profile> <id>securecentral</id> <repositories> <repository> <id>central</id> <url>https://repo1.maven.org/maven2</url> <releases> <enabled>true</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>https://repo1.maven.org/maven2</url> <releases> <enabled>true</enabled> </releases> </pluginRepository> </pluginRepositories> </profile> </profiles> </settings>

建议的解决方案: 执行以下操作:

  1. 向源代码中添加 settings.xml 文件。

  2. 在此 settings.xml 文件中,使用上述 settings.xml 格式作为指导,声明您希望 Maven 从哪些存储库中提取构建和插件依赖项。

  3. 在构建项目的 install 阶段,指示 CodeBuild 将您的 settings.xml 文件复制到构建环境的 /root/.m2 目录。例如,考虑说明此行为的 buildspec.yml 文件中的以下代码段。

    version 0.2 phases: install: commands: - cp ./settings.xml /root/.m2/settings.xml

默认情况下,以根用户身份运行构建命令

问题:AWS CodeBuild 以根用户身份运行您的构建命令。即使您的相关构建映像的 Dockerfile 将 USER 指令设置为另一位用户,也会发生这种情况。

原因: 默认情况下,CodeBuild 以根用户身份运行所有构建命令。

建议的解决方案: 无。

当文件名包含非美国英语字符时, 英语字符

问题: 当您运行使用文件名包含非美国英语字符的文件的构建时, 字符(例如,中文字符),则构建将失败。

可能的原因: 提供的构建环境将其默认区域设置设为 AWS CodeBuild。POSIX 本地化设置不太兼容 POSIX 以及包含非美国英语CodeBuild 字符,可能会导致相关构建失败。

建议的解决方案: 将以下命令添加到 buildspec 文件的 pre_build 部分。这些命令使构建环境使用美国英语 UTF-8 作为其本地化设置,该格式与 CodeBuild 和包含非美国英语 的文件名。

对于基于 Ubuntu 的构建环境:

pre_build: commands: - export LC_ALL="en_US.UTF-8" - locale-gen en_US en_US.UTF-8 - dpkg-reconfigure locales

对于基于 Amazon Linux 的构建环境:

pre_build: commands: - export LC_ALL="en_US.utf8"

当从 Amazon EC2 Parameter Store 获取参数时,构建可能失败

问题: 当构建尝试获取存储在 Amazon EC2 Parameter Store 中的一个或多个参数的值时,处于 DOWNLOAD_SOURCE 阶段的构建将失败并出现错误 Parameter does not exist

可能的原因: 构建项目所依赖的服务角色无权调用 ssm:GetParameters 操作,或构建项目使用由 AWS CodeBuild 生成的服务角色并允许调用 ssm:GetParameters 操作,但参数的名称不以 /CodeBuild/ 开头。

建议的解决方案:

  • 如果服务角色不是由 CodeBuild 生成的,请将其定义更新为允许 CodeBuild 调用 ssm:GetParameters 操作。例如,以下策略语句允许调用 ssm:GetParameters 操作以获取名称以 /CodeBuild/ 开头的参数:

    { "Version": "2012-10-17", "Statement": [ { "Action": "ssm:GetParameters", "Effect": "Allow", "Resource": "arn:aws:ssm:REGION_ID:ACCOUNT_ID:parameter/CodeBuild/*" } ] }
  • 如果服务角色是由 CodeBuild 生成的,请更新其定义以允许 CodeBuild 访问 Amazon EC2 Parameter Store 中名称并非以 /CodeBuild/ 开头的参数。 例如,以下策略语句允许调用 ssm:GetParameters 操作以获取具有指定名称的参数:

    { "Version": "2012-10-17", "Statement": [ { "Action": "ssm:GetParameters", "Effect": "Allow", "Resource": "arn:aws:ssm:REGION_ID:ACCOUNT_ID:parameter/PARAMETER_NAME" } ] }

无法在 CodeBuild 控制台中访问分支筛选条件

问题: 当您创建或更新 AWS CodeBuild 项目时,控制台中的分支筛选条件选项不可用。

可能的原因: 分支筛选条件选项已弃用。它已被 Webhook 筛选条件组取代,后者可以更好地控制触发新 CodeBuild 中的构建的 Webhook 事件。

建议的解决方案: 要迁移在引入 Webhook 筛选条件之前创建的分支筛选条件,请使用正则表达式 HEAD_REF 创建带 ^refs/heads/branchName$ 筛选条件的 Webhook 筛选条件组。 例如,如果您的分支筛选条件正则表达式为 ^branchName$,则您在 HEAD_REF 筛选条件中放置的更新的正则表达式为 ^refs/heads/branchName$。 有关更多信息,请参阅Bitbucket Webhook 事件筛选 GitHub Webhook 事件(控制台)

无法查看构建是成功还是失败

问题: 您无法看到重试构建是成功还是失败。

可能的原因: 用于报告构建状态的选项未启用。

建议的解决方案: 在创建或更新 项目时启用 Report build status (报告构建状态)CodeBuild。此选项告知 CodeBuild 在触发构建时报告状态。有关更多信息,请参阅 API 参考reportBuildStatus 中的 AWS CodeBuild

未向源提供商报告的构建状态

问题: 允许向源提供商(如 GitHub 或 Bitbucket)报告构建状态后,构建状态不会更新。

可能的原因: 与源提供程序关联的用户没有对存储库的写入访问权限。

建议的解决方案: 为了能够向源提供商报告生成包状态,与源提供商关联的用户必须对存储库具有写访问权限。如果用户没有写访问权限,则无法更新生成包状态。有关更多信息,请参阅 源提供商访问

无法找到并选择 Windows Server Core 2019 平台的基本映像

问题: 无法找到或选择 Windows Server Core 2019 平台的基本映像。

可能的原因: 您使用的是不支持此映像的 AWS 区域。

建议的解决方案: 使用以下支持 Windows Server Core 2019 平台基本映像的 AWS 区域之一:

  • 美国东部(弗吉尼亚北部)

  • 美国东部(俄亥俄州)

  • 美国西部(俄勒冈)

  • 欧洲(爱尔兰)

构建规范文件中的前期命令无法被后续命令识别

问题: 构建规范文件中一个或多个命令的结果无法被同一构建规范文件中的后续命令识别。例如,某个命令可能会设置本地环境变量,但稍后运行的命令可能无法获取该本地环境变量的值。

可能的原因: 在构建规范文件版本 0.1 中,AWS CodeBuild 将在构建环境内默认 Shell 的单独实例中运行每个命令。这表示各个命令独立于其他所有命令而运行。默认情况下,您无法运行依赖于任何先前命令的状态的单个命令。

建议的解决方案: 我们建议您使用构建规范版本 0.2,它解决了此问题。如果您必须使用构建规范版本 0.1,建议您使用 Shell 命令链接运算符(例如,Linux 中的 &&)将多个命令合并为一个命令。或者,您也可以在源代码中包括一个带有多个命令的 Shell 脚本,然后从 buildspec 文件中的单个命令调用该 Shell 脚本。有关更多信息,请参阅 构建环境中的 Shell 和命令构建环境中的环境变量

错误:尝试下载缓存时的“访问被拒绝”

问题: 尝试下载已启用缓存的构建项目上的缓存时,您会收到 Access denied 错误。

可能的原因:

  • 您刚刚已将缓存配置为您的构建项目的一部分。

  • 最近已通过 InvalidateProjectCache API 使缓存失效。

  • 使用的服务角色对包含缓存的 S3 存储桶没有 CodeBuild 和 s3:GetObject 权限。s3:PutObject

建议的解决方案: 首次使用时,在更新缓存配置后立即看到此错误是正常的。如果此错误持续存在,则您应该检查您的服务角色对包含缓存的 S3 存储桶是否具有 s3:GetObjects3:PutObject 权限。有关更多信息,请参阅 https://docs.amazonaws.cn/AmazonS3/latest/dev/using-with-s3-actions.html 开发人员指南 中的Amazon S3指定 S3 权限

错误:使用自定义构建映像时为“BUILD_CONTAINER_UNABLE_TO_PULL_IMAGE”

问题: 当您尝试运行使用自定义构建映像的构建时,构建将失败,并显示错误 BUILD_CONTAINER_UNABLE_TO_PULL_IMAGE

可能的原因: 构建映像的整体未压缩大小大于构建环境计算类型的可用磁盘空间。要检查构建映像的大小,请使用 Docker 运行 docker images REPOSITORY:TAG 命令。有关按计算类型分类的可用磁盘空间的列表,请参阅构建环境计算类型

建议的解决方案: 对较大的计算类型使用更多的可用磁盘空间,或者减小自定义构建映像的大小。

可能的原因: AWS CodeBuild 无权从您的 Amazon Elastic Container Registry (Amazon ECR) 中拉取构建映像。

建议的解决方案: 更新 Amazon ECR 的存储库中的权限,以便 CodeBuild 可以将自定义构建映像拉取到构建环境中。有关更多信息,请参阅Amazon ECR 示例

可能的原因: 您请求的 Amazon ECR 映像在您的 AWS 账户使用的 AWS 区域中不可用。

建议的解决方案: 使用位于您的 AWS 账户所使用的 AWS 区域中的 Amazon ECR 映像。

可能的原因: 您正在使用不具有公共 Internet 访问权限的 VPC 中的私有注册表。CodeBuild 无法从 VPC 中的私有 IP 地址拉取映像。有关更多信息,请参阅 适用于 CodeBuild 的私有注册表与 AWS Secrets Manager 示例

建议的解决方案: 如果您在 VPC 中使用私有注册表,请确保 VPC 具有公共 Internet 访问权限。

可能的原因: 如果错误消息包含“toomanyrequests ",并且映像是从 Docker Hub 获取的,此错误意味着已达到 Docker Hub 拉取限制。

建议的解决方案: 使用 Docker Hub 私有注册表或从 Amazon ECR 获取映像。有关使用私有注册表的更多信息,请参阅 适用于 CodeBuild 的私有注册表与 AWS Secrets Manager 示例。有关使用 Amazon ECR 的更多信息,请参阅适用于 CodeBuild 的 Amazon ECR 示例

错误:“Build container found dead before completing the build. build container dead because it was out of memory, or the Docker image is not supported. (生成容器在完成构建之前发现了死信。生成容器因内存不足或 Docker 映像不受支持 ErrorCode:500 英寸

问题: 当您尝试在 AWS CodeBuild 中使用 Microsoft Windows 或 Linux 容器时,此错误将在 PROVISIONING 阶段发生。

可能的原因:

  • CodeBuild 不支持容器操作系统版本。

  • 在容器中指定了 HTTP_PROXY 和/或 HTTPS_PROXY

建议的解决方案:

  • 对于 Microsoft Windows,使用其中容器操作系统版本为 microsoft/windowsservercore:10.0.x(例如,microsoft/windowsservercore:10.0.14393.2125)的 Windows 容器。

  • 对于 Linux,请在 Docker 映像中清除 HTTP_PROXYHTTPS_PROXY 设置,或在构建项目中指定 VPC 配置。

错误:运行构建时的“Cannot connect to the Docker daemon (无法连接到 Docker 守护程序)”

问题: 您的构建失败,并且您将在构建日志中收到类似于 Cannot connect to the Docker daemon at unix:/var/run/docker.sock. Is the docker daemon running? 的错误。

可能的原因: 您未在特权模式下运行构建。

建议的解决方案: 请按照以下步骤在特权模式下运行构建:

  1. 通过以下网址打开 CodeBuild 控制台:https://console.amazonaws.cn/codebuild/

  2. 在导航窗格中选择 Build projects (构建项目),然后选择您的生成包。

  3. Edit (编辑) 中,选择 Environment (环境)

  4. 选择 Override images (覆盖映像),然后选择 Environment (环境)

  5. 指定环境映像、操作系统、运行时和映像。这些设置应与失败的构建的设置匹配。

  6. 选择 Privileged (特权)

    注意

    By default, Docker containers do not allow access to any devices. Privileged mode grants a build project's Docker container access to all devices. For more information, see Runtime Privilege and Linux Capabilities on the Docker Docs website.

  7. 选择 Update environment (更新环境)

  8. 选择 Start build (启动构建) 来重试您的生成包。

错误:“CodeBuild “is experiencing an issue (遇到了一个问题)”

问题: 当您尝试运行构建项目时,您将在构建的 PROVISIONING 阶段收到此错误。

可能的原因: 您的构建使用的环境变量对 AWS CodeBuild 来说过大。当所有环境变量的长度(所有名称和值加在一起)超出最大组合长度(约 5,500 个字符)时,CodeBuild 可能会引发错误。

建议的解决方案: 使用 Amazon EC2 Systems Manager Parameter Store 存储大型环境变量,然后从构建规范文件中检索它们。Amazon EC2 Systems ManagerParameter Store 可以存储组合长度为 4,096 个字符或更少的字符的单个环境变量 (名称和值加在一起)。要存储大型环境变量,请参阅 https://docs.amazonaws.cn/systems-manager/latest/userguide/systems-manager-paramstore.html 用户指南 中的 Systems Manager Parameter Store 和 Amazon EC2 Systems ManagerSystems Manager Parameter Store 控制台演练。要检索它们,请参阅构建规范语法中的 parameter-store 映射。

错误:“CodeBuild 在创建或更新构建项目时, 无权执行:sts:AssumeRole”

问题: 当您尝试创建或更新构建项目时,您会收到错误 Code:InvalidInputException, Message:CodeBuild is not authorized to perform: sts:AssumeRole on arn:aws:iam::account-ID:role/service-role-name

可能的原因:

  • AWS Security Token Service (AWS STS) 已在您尝试创建或更新构建项目的 AWS 区域停用。

  • 与构建项目相关联的 AWS CodeBuild 服务角色不存在,或没有足够的权限来信任 CodeBuild。

建议的解决方案:

  • 确保 AWS STS 已经为您尝试创建或更新构建项目的 AWS 区域激活。有关更多信息,请参阅 中的AWS STS在 AWS 区域中激活和停用 IAM 用户指南

  • 确保您的 AWS 账户中存在目标 CodeBuild 服务角色。如果您没有使用控制台,请确保在创建或更新构建项目时没有拼错服务角色的 Amazon 资源名称 (ARN)。

  • 确保目标 CodeBuild 服务角色具有足够的权限来信任 CodeBuild。有关更多信息,请参阅 创建 CodeBuild 服务角色 中的信任关系策略声明。

错误:“调用 GetBucketAcl 时出错:存储桶拥有者已更改或服务角色不再具有调用 s3:GetBucketAcl 的权限

问题: 在运行构建时,您会收到有关 S3 存储桶所有权更改和 GetBucketAcl 权限更改的错误。

可能的原因: 您已将 s3:GetBucketACLs3:GetBucketLocation 权限添加到您的 IAM 角色。这些权限可保护您项目的 S3 存储桶,并确保只有您可以访问它。添加完这些权限后,S3 存储桶的拥有者会发生更改。

建议的解决方案: 确认您是 S3 存储桶的拥有者,然后再次为 IAM 角色添加权限。有关更多信息,请参阅对 S3 存储桶的安全访问

错误:“无法上传构件:“Invalid arn”(在运行构建时无效 ARN)

问题: 当您运行构建时,UPLOAD_ARTIFACTS 构建阶段将失败,并显示错误 Failed to upload artifacts: Invalid arn

可能的原因: 您的 S3 输出存储桶(AWS CodeBuild 用于存储其构建输出的存储桶)位于不同于 AWS 构建项目的 CodeBuild 区域中。

建议的解决方案: 更新构建项目的设置,以指向与构建项目位于同一 AWS 区域的输出存储桶。

错误:“Git clone failed:无法访问 'your-repository-URL':SSL 证书问题:自签名证书”

问题: 当您尝试运行构建项目时,构建将失败并出现此错误。

可能的原因: 您的源存储库具有一个自签名证书,但您在构建项目的过程中未选择从您的 S3 存储桶安装此证书。

建议的解决方案:

  • 编辑您的项目。对于 Certificate,选择 Install certificate from S3。对于 Bucket of certificate,选择存储您的 SSL 证书的 S3 存储桶。对于 Object key of certificate (证书的对象键),键入您的 S3 对象键的名称。

  • 编辑您的项目。选择 Insecure SSL (不安全的 SSL),在连接到您的 GitHub Enterprise Server 项目存储库时忽略 SSL 警告。

    注意

    建议您仅将 Insecure SSL 用于测试。它不应在生产环境中使用。

错误:在运行构建时,“必须使用指定的终端节点来寻址您尝试访问的存储桶”

问题: 当您运行构建时,DOWNLOAD_SOURCE 构建阶段将失败,并显示错误 The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint

可能的原因: 您的预构建源代码存储在 S3 存储桶中,并且该存储桶位于与 AWS 构建项目不同的 AWS CodeBuild 区域中。

建议的解决方案: 更新构建项目的设置,以指向包含预构建源代码的存储桶。确保该存储桶位于与构建项目相同的 AWS 区域中。

错误:“策略的默认版本不是通过增强的零单击角色创建创建的,或者不是通过增强的零单击角色创建创建的最新版本。”

问题: 当您尝试在控制台中更新项目时,更新失败并显示此错误:

可能的原因:

  • 您已更新附加到目标 AWS CodeBuild 服务角色的策略。

  • 您已选择附加到目标 CodeBuild 服务角色的策略的较早版本。

建议的解决方案:

  • 编辑 CodeBuild 项目,并清除 Allow CodeBuild to modify this service role so it can be used with this build project (允许 AWS CodeBuild 修改此服务角色以便它可用于此构建项目) 复选框。验证您正在使用的 CodeBuild 服务角色是否具有足够的权限。如果再次编辑 CodeBuild 项目,则必须再次清除此复选框。有关更多信息,请参阅创建 CodeBuild 服务角色

  • 请按照以下步骤操作,编辑 CodeBuild 项目以使用新的服务角色:

    1. 打开 IAM 控制台并创建新的服务角色。有关更多信息,请参阅创建 CodeBuild 服务角色

    2. Open the AWS CodeBuild console at https://console.amazonaws.cn/codesuite/codebuild/home.

    3. 在导航窗格中,选择 Build projects

    4. 选择构建项目旁边的按钮,选择 Edit (编辑),然后选择 Environment (环境)

    5. 对于 Service role (服务角色),选择您创建的角色。

    6. 选择 Update environment (更新环境)

错误:“此构建映像要求至少选择一个运行时版本。”

问题: 当您运行构建时,DOWNLOAD_SOURCE 构建阶段将失败,并显示错误 YAML_FILE_ERROR: This build image requires selecting at least one runtime version

可能的原因: 您的构建使用 1.0 版或更高版本的 Amazon Linux 2 (AL2) 标准映像或者 2.0 版或更高版本的 Ubuntu 标准映像,并且在 buildspec 文件中未指定运行时。

建议的解决方案: 如果您使用 aws/codebuild/standard:2.0 CodeBuild 托管映像,则必须在 buildspec 文件的 runtime-versions 部分中指定运行时版本。例如,您可以对使用 PHP 的项目使用以下 buildspec 文件:

version: 0.2 phases: install: runtime-versions: php: 7.3 build: commands: - php --version artifacts: files: - README.md
注意

If you specify a runtime-versions section and use an image other than Ubuntu Standard Image 2.0 or later, or the Amazon Linux 2 (AL2) standard image 1.0 or later, the build issues the warning, "Skipping install of runtimes. Runtime version selection is not supported by this build image."

有关更多信息,请参阅Specify runtime versions in the buildspec file

错误:“QUEUED:INSUFFICIENT_SUBNET”,当构建队列中的构建失败时

问题: 构建队列中的构建将失败,并显示类似于 QUEUED: INSUFFICIENT_SUBNET 的错误。

可能的原因: 为您的 VPC 指定的 IPv4 CIDR 块使用预留 IP 地址。每个子网 CIDR 块中的前四个 IP 地址和最后一个 IP 地址无法供您使用,而且无法分配到一个实例。例如,在具有 CIDR 块 10.0.0.0/24 的子网中,以下五个 IP 地址是保留的:

  • 10.0.0.0::网络地址。

  • 10.0.0.1:由 AWS 为 VPC 路由器预留。

  • 10.0.0.2:由 AWS 预留。DNS 服务器的 IP 地址始终为 VPC 网络范围的基址 + 2;但是,我们也保留了每个子网范围基址 + 2 的 IP 地址。对于具有多个 CIDR 块的 VPCs,DNS 服务器的 IP 地址位于主要 CIDR 中。有关更多信息,请参阅 https://docs.amazonaws.cn/vpc/latest/userguide/VPC_DHCP_Options.html#AmazonDNS 用户指南 中的 Amazon VPCAmazon DNS 服务器

  • 10.0.0.3:由 AWS 预留,供将来使用。

  • 10.0.0.255:网络广播地址。我们不支持 VPC 中的广播。该地址是预留的。

建议的解决方案: 检查您的 VPC 是否使用预留 IP 地址。将任何预留的 IP 地址替换为未预留的 IP 地址。有关更多信息,请参阅 https://docs.amazonaws.cn/vpc/latest/userguide/VPC_Subnets.html#VPC_Sizing 用户指南 中的 Amazon VPCVPC 和子网大小调整

错误:“Unable to download cache:RequestError:发送请求失败原因:x509:Failed to load system roots and no roots provided (无法加载系统根并且未提供根)”

问题: 当您尝试运行构建项目时,构建将失败并出现此错误。

可能的原因: 您将缓存配置为您的构建项目的一部分,并且使用的是包含过期根证书的较旧 Docker 映像。

建议的解决方案: 更新您的 AWS CodeBuild 项目中使用的 Docker 镜像。有关更多信息,请参阅CodeBuild 提供的 Docker 映像

错误:“无法从 S3 下载证书。AccessDenied "

问题: 当您尝试运行构建项目时,构建将失败并出现此错误。

可能的原因:

  • 您选择了错误的证书 S3 存储桶。

  • 您输入了错误的证书对象键。

建议的解决方案:

  • 编辑您的项目。对于 Bucket of certificate,选择存储您的 SSL 证书的 S3 存储桶。

  • 编辑您的项目。对于 Object key of certificate (证书的对象键),键入您的 S3 对象键的名称。

错误:“找不到凭证”

问题: 当您尝试运行 AWS CLI、使用 AWS 开发工具包或调用其他类似组件作为构建的一部分时,您会收到与 AWS CLI、AWS 开发工具包或组件直接相关的构建错误。例如,您可能会收到构建错误,如 Unable to locate credentials

可能的原因:

  • 构建环境中的 AWS CLI、AWS 开发工具包或组件的版本与 AWS CodeBuild 不兼容。

  • 您将在使用 Docker 的构建环境内运行 Docker 容器,并且此容器在默认情况下无权访问 AWS 凭证。

建议的解决方案:

  • 确保您的构建环境具有以下版本或更高版本的 AWS CLI、AWS 开发工具包或组件。

    • AWS CLI:1.10.47

    • 适用于 C++ 的 AWS 开发工具包:0.2.19

    • 适用于 Go 的 AWS 开发工具包:1.2.5

    • 适用于 Java 的 AWS 开发工具包:1.11.16

    • 适用于 AWS 的 JavaScript 开发工具包:2.4.7

    • 适用于 PHP 的 AWS 开发工具包:3.18.28

    • 适用于 Python 的 AWS 开发工具包 (Boto3):1.4.0

    • 适用于 Ruby 的 AWS 开发工具包:2.3.22

    • Botocore:1.4.37

    • CoreCLR:3.2.6-beta

    • Node.js:2.4.7

  • 如果您需要在某个构建环境中运行某个 Docker 容器,而该容器需要 AWS 凭证,则必须将此凭证从该构建环境传递到该容器。在您的 buildspec 文件中,包含类似于下面的 Docker run 命令。此示例使用 aws s3 ls 命令列出您的可用 S3 存储桶。-e 选项将为容器传递访问 AWS 凭证所需的环境变量。

    docker run -e AWS_DEFAULT_REGION -e AWS_CONTAINER_CREDENTIALS_RELATIVE_URI your-image-tag aws s3 ls
  • 如果您要构建 Docker 映像并且该构建需要 AWS 凭证(例如,从 Amazon S3 下载文件),则必须将凭证从构建环境传递到 Docker 构建过程,如下所示。

    1. 在您的源代码的用于 Docker 映像的 Dockerfile 中,指定以下 ARG 指令。

      ARG AWS_DEFAULT_REGION ARG AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
    2. 在您的 buildspec 文件中,包含类似于下面的 Docker build 命令。--build-arg 选项将为 Docker 构建过程设置访问 AWS 凭证所需的环境变量。

      docker build --build-arg AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION --build-arg AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI -t your-image-tag .

在代理服务器中运行 RequestError 时出现 CodeBuild 超时错误

问题: 您将收到类似于以下内容之一的 RequestError 错误:

  • RequestError: send request failed caused by: Post https://logs.<your-region>.amazonaws.com/: dial tcp 52.46.158.105:443: i/o timeout 从 CloudWatch Logs。

  • Error uploading artifacts: RequestError: send request failed caused by: Put https://your-bucket.s3.your-aws-region.amazonaws.com/*: dial tcp 52.219.96.208:443: connect: connection refused 从 Amazon S3。

可能的原因:

  • ssl-bump 未正确配置。

  • 贵组织的安全策略不允许您使用 ssl_bump

  • 您的 buildspec 文件没有使用 proxy 元素指定的代理设置。

建议的解决方案:

  • 确保 ssl-bump 已正确配置。如果您对代理服务器使用 Squid,请参阅 将 Squid 配置为显式代理服务器

  • 按照以下步骤操作,为 Amazon S3 和 CloudWatch Logs 使用私有终端节点:

    1. 在您的私有子网路由表中,删除您添加的、将发往 Internet 的流量路由到您的代理服务器的规则。有关信息,请参阅 用户指南 中的在 VPC 中创建子网Amazon VPC。

    2. 创建私有 Amazon S3 终端节点和 CloudWatch Logs 终端节点,然后将其与您的 Amazon VPC 私有子网关联。有关信息,请参阅 用户指南PrivateLink 中的 VPC 终端节点服务 (AWS )Amazon VPC。

    3. 确认选中了 中的 Enable Private DNS Name (启用私有 DNS 名称)Amazon VPC。有关更多信息,请参阅 https://docs.amazonaws.cn/AmazonVPC/latest/UserGuide/vpce-interface.html#create-interface-endpoint 用户指南 中的Amazon VPC创建接口终端节点

  • 如果您不将 ssl-bump 用于显式代理服务器,请使用 proxy 元素将代理配置添加到您的 buildspec 文件。有关更多信息,请参阅 在显式代理服务器中运行 CodeBuild构建规范语法

    version: 0.2 proxy: upload-artifacts: yes logs: yes phases: build: commands:

bourne shell (sh) 必须存在于构建映像中

问题: 您使用的是 AWS CodeBuild 未提供的构建映像,并且您的构建失败并显示消息 Build container found dead before completing the build

可能的原因: Bourne shell (sh) 未包含在您的构建映像中。CodeBuild 需要 sh 来运行构建命令和脚本。

建议的解决方案: 如果构建映像中不存在 sh,请确保在启动使用映像的任何其他构建前包含它。(CodeBuild 已将 sh 包含在其构建映像中。)

警告:运行构建时“Skipping install of runtimes. runtime version selection are not supported by this build image (跳过运行时安装。此构建映像不支持运行时版本选择)”

问题: 当您运行构建时,构建日志包含此警告。

可能的原因: 您的构建未使用 1.0 版或更高版本的 Amazon Linux 2 (AL2) 标准映像或者 2.0 版或更高版本的 Ubuntu 标准映像,并且在构建规范文件的 runtime-versions 部分中指定了运行时。

建议的解决方案: 确保您的 buildspec 文件不包含 runtime-versions 部分。仅当使用 Amazon Linux 2 (AL2) 标准映像或更高版本或者 Ubuntu 标准映像版本 2.0 或更高版本时,才需要 runtime-versions 部分。

错误:在打开 JobWorker 控制台时的“无法验证 CodeBuild 身份”

问题: 当您打开 CodeBuild 控制台时,将显示“Unable to verify JobWorker identity (无法验证 AWS RoboMaker 身份)”错误消息。

可能的原因: 用于控制台访问的 IAM 角色具有以 jobId 作为键的标签。此标签键是为 CodeBuild 预留的,如果存在此错误,将导致它。

建议的解决方案: 更改键为 IAM 的任何自定义 jobId 角色标签以具有不同键,例如 jobIdentifier

访问本地缓存构建中的 GitHub 元数据

问题: 在某些情况下,缓存构建中的 .git 目录是文本文件而不是目录。

可能的原因: 当为构建启用本地源缓存时,CodeBuild 会为 .git 目录创建一个 gitlink。这意味着,.git 目录实际上是一个包含目录路径的文本文件。

建议的解决方案: 在所有情况下,使用以下命令获取 Git 元数据目录。无论 .git 格式如何,此命令都有效:

git rev-parse --git-dir