Terraform: неверные учетные данные поставщика Terraform AWS при передаче переменных хранилища параметров системного менеджера AWS

Фон:

Я использую AWS CodeBuild buildspec.yml для перебора каталогов из репозитория GitHub для применения IaC с использованием Terraform. Чтобы получить доступ к учетным данным, необходимым для провайдера Terraform AWS, я использовал хранилище параметров системного менеджера AWS, чтобы получить доступ и секретный ключ в buildspec.yml.

Проблема:

Хранилище параметров системного менеджера маскирует значение env доступа и секретного ключа, поэтому, когда они унаследованы поставщиком Terraform AWS, поставщик выводит, что учетные данные недействительны:

Error: error configuring Terraform AWS Provider: error validating provider credentials: error calling sts:GetCallerIdentity: InvalidClientTokenId: The security token included in the request is invalid.
    status code: 403, request id: xxxx

Чтобы воспроизвести проблему:

  • Создать переменные хранилища параметров системного менеджера (TF_VAR_AWS_ACCESS_KEY_ID = доступ, TF_AWS_SECRET_ACCESS_KEY = секрет)

  • Создайте проект AWS CodeBuild с помощью:

 "source": {
                "type": "NO_SOURCE",
}
"environment": {
                "type": "LINUX_CONTAINER",
                "image": "aws/codebuild/standard:4.0",
                "computeType": "BUILD_GENERAL1_SMALL"
}

buildspec.yml со следующим: (изменено для создания файлов .tf вместо получения из github)

version: 0.2
env:
  shell: bash
  parameter-store:
    TF_VAR_AWS_ACCESS_KEY_ID: TF_AWS_ACCESS_KEY_ID
    TF_VAR_AWS_SECRET_ACCESS_KEY: TF_AWS_SECRET_ACCESS_KEY
phases:
  install:
    commands:
      - wget https://releases.hashicorp.com/terraform/0.12.28/terraform_0.12.28_linux_amd64.zip -q
      - unzip terraform_0.12.28_linux_amd64.zip && mv terraform /usr/local/bin/
      - printf "provider "aws" {\n\taccess_key = var.AWS_ACCESS_KEY_ID\n\tsecret_key = var.AWS_SECRET_ACCESS_KEY\n\tversion    = \"~> 3.2.0\"\n}" >> provider.tf
      - printf "variable "AWS_ACCESS_KEY_ID" {}\nvariable "AWS_SECRET_ACCESS_KEY" {}" > vars.tf
      - printf "resource \"aws_s3_bucket\" \"test\" {\n\tbucket = \"test\"\n\tacl = \"private\"\n}" >> s3.tf
      - terraform init
      - terraform plan

Попытки:

  1. Передача кредитов через параметр terraform -vars:
terraform plan -var="AWS_ACCESS_KEY_ID=$TF_VAR_AWS_ACCESS_KEY_ID" -var="AWS_ACCESS_KEY_ID=$TF_VAR_AWS_SECRET_ACCESS_KEY"

но я получаю ту же ошибку неверных учетных данных

  1. Учетные данные хранилища параметров диспетчера системы экспорта в buildspec.yml:
commands:
  - export AWS_ACCESS_KEY_ID=$TF_VAR_AWS_ACCESS_KEY_ID
  - export AWS_SECRET_ACCESS_KEY=$TF_VAR_AWS_SECRET_ACCESS_KEY

что приводит к дублированию замаскированных переменных и той же ошибке, описанной выше. printenv вывод в buildspec.yml:

AWS_ACCESS_KEY_ID=***
TF_VAR_AWS_ACCESS_KEY_ID=***
AWS_SECRET_ACCESS_KEY=***
TF_VAR_AWS_SECRET_ACCESS_KEY=***

Возможные пути решения:

  • Каким-то образом успешно передать значения учетных данных хранилища параметров MASKED в Terraform (предпочтительно)
  • Передайте конфиденциальные учетные данные провайдеру Terraform AWS другим способом, например Секретный менеджер AWS, роль IAM и т. Д.
  • Снимите маску с переменных хранилища параметров для передачи провайдеру aws (вероятно, в первую очередь лишает смысла использование системного менеджера aws)

person Marshallm    schedule 08.09.2020    source источник


Ответы (4)


Передайте конфиденциальные учетные данные провайдеру Terraform AWS другим способом, например Секретный менеджер AWS, роль IAM и т. Д.

Как правило, вам не нужно жестко кодировать учетные данные AWS для работы terraform. Вместо этого роли CodeBuild IAM должно быть достаточно для terraform, как объясняется в terraform docs.

Имея это в виду, я подтвердил, что следующее работает, и создает корзину, запрошенную с использованием terraform из проекта CodeBuild. Роль CB по умолчанию была изменена на разрешения S3, чтобы разрешить создание корзины.

version: 0.2
phases:
  install:
    commands:
      - wget https://releases.hashicorp.com/terraform/0.12.28/terraform_0.12.28_linux_amd64.zip -q
      - unzip terraform_0.12.28_linux_amd64.zip && mv terraform /usr/local/bin/
      - printf "resource \"aws_s3_bucket\" \"test\" {\n\tbucket = \"test-43242-efdfdfd-4444334\"\n\tacl = \"private\"\n}" >> s3.tf
      - terraform init
      - terraform plan
      - terraform apply -auto-approve
person Marcin    schedule 08.09.2020

У меня возникла та же проблема при работе с Terraform в Ubuntu 20.04.

Я настроил интерфейс командной строки AWS с помощью команды aws configure с учетными данными IAM для пользователя terraform, созданного мной на AWS.

Однако когда я запускаю команду:

terraform plan

Я получаю сообщение об ошибке:

Ошибка: ошибка настройки Terraform AWS Provider: ошибка проверки учетных данных поставщика: ошибка вызова sts: GetCallerIdentity: InvalidClientTokenId: токен безопасности, включенный в запрос, недействителен. код состояния: 403, идентификатор запроса: 17268b96-6451-4527-8b17-0312f49eec51

Вот как я это исправил:

Проблема возникла в результате неправильной настройки моего интерфейса командной строки AWS с помощью команды aws configure. Я ввел идентификатор ключа доступа к AWS, где должен был ввести ключ доступа к AWS, а также ввел ключ доступа к AWS, где я должен был ввести Идентификатор ключа доступа к AWS:

Мне пришлось выполнить приведенную ниже команду, чтобы правильно перенастроить интерфейс командной строки AWS с учетными данными IAM для пользователя terraform, которого я создал на AWS:

aws configure

Это все.

Надеюсь, это поможет

person Promise Preston    schedule 14.11.2020
comment
Спасибо, я столкнулся с той же проблемой с облаком Terraform, неправильно поставив кредиты! Интересно, что сообщение об ошибке было status code: 400, request id: .... - person danialk; 22.11.2020

У меня была ошибка 403. Проблема в том, что вам следует удалить {} из примера кода.

provider "aws" { 
   access_key = "{YOUR ACCESS KEY}" 
   secret_key = "{YOUR SECRET KEY}"
   region = "eu-west-1"
}

это должно выглядеть так,

provider "aws" { 
   access_key = "YOUR ACCESS KEY" 
   secret_key = "YOUR SECRET KEY"
   region = "eu-west-1"
}
person MPV    schedule 17.02.2021

Что ж, мой случай был довольно глупым, но он может помочь:

Поэтому после загрузки файла .csv я копирую и вставляю ключи с помощью aws configure.

В середине секретного ключа был +. В редакторе я использую двойной щелчок для копирования, но останавливаюсь при встрече с не буквенно-цифровым символом, что означает, что была скопирована только первая часть секретного ключа доступа.

Убедитесь, что вы правильно скопировали полный секретный ключ.

person Antonin GAVREL    schedule 28.05.2021