Как указать агенту teamcity, на какой учетной записи aws запускать terraform - PullRequest
0 голосов
/ 28 мая 2020

Я превратил TeamCity в кластер Kubernetes. У меня есть одно развертывание для сервера TeamCity и одно развертывание для агента сборки TeamCity. Когда я запускаю Terraform в агенте сборки TeamCity, он создает ресурсы в той же учетной записи AWS, что и экземпляр EC2, на котором размещен кластер TeamCity Kubernetes.

Я хочу запустить сборку, которая создает ресурсы AWS в отдельной учетной записи AWS. Я думаю, что нужно назначить ключ доступа AWS и секретный ключ серверу TeamCity и передать их агенту сборки TeamCity, но я не знаю, как будет выглядеть рабочий процесс.

В настоящее время я объявил ключ доступа и секретные ключи AWS как переменные среды в сборке, но они не передаются агенту. Мои шаги сборки содержат только 3 строки

terraform init
terraform plan
terraform apply -auto-approve

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Я имел дело с очень похожей ситуацией. Когда мы начали использовать AWS, мы не следовали лучшим методам аутентификации наших скриптов в AWS.

Мы создали пользователей в каждой учетной записи и экспортировали ключи доступа и секретные ключи в нашу автоматизацию сборки TeamCity, чтобы позволить наши сценарии для запуска в контексте этих учетных записей.

Вы получите несколько пользователей в разных учетных записях и в конечном итоге будете вручную менять ключи для этих пользователей, а затем обновлять ключи доступа и секретные ключи в TeamCity каждый раз, когда вы необходимо поменять ключи.

Поскольку серверы агентов сборки TeamCity являются экземплярами EC2, в AWS рекомендуется использовать роли вместо пользователей в подобных ситуациях. Из документации AWS:

Приложениям, работающим в инстансе Amazon EC2, требуются учетные данные для доступа к другим службам AWS. Чтобы предоставить учетные данные приложению безопасным способом, используйте роли IAM. Роль - это сущность, которая имеет собственный набор разрешений, но не является пользователем или группой. У ролей также нет собственного постоянного набора учетных данных, как у пользователей IAM. В случае Amazon EC2 IAM динамически предоставляет временные учетные данные для экземпляра EC2, и эти учетные данные автоматически меняются за вас.

Источник: https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#use -roles-with-ec2

Что вам следует сделать в этой ситуации, так это создать роль в каждой учетной записи, у которой есть доступ для создания ресурсов, которые будет создавать terraform. Вам понадобится другая роль для серверов агентов сборки TeamCity, эта роль должна иметь возможность принимать роли, созданные в каждой учетной записи.

Допустим, у вас есть две учетные записи:

  1. AccountA где вы хотите, чтобы агенты сборки запускали ресурсы сборки с помощью terraform.
  2. AccountB - это учетная запись, с которой работают ваши агенты сборки.

Вам понадобится:

  1. Роль в AccountA с доступом для создания ресурсов.
  2. Роль в AccountB, которая предоставляет доступ экземплярам ec2 для выполнения указанной выше роли.

Профиль экземпляра роль в AccountB должна быть назначена серверам агентов сборки TeamCity. После этого серверы агента сборки могут взять на себя роль в AccountA и работать в контексте этой учетной записи с необходимыми разрешениями без необходимости жестко заданного доступа и секретных ключей.

Вы можете повторить этот процесс для столько других учетных записей, сколько вы хотите встраивать ресурсы через Terraform.

Вам нужно будет добавить следующий блок к aws провайдеру в ваших скриптах terraform, чтобы terraform знал, какую роль принять на себя:

provider "aws" {
assume_role {
role_arn = "arn:aws:iam::<ACCOUNTA>:role/<ROLENAME>"
}
}

Вот некоторая AWS документация о том, как предоставить доступ к корзине S3 в другой учетной записи из экземпляра EC2: https://aws.amazon.com/premiumsupport/knowledge-center/s3-instance-access-bucket/

Еще одна полезная страница документации на нем рассматриваются IAM Roes, профили экземпляров EC2 и доступ между учетными записями через роли здесь: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html

Последняя ссылка указывает именно на то, что вы пытаетесь сделать: https://blog.e-zest.com/aws-ec2-assume-role-with-terraform

0 голосов
/ 29 мая 2020

Мой файл agent.yml выглядит так, когда я хочу добавить две аннотации для 2 отдельных учетных записей

spe c: replicas: 1 selector: matchLabels: app: agent-pod template: метаданные: аннотации: iam.amazon aws .com / role: arn: aws: iam :: account: role / accoun1-s3-role iam.amazon aws .com / role: arn: aws: iam :: account: role / account2-pods-s3-role

, но как только я помещаю две аннотации, мои sts принимают роль для модуля только показывают мне вторую роль. и когда я запускаю сборку из teamcity, я получаю эту ошибку, не найдены действительные источники учетных данных для aws provider

...