Terraform Cloud / Enterprise - Как использовать AWS Assume Roles
Я хотел бы использовать роли AWS Assume с Terraform Cloud/Enterprise
В Terraform с открытым исходным кодом вы обычно просто выполняете роль Assume, используя профиль.aws/Credential в интерфейсе командной строки, который является начальной аутентификацией, и выполняете роль Assume:
provider "aws" {
assume_role {
role_arn = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"
session_name = "SESSION_NAME"
external_id = "EXTERNAL_ID"
}
}
Проблема в том, что с Terraform Enterprise или Cloud вы не можете ссылаться на профиль, поскольку неизменяемая инфраструктура не будет иметь этого файла в своем каталоге.
Terraform Cloud/Enterprise должен иметь идентификатор ключа доступа и секретный ключ доступа, заданные в качестве переменной, чтобы его инфраструктура могла выполнять Terraform RUN через свой конвейер и аутентифицироваться для любой учетной записи AWS, которую вы хотите предоставить.
Итак, возникает вопрос: как я могу выполнить роль AWS Assume, используя идентификатор ключа доступа и секретный ключ доступа учетной записи AWS с политикой "Action": "sts:Assume Role"?
Я бы подумал, что приведенное ниже будет работать, однако Terraform выполняет первоначальную аутентификацию через кредиты профиля учетных данных AWS для учетной записи, которая имеет политику sts: Assume Role.
Может ли Terraform взглянуть на access_key и secret_key, чтобы определить, какую учетную запись AWS использовать при попытке взять на себя роль, а не использовать профиль учетных данных AWS?
provider "aws" {
region = var.aws_region
access_key = var.access_key_id
secret_key = var.secret_access_key
assume_role {
role_arn = "arn:aws:iam::566264069176:role/RemoteAdmin"
#role_arn = "arn:aws:iam::<awsaccount>:role/<rolename>" # Do a replace in "file_update_automation.ps1"
session_name = "RemoteAdminRole"
}
}
Чтобы разрешить Terraform Cloud/Enterprise получить новые токены сеанса Assume Role, ему необходимо будет использовать Access_key и Secret_key, чтобы сообщить ему, какая учетная запись AWS имеет роль sts:accept, связь с учетной записью AWS, которую необходимо подготовить, и не профиль AWS Creds
Спасибо
4 ответа
Этого можно достичь, если у вас есть бизнес-план и вы внедрите в свою инфраструктуру самостоятельных агентов терраформирования . См. видео .
Теперь можно использовать динамические учетные данные через поставщика OpenID Connect. Это относительно новая функция, которую они представили ранее в этом году (февраль 2023 г.).
См. объявление и официальную документацию: Динамические учетные данные с поставщиком AWS.
Это определенно возможно с Terraform Enterprise (TFE), если ваша инфраструктура TFE также размещена в AWS, а профилю экземпляра доверяет роль, которую вы пытаетесь взять на себя.
Для Terraform Cloud (TFC) это другая история, сегодня нет способа создать доверительные отношения между TFC и ролью IAM, но мы можем использовать способность AWS SDK получать учетные данные из переменных среды. У вас есть 2 варианта:
- Создать
AWS_ACCESS_KEY_ID
иAWS_SECRET_ACCESS_KEY
переменную среды в рабочей области и установите их (не забудьте пометить секретный ключ доступа как конфиденциальный). Провайдер заберет их в env и будет работать так же, как на вашем локальном компьютере. - Если все рабочие области должны использовать одни и те же ключи доступа и секретные ключи, вы можете установить переменные env в наборе переменных, который будет применяться ко всем рабочим областям.
Я использовал точно такую же конфигурацию провайдера за исключением явного добавления ключей доступа. Ключи доступа были добавлены в рабочую область Terraform Cloud как переменные среды.