Terraform init завершается неудачно для удаленного бэкэнда S3 при создании сегмента состояния - PullRequest
0 голосов
/ 18 сентября 2018

Я пытался создать удаленный бэкэнд для своей корзины S3.

provider "aws" {
  version = "1.36.0"
  profile = "tasdik"
  region  = "ap-south-1"
}

terraform {
  backend "s3" {
    bucket = "ops-bucket"
    key    = "aws/ap-south-1/homelab/s3/terraform.tfstate"
    region = "ap-south-1"
  }
}

resource "aws_s3_bucket" "ops-bucket" {
  bucket = "ops-bucket"
  acl    = "private"

  versioning {
    enabled = true
  }

  lifecycle {
    prevent_destroy = true
  }

  tags {
    Name       = "ops-bucket"
    Environmet = "devel"
  }
}

Я еще ничего не применил, ведро отсутствует на данный момент. Итак, terraform просит меня сделать init. Но когда я пытаюсь это сделать, я получаю

$ terraform init       

Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.
Error loading state: BucketRegionError: incorrect region, the bucket is not in 'ap-south-1' region
    status code: 301, request id: , host id:

1 Ответ

0 голосов
/ 18 сентября 2018

Terraform инициализирует любую конфигурацию состояния перед любыми другими действиями, такими как план или применение. Таким образом, вы не можете создать контейнер S3, в котором будет храниться ваше состояние, в то же время, когда вы определяете бэкэнд состояния.

Terraform также не создаст корзину S3 для вас, чтобы вы могли указать свое состояние, вы должны создать это заранее.

Вы можете сделать это вне Terraform, например, с помощью интерфейса командной строки AWS:

aws s3api create-bucket --bucket "${BUCKET_NAME}" --region "${BUCKET_REGION}" \
          --create-bucket-configuration LocationConstraint="${BUCKET_REGION}"

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

Что касается сообщения об ошибке, имена сегментов S3 глобально уникальны для всех регионов и всех учетных записей AWS. Сообщение об ошибке говорит вам, что он выполнил вызов GetBucketLocation, но не смог найти сегмент в ap-south-1. При создании своих сегментов я рекомендую убедиться, что они, вероятно, будут уникальными, выполнив что-то, например, объединяя идентификатор учетной записи и, возможно, имя региона в имени сегмента.

...