Я имел дело с очень похожей ситуацией. Когда мы начали использовать 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, эта роль должна иметь возможность принимать роли, созданные в каждой учетной записи.
Допустим, у вас есть две учетные записи:
- AccountA где вы хотите, чтобы агенты сборки запускали ресурсы сборки с помощью terraform.
- AccountB - это учетная запись, с которой работают ваши агенты сборки.
Вам понадобится:
- Роль в AccountA с доступом для создания ресурсов.
- Роль в 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