Terraform: выбор учетных данных для файла удаленного состояния

10

У меня есть инфраструктура в 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

Изменить: Обратите внимание, что я пытаюсь решить вопрос о том, почему статически объявленные кредиты не используются в декларации поставщика. Не ищу альтернативных методов или обходных путей. Спасибо.

emmdee
источник
Хм ... просто догадка. Убедитесь, что переменные окружения AWS_PROFILEили AWS_DEFAULT_PROFILEпеременные не заданы, поскольку они являются подсказкой для AWS SDK, которую он должен искать в файле учетных данных.
Эрик Остерман
Спасибо. Поздний ответ, но я возвращаюсь к этому. К сожалению, я проверил env vars нет. Действительно было бы неплохо, если бы он мог запрашивать кредиты во время выполнения, как и другие планы, которые не используют удаленный бэкэнд. В любом случае спасибо.
Эмми

Ответы:

10

Ваш первый вопрос

если в настройках моего провайдера явно указываются учетные данные для использования в исходном коде 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 по умолчанию использует следующее в следующем порядке:

  1. Переменные среды AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY
  2. Файл общих учетных данных 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.

Перезапустите terraform initи укажите учетные данные в командной строке в качестве --backend-configпараметров, чтобы исправить ошибку.

Майк Марселья
источник
Спасибо. Очень подробный ответ и я понимаю проблему сейчас. В моем случае использования я в конечном итоге использовал shared_credentials_fileопцию, которую будут собирать и использовать все мои бэкэнды и провайдеры. Кажется, что работает хорошо, и ничто не заблокировано в учетных данных AWS рабочей станции ОС.
Эмми
3

Ошибка, которую вы получаете, конкретно относится к настройке бэкэнда S3, который AFAIK не наследует настройки от конфигурации провайдера AWS; он также имеет access_key& secret_keyпараметры конфигурации, которые, если вы не используете, ~/.aws/credentialsвам придется явно настроить.

bodgit
источник
1

Вам лучше настроить профили в ваших ~/.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, что очень хорошо, если вы когда-нибудь захотите поместить их в систему контроля версий.

Майк
источник
Спасибо за вклад. Я очень хорошо осведомлен о профилях учетных данных, однако я ищу решение конкретного вопроса, а не альтернативный метод или обходной путь. Кредиты должны быть в переменных для объема этого вопроса. Очень ценится независимо.
Эмми