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 варианта:

  1. СоздатьAWS_ACCESS_KEY_IDиAWS_SECRET_ACCESS_KEYпеременную среды в рабочей области и установите их (не забудьте пометить секретный ключ доступа как конфиденциальный). Провайдер заберет их в env и будет работать так же, как на вашем локальном компьютере.
  2. Если все рабочие области должны использовать одни и те же ключи доступа и секретные ключи, вы можете установить переменные env в наборе переменных, который будет применяться ко всем рабочим областям.

Я использовал точно такую ​​же конфигурацию провайдера за исключением явного добавления ключей доступа. Ключи доступа были добавлены в рабочую область Terraform Cloud как переменные среды.

Другие вопросы по тегам