Terraform: выбор учетных данных для файла удаленного состояния
У меня есть инфраструктура в Terraform, и я использую ее некоторое время. Недавно я поменял учетные данные AWS на своем локальном ноутбуке (кредиты хранятся в ~/.aws/credentials
) и он перестал работать, пока я не переустановил эти учетные данные обратно.
Проблема в том, что я объявляю кредиты в самом источнике Terraform, но, похоже, он их вообще не использует.
terraform {
backend "s3" {
bucket = "example_tf_states"
key = "global/vpc/us_east_1/example_state.tfstate"
encrypt = true
region = "us-east-1"
}
}
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}
variable "access_key" {
default = "<hidden_for_stack_exchange_post>"
}
variable "secret_key" {
default = "<hidden_for_stack_exchange_post>"
}
variable "region" {
default = "us-east-1"
}
Разрешения ID доступа на 100% хороши. Я использую один и тот же идентификатор учетной записи и секретный ключ как для aws configure
настройки, которые входят в ~/.aws/credentials
как я в приведенных выше объявлениях переменных Terraform.
Все работает хорошо, пока кредиты в ~/.aws/credentials
но как только учетные данные уровня ОС ушли (т.е. rm ~/.aws/credentials
) Я получаю следующее при попытке запуска операций Terraform, таких как terraform plan
:
Failed to load backend:
Error configuring the backend "s3": No valid credential sources found for AWS Provider.
Please see https://terraform.io/docs/providers/aws/index.html for more information on
providing credentials for the AWS Provider
Please update the configuration in your Terraform files to fix this error.
If you'd like to update the configuration interactively without storing
the values in your configuration, run "terraform init".
Если я заново заполню ~/.aws/credentials
запустив aws configure
это снова будет работать нормально.
Я не понимаю - если мой provider
Параметр явно объявляет учетные данные для использования в исходном коде Terraform. Почему моя конфигурация AWS на уровне ОС вообще имеет значение?
Как я могу заставить Terraform использовать только кредиты, определенные в моей конфигурации Terraform, и игнорировать то, что находится в моем профиле пользователя ОС?
Изменить это Terraform v0.11.7
Изменить: Обратите внимание, что я пытаюсь решить вопрос о том, почему статически объявленные кредиты не используются в декларации поставщика. Не ищу альтернативных методов или обходных путей. Благодарю.
3 ответа
Ваш первый вопрос
если в настройках моего провайдера явно указываются учетные данные для использования в исходном коде Terraform, почему моя конфигурация AWS на уровне операционной системы вообще имеет значение?
Сообщение об ошибке "Не удалось загрузить бэкэнд: ошибка при настройке бэкенда"s3"" относится к вашей конфигурации бэкэнда S3.
Посмотри в файле ./.terraform/terraform.tfstate
и вы увидите конфигурацию S3 Backend.
Сервер Terraform S3 отличается от поставщика Terraform AWS. Сообщение об ошибке "Не найдены действительные источники учетных данных для поставщика AWS". вводит в заблуждение. Это означает, что используется конфигурация провайдера AWS, что неверно. Учетные данные S3 Backend настраиваются отдельно и хранятся в terraform.tfstate
файл.
Ваша конфигурация AWS на уровне операционной системы имеет значение, потому что, если не заданы учетные данные S3 Backend, как описано здесь https://www.terraform.io/docs/backends/types/s3.html, то Terraform по умолчанию использует следующее в следующем порядке:
- Переменные среды AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY
- Файл общих учетных данных AWS, значение по умолчанию "~/.aws/credentials".
Вы не указали учетные данные в своей конфигурации S3 Backend, поэтому terraform по умолчанию использует файл общих учетных данных AWS.
Ваша конфигурация S3 Backend не содержит учетных данных.
terraform {
backend "s3" {
bucket = "example_tf_states"
key = "global/vpc/us_east_1/example_state.tfstate"
encrypt = true
region = "us-east-1"
}
}
Ваш второй вопрос,
Как я могу заставить Terraform использовать только кредиты, определенные в моей конфигурации Terraform, и игнорировать то, что находится в моем профиле пользователя ОС?
Во-первых, внутренние интерфейсы не могут содержать интерполяцию, см. https://www.terraform.io/docs/backends/config.html. Таким образом, вы не можете использовать какие-либо переменные в конфигурации Backend. например, этот конфиг недействителен
terraform {
backend "s3" {
bucket = "example_tf_states"
key = "global/vpc/us_east_1/example_state.tfstate"
encrypt = true
region = "us-east-1"
access_key = ${var.access_key}
secret_key = ${var.secret_key}
}
}
Если вы хотите указать учетные данные AWS при запуске terraform init
вы указываете конфигурацию сервера в качестве параметров.
terraform init --backend-config="access_key=your_access_key" --backend-config="secret_key=your_secret_key"
Это создает конфигурацию S3 Backend, которая выглядит следующим образом, хранится в ./.terraform/terraform.tfstate
файл:
{
"version": 3,
"serial": 1,
"lineage": "bd737d2d-1181-ed64-db57-467d14d2155a",
"backend": {
"type": "s3",
"config": {
"access_key": "your_access_key",
"secret_key": "your_secret_key"
},
"hash": 9345827190033900985
},
Опять же, учетные данные S3 Backend настраиваются отдельно от учетных данных вашего провайдера AWS.
Re беги terraform init
и укажите учетные данные в командной строке как --backend-config
варианты исправить вашу ошибку.
Ошибка, которую вы получаете, конкретно относится к настройке бэкэнда S3, который AFAIK не наследует настройки от конфигурации провайдера AWS; это тоже имеет access_key
& secret_key
параметры конфигурации, которые, если вы не используете ~/.aws/credentials
вам нужно будет явно настроить.
Вам лучше настроить профили в вашем ~/.aws/credentials
файлы как
[profile1]
aws_access_key_id = xxxx
aws_secret_access_key = xxxxx
region = us-east-1
[profile2]
aws_access_key_id = xxxx
aws_secret_access_key = xxxx
region = us-west-2
Затем в вашем провайдере вы можете сказать, какой профиль использовать
provider "aws" {
profile = "profile2"
region = "${var.region}"
}
Он будет хранить ключи в ваших файлах terraform, что очень хорошо, если вы когда-нибудь захотите поместить их в систему контроля версий.
У меня также была такая же проблема, один из самых простых и безопасных способов решить эту проблему - настроить профиль AWS. Даже если вы правильно упомянули AWS_PROFILE в своем проекте, вы должны снова упомянуть его в своем backend.tf.
Моя проблема заключалась в том, что я уже настроил поставщика AWS в проекте, как показано ниже, и он работает правильно.
provider "aws" {
region = "${var.AWS_REGION}"
profile = "${var.AWS_PROFILE}"
}
но в конце проекта я пытался настроить файл конфигурации S3 backend. поэтому я выполнил команду
terraform init
и я также получил такое же сообщение об ошибке.
Error: error configuring S3 Backend: no valid credential sources for S3 Backend found.
Обратите внимание, что этого недостаточно для конфигурации бэкэнда terraform. вы также должны упомянуть AWS_PROFILE в файле backend.
- Полное решение
На данный момент я использую последнюю версию terraform. это v0.13.5. Обратите внимание, что вы также не можете использовать переменные в файле backend.
пожалуйста, посмотрите
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