У меня есть существующая инфраструктура в 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"
}
Разрешения идентификатора доступа на 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
Изменить: обратите внимание, что я пытаюсь решить проблему, почему статически объявленные кредиты не используются в объявлении поставщика. Не ищу альтернативных методов или обходных путей. Спасибо.
Ваш первый вопрос
Если в настройках моего провайдера явно указаны учетные данные для использования в исходном коде Terraform, почему моя конфигурация AWS на уровне ОС вообще имеет значение?
Сообщение об ошибке «Не удалось загрузить серверную часть: Ошибка при настройке серверной части« s3 »» относится к вашей конфигурации Backend S3.
Смотреть в файле ./.terraform/terraform.tfstate
и вы увидите конфигурацию S3 Backend.
Серверная часть Terraform S3 отличается от поставщика Terraform AWS. Сообщение об ошибке «Для AWS Provider не найдены действительные источники учетных данных». вводит в заблуждение. Это означает, что используется конфигурация поставщика AWS, что неверно. Учетные данные S3 Backend настраиваются отдельно и хранятся в terraform.tfstate
файл.
Конфигурация AWS на уровне ОС имеет значение, потому что, если не указаны учетные данные S3 Backend, как описано здесь https://www.terraform.io/docs/backends/types/s3.html, то Terraform по умолчанию использует следующее в следующем порядке:
Вы не указали какие-либо учетные данные в конфигурации 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 Provider.
Повторно запустить 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}"
}
Он будет держать ключи подальше от ваших файлов терраформ, что хорошо, если вы когда-нибудь захотите поместить их в систему управления версиями.