Как начать новый проект terraform с s3 в качестве бэкэнда - PullRequest
1 голос
/ 02 октября 2019

Я работаю с terraform последние пару месяцев. Читая эту тему, вы автоматически выбираете такие элементы, как настройка S3 для своего файла состояния вместо локального использования.

Но я не могу найти хороший подход для запуска нового проекта terraform, когда вы хотитеФайл terraform.tfstate, который будет сохранен в корзине s3 с самого начала.

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

Как работает, если вы хотите начать новый проект, когда еще нет файла tfstate?

Для чего я пытался.

Чтобы начать работать с моим проектом env-t, я сначала запускаю эту системную команду, чтобы установить все правильные настройки бэкэнда s3. (Я принял эту конструкцию, поэтому я могу легко переключаться между различными env-файлами, для которых требуется применять один и тот же код TF. Изменение осуществляется с помощью файла var.)

FILE set_env_env-t.sh

#!/bin/sh
export TF_VAR_CMDLINE_environment=env-t
export TF_VAR_CMDLINE_tf_state_bucket=tfstate-files-env-t
export TF_VAR_CMDLINE_tf_state_table=tfstate-locks-env-t
export TF_VAR_CMDLINE_region=eu-west10001

export AWS_PROFILE=$TF_VAR_CMDLINE_environment

/tmp/terraform init -backend-config "bucket=$TF_VAR_CMDLINE_tf_state_bucket" -backend-config "dynamodb_table=$TF_VAR_CMDLINE_tf_state_table" -backend-config "region=$TF_VAR_CMDLINE_region" -backend-config "key=$TF_VAR_CMDLINE_environment/terraform.tfstate"

Затем в моем main.tf я использую этот код, чтобы ранее установленная конфигурация бэкэнда также была доступна в скрипте TF.

variable "CMDLINE_environment"                   {}
variable "CMDLINE_tf_state_bucket"               {}
variable "CMDLINE_tf_state_table"                {}
variable "CMDLINE_region"                                {}

terraform {
  backend "s3" {
  }
}

data "terraform_remote_state" "state" {
  backend = "s3"
  config = {
    profile        = var.CMDLINE_environment
    bucket         = var.CMDLINE_tf_state_bucket
    dynamodb_table = var.CMDLINE_tf_state_table
    region         = var.CMDLINE_region
    key            = "${var.CMDLINE_environment}/terraform.tfstate"
  }
}

Настройка бэкэнда S3 все работает нормально.

. ./set_env_env-t.sh

Но как только я запускаю эту команду плана, она выдает ошибку, что в бэкэнде S3 нет доступного состояния tf, даэто верно, это мой первый запуск .....

terraform plan -var-file=env-t/vars.tfvars

Ошибка: невозможно найти удаленное состояние

в строке 53 main.tf, в данных "terraform_remote_state" "state":53: data "terraform_remote_state" "state" {

Не найдено сохраненного состояния для данного рабочего пространства в данном бэкэнде.

Единственный способ обойти это у меня сейчас - это сначала работать с локальнымВ файле terraform.tfstate настройте все необходимое. для бэкэнда S3. Сделайте новую инициализацию, тогда terraform обнаружит локальный файл состояния и предложит опцию переместить его в корзину S3.

Есть ли лучший / более простой способ обойти это?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Вы можете добавить s3 на сервер, поместив этот код в main.tf. вам не нужны данные "terraform_remote_state" "state" {....}

terraform {
  backend "s3" {
    bucket = "bucket-name"
    key    = "path/to/key/terraform.tfstate"
    region = "us-west-2"
  }
}
0 голосов
/ 02 октября 2019

Вам просто нужно предоставить соответствующие учетные данные для:

terraform {
  backend "s3" {
    bucket = "mybucket"
    key    = "path/to/my/key"
    region = "us-east-1"
  }
}

Для хранения файла состояния в S3 вам не нужен data.terraform_remote_state источник.

...