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"
}

Разрешения идентификатора доступа на 100% хороши. 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 / 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 он снова будет работать нормально.

Я не понимаю - если мой поставщик параметр явно объявляет учетные данные для использования внутри исходного кода Terraform, почему моя конфигурация AWS на уровне ОС вообще имеет значение?

Как я могу заставить Terraform использовать только кредиты, определенные в моей конфигурации Terraform, и игнорировать то, что находится в моем профиле пользователя ОС?

Редактировать, это Terraform v0.11.7

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

8
задан 27 June 2018 в 23:07
4 ответа

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

, если в настройках моего провайдера явно указаны учетные данные для использования внутри исходного кода Terraform, почему AWS на уровне ОС конфигурация вообще имеет значение?

Сообщение об ошибке «Не удалось загрузить серверную часть: Ошибка при настройке серверной части« s3 »» относится к вашей конфигурации Backend S3.

Посмотрите файл ./. terraform / terraform. tfstate , и вы увидите конфигурацию S3 Backend.

Backend Terraform S3 отличается от Terraform AWS Provider. Сообщение об ошибке «Для AWS Provider не найдены допустимые источники учетных данных». вводит в заблуждение. Это означает, что используется конфигурация AWS Provider, что неверно. Учетные данные 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 , чтобы исправить вашу ошибку.

9
ответ дан 2 December 2019 в 22:53

Вам лучше настроить профили в своих файлах ~ / .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}"
}

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

1
ответ дан 2 December 2019 в 22:53

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

2
ответ дан 2 December 2019 в 22:53

У меня тоже была такая же проблема, один из самых простых и безопасных способов решить эту проблему – настроить профиль 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_PROFILE в бэкенд-файле.

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

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

0
ответ дан 9 November 2020 в 20:53

Теги

Похожие вопросы