我最初有一个简单的 CodePipeline 设置,由提交到 CodeCommit 存储库触发,其中一个“阶段”将源代码作为工件输出,另一个“阶段”使用 CodeBuild 从该源输出运行一些代码。现在我想在该 CodeBuild“阶段”中访问 RDS,因此我将 RDS 的 VPC 设置添加到我的 CodeBuild 项目中。
问题是,现在 CodeBuild 无法再访问 CodeCommit 源。我收到以下错误:
CLIENT_ERROR: RequestError: send request failed caused by: Get https://mypipeline-artifactstorebucket-twlrq7tj45fq.s3.amazonaws.com/MYPipeline-data-pipe/RepoSource/PKGw3xs: dial tcp 52.216.160.35:443: i/o timeout for primary source and source version arn:aws:s3:::mypipeline-artifactstorebucket-twlrq7tj45fq/MYPipeline-data-pipe/RepoSource/PKGw3xs
向 CodeBuild 项目添加 VPC 是否也会删除默认设置?(也许它最初使用的是默认 VPC?)
如何允许 CodeBuild 同时访问 RDS 和 CodeCommit?
答案1
基于 VPC 的 CodeBuild 可以访问的内容取决于您为 CodeBuild 容器使用的子网配置。
如果你把它放在私有子网确保子网已配置为通过以下方式访问互联网NAT 网关。
如果你在公共子网确保它配置为默认分配公网 IP。
请参阅此答案以了解更多信息:VPC 中的公有子网和私有子网
并且还要确保没有其他限制,例如安全组允许出站访问互联网,没有设置 NACL 等。
简单测试:是在运行 CodeBuild 容器的同一子网中启动一个小型 EC2 实例,然后从那里测试它是否可以到达 codebuild 端点(例如curl https://mypipeline-artifactstorebucket.../PKGw3xs
)。
换句话说:是的,CodeBuild 可以在 VPC 中运行并且仍然可以访问 CodeCommit,但您的子网网络配置必须正确。
希望有帮助:)
答案2
我遇到了同样的问题,尝试让 CodeBuild 从 CodeDeploy 检索代码,以便它可以将代码部署到 VPC 中的 RDS。当 CodeBuild 位于 VPC 之外时,它可以正常连接到 CodeCommit,但是一旦我将 CodeDeploy 放入 VPC,错误消息是
CLIENT_ERROR: Get https://git-codecommit.ap-southeast-2.amazonaws.com/v1/repos/repo-name/info/refs?service=name: dial tcp 1.2.3.4:443: i/o timeout for primary source and source version refs/heads/master
我根本找不到任何关于此内容的文档,因此我根据上述内容进行了反复试验。我尝试了多种组合,以找出哪些有效,哪些无效。以下是我发现的内容:
- CodeBuild 需要与 VPC 关联。我设想 CodeBuild 会在 VPC 中分配一个 ENI(实际上是私有 IP 地址)。
- CodeBuild 需要与允许出站到 VPC CIDR 范围的安全组关联。它似乎不需要入口规则,这是有道理的,因为没有任何东西调用 CodeCommi。
- 您需要一个 git-codecommit 接口端点( com.amazonaws.ap-southeast-2.git-codecommit )
- git-codecommit 端点需要与允许 CodeBuild 入口的安全组关联。最简单的方法可能就是允许从 VPC 范围入口,但您可能只需引用 CodeBuild 用于入口的安全组即可。
- 是否存在互联网网关/互联网路由并不重要。我最初是在没有互联网访问权限的私有子网中执行此操作,但后来添加了互联网网关,将其与 VPC 关联,然后将子网路由到互联网网关 (0.0.0.0/0)
希望这可以帮助其他人将 CodeBuild 或 CodePipeline 连接到 VPC 以部署到 EC2、RDS、ECS 或其他服务。
答案3
我配置时遇到了这样的错误
Type: AWS::CodeBuild::Project
Properties:
Source:
BuildSpec: buildspec-ProdCf.yml
....
但实际上 yml 文件位于子目录中。