CodeBuild с настройками VPC не может загрузить исходный код CodeCommit
Первоначально у меня была простая установка CodePipeline, инициируемая фиксацией в репозитории CodeCommit, с "Стадией", которая выводит исходный код в виде артефакта, и другой "Стадией", использующей CodeBuild для запуска некоторого кода из этого исходного вывода. Теперь я хочу получить доступ к RDS в этой "Стадии" CodeBuild, поэтому я добавил настройки VPC моего RDS в свой проект 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
Удаляет ли добавление VPC в проект CodeBuild параметры по умолчанию? (может быть, он изначально использовал VPC по умолчанию?)
Как я могу разрешить CodeBuild доступ как к RDS, так и к CodeCommit?
2 ответа
Доступ к CodeBuild на основе VPC зависит от конфигурации подсети, которую вы используете для контейнера CodeBuild.
Если вы размещаете его в частной подсети, убедитесь, что она настроена для доступа в Интернет через NAT-шлюз.
Если вы используете его в общедоступной подсети, убедитесь, что он настроен на назначение общедоступного IP- адреса по умолчанию.
Обратитесь к этому ответу для получения дополнительной информации: Публичная и частная подсеть в VPC
А также убедитесь, что нет никаких других ограничений, например, группа безопасности разрешает исходящий доступ к Интернету, не существует NACL и т. Д.
Простой тест: это раскрутить крошечный экземпляр EC2 в той же подсети, где вы запускаете контейнеры CodeBuild, и проверить оттуда, может ли он достичь конечной точки codebuild (например, curl https://mypipeline-artifactstorebucket.../PKGw3xs
).
Другими словами: да, CodeBuild можно запустить в VPC и при этом иметь доступ к CodeCommit, но ваша конфигурация сети подсети должна быть правильной.
Надеюсь, это поможет:)
У меня была такая же проблема, когда я пытался заставить CodeBuild получить код из CodeDeploy, чтобы он мог развернуть код в RDS в VPC. Когда 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 выделяет ENI (частный IP-адрес, по сути) в VPC.
- CodeBuild должен быть связан с группой безопасности, которая разрешает выход в диапазон CIDR VPC. Кажется, что правила входа не нужны, что имеет смысл, поскольку в 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 или других сервисах.
У меня была такая ошибка при настройке
Type: AWS::CodeBuild::Project
Properties:
Source:
BuildSpec: buildspec-ProdCf.yml
....
но на самом деле файл yml находился в подкаталоге.