Ошибка при настройке серверной части Terraform S3

Я настраиваю серверную часть S3 через terraform для AWS.

terraform {
  backend "s3" {}
}

При предоставлении значений для имени корзины (серверной части S3), ключа и региона при запуске команды «terraform init» возникает следующая ошибка

"Ошибка настройки серверной части «s3»: для поставщика AWS не найдены действительные источники учетных данных. Дополнительные сведения о предоставлении учетных данных для поставщика AWS см. в статье https://terraform.io/docs/providers/aws/index.html. Пожалуйста, обновите конфигурацию в ваших файлах Terraform, чтобы исправить эту ошибку. затем снова запустите эту команду."

Я объявил доступ и секретные ключи как переменные в provider.tf. При запуске команды «terraform init» не запрашивался ни ключ доступа, ни секретный ключ.

Как решить эту проблему?

Просто из любопытства, сработает ли это, если вы запустите «aws configure» с теми же учетными данными перед запуском Terraform? Кроме того, вы работаете в Windows или Linux/OSX? Я видел некоторые примеры, когда Terraform под Windows игнорирует настройку учетных данных для Git. Возможно, здесь происходит что-то подобное.

mhvelplund 01.04.2019 09:40

Пожалуйста, покажите соответствующий код для вашего провайдера.

Matt Schuchard 01.04.2019 17:03

Поставщик кода моего провайдера "aws" { access_key = "${var.access_key}" secret_key = "${var.secret_key}" region = "${var.region}" } terraform { backend "s3" {} }

MKM 02.04.2019 06:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
3
29 671
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

При запуске terraform init вы должны добавить параметры -backend-config для своих учетных данных (ключи aws). Итак, ваша команда должна выглядеть так:

terraform init -backend-config = "access_key=<your access key>" -backend-config = "secret_key=<your secret key>"

У меня есть блок провайдера в моем коде. Пожалуйста, найдите код ниже provider "aws" { access_key = "${var.access_key}" secret_key = "${var.secret_key}" region = "${var.region}" } terraform { backend "s3" {} }

MKM 02.04.2019 06:11

Извините за указание в неправильном направлении. Я думаю, что знаю, в чем проблема сейчас, и соответствующим образом отредактировал свой ответ.

codinghaus 02.04.2019 07:36

Спасибо за помощь. terraform init теперь работает нормально. При выполнении команды terraform plan выдает новую ошибку «Не удалось загрузить серверную часть: ошибка настройки серверной части «s3»: недопустимый регион:» должен ли я также указать -backend-config при выполнении команды плана terraform?

MKM 02.04.2019 08:14

Хороший! Нет, backend-config абсолютно необходим только во время terraform init. Что касается новой ошибки: убедитесь, что у вас есть region=<region> в вашем блоке backend "s3" {}.

codinghaus 02.04.2019 08:20

Я пытаюсь выполнить команду terraform plan -var-file и получаю сообщение об ошибке. Какие детали конфигурации необходимо добавить в приведенный здесь файл? Я создал образец файла .tfvars с добавленными к нему ключами доступа и секретными ключами. Это правильно или нужно что-то еще?

MKM 02.04.2019 16:22

Пожалуйста, предоставьте больше информации. Какую именно ошибку вы получаете? Обычно, если какие-либо переменные отсутствуют, terraform явно запрашивает значение этих переменных во время terraform plan и terraform apply. Вы говорите о переменных, которые вы определили как variable "<variable_name>" {}?

codinghaus 02.04.2019 16:29

просто выполнив команду план терраформирования, я получаю следующую ошибку: «Ошибка: состояние загрузки ошибки: InvalidParameter: найдена 1 ошибка проверки. - минимальный размер поля 1, GetObjectInput.Key». Следовательно, я попытался использовать команду план терраформирования -var-file=. Но я не уверен, какие конфигурации должны быть упомянуты в этом файле.

MKM 03.04.2019 07:24

Я не думаю, что это должно что-то делать с вашим var-файлом. Ошибка больше похожа на то, что вам не хватает атрибута key внутри вашего внутреннего блока (который должен выглядеть примерно как terraform { backend "s3" { bucket = "<name of your existing backend bucket>" key = "terraform.tfstate" region = "<region>" } } ). Если это не решит вашу проблему, я думаю, что при необходимости лучше задать отдельный вопрос здесь, в StackOverflow.

codinghaus 03.04.2019 08:02

Это был точный ответ, который я искал. Спасибо.

Zucchini 04.02.2020 14:25

Не добавляйте переменные для секретов. Это действительно очень плохая практика и ненужная.

Terraform подберет ваш профиль AWS по умолчанию или будет использовать любой профиль AWS, который вы задали для AWS_PROFILE. Если это в AWS, вы должны использовать профиль экземпляра. Роли тоже можно делать.

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

Не делайте - делайте всю эту командную строку, если вам не нравятся сценарии-оболочки или ввод текста. Сделайте — добавьте себе remote_state.tf, который выглядит как

terraform {
  backend "s3" {
    bucket         = "WHAT-YOU-CALLED-YOUR-STATEBUCKET"
    key            = "mykey/terraform.tfstate"
    region         = "eu-west-1"
  }
}

теперь, когда вы запускаете терраформирование:

Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically use this backend unless the backend configuration changes.

Значения в провайдере не относятся к разрешениям для remote_state и даже могут быть разными учетными записями AWS (или даже другим облачным провайдером).

У меня также была такая же проблема, способ самый простой и безопасный решить эту проблему заключается в настройке профиля AWS. Даже если вы правильно упомянули AWS_PROFILE в своем проекте, вы должны упомянуть об этом снова в вашем backend.tf.

моя проблема заключалась в том, что я уже настроил поставщика AWS в проекте, как показано ниже, и он работает правильно.

provider "aws" {
region = "${var.AWS_REGION}"
profile = "${var.AWS_PROFILE}"
}

но в конце проекта я пытался настроить файл конфигурации бэкэнда S3. поэтому я запустил команду terraform init и получил такое же сообщение об ошибке.

Error: error configuring S3 Backend: no valid credential sources for S3 Backend found.

Примечание этого недостаточно для конфигурации серверной части terraform. вы также должны упомянуть AWS_ПРОФИЛЬ в файле бэкэнда.

  • Полное решение

На данный момент я использую последнюю версию terraform. это v0.13.5.

пожалуйста, смотрите provider.tf

provider "aws" {
region = "${var.AWS_REGION}"
profile = "${var.AWS_PROFILE}" # lets say profile is my-profile
}

например, ваш AWS_PROFILE — мой профайл тогда ваш backend.tf должен быть таким, как показано ниже.

terraform {
    backend "s3" {
    bucket = "my-terraform--bucket"
    encrypt = true
    key = "state.tfstate"
    region = "ap-southeast-2"
    profile = "my-profile" # you have to give the profile name here. not the variable("${var.AWS_PROFILE}")
  }
}

затем запустите terraform init

Большое спасибо, это был правильный ответ для меня

Willemoes 11.05.2021 09:40

Вот это правильный ответ, большое спасибо!

Yayotrón 29.05.2021 16:26

Я столкнулся с аналогичной проблемой, когда переименовал профиль в файле учетных данных AWS. Удаление папки .terraform и повторный запуск terraform init решили проблему.

В моем случае я настроил aws cli с правильными ключ доступа и Секретный ключ. Это сработало! Попытался указать провайдера с ключ доступа и Секретный ключ, но не сработало

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