Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Terraform init fails for remote backend S3 when creating the state bucket

I was trying to create a remote backend for my S3 bucket.

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

I haven't applied anything yet, the bucket is not present as of now. So, terraform asks me to do an init. But when I try to do so, I get a

$ 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:
like image 361
Tasdik Rahman Avatar asked Sep 18 '18 06:09

Tasdik Rahman


People also ask

Can we create S3 bucket using Terraform?

Once you have all the tools and utilities installed, the next step is to create a Terraform configuration to provision an S3 bucket on AWS. Navigate into the directory and create a Terraform configuration. Open the file and add the following configuration to create an S3 bucket using your favorite text editor.

What happens if you use S3 as a remote state repository for your Terraform Tfstate and 2 people at the same time use Terraform apply?

Without locking, if two team members are running Terraform at the same time, you may run into race conditions as multiple Terraform processes make concurrent updates to the state files, leading to conflicts, data loss, and state file corruption.


1 Answers

Terraform will initialise any state configuration before any other actions such as a plan or apply. Thus you can't have the creation of the S3 bucket for your state to be stored in be defined at the same time as you defining the state backend.

Terraform also won't create an S3 bucket for you to put your state in, you must create this ahead of time.

You can either do this outside of Terraform such as with the AWS CLI:

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

or you could create it via Terraform as you are trying to do so but use local state for creating the bucket on the first apply and then add the state configuration and re-init to get Terraform to migrate the state to your new S3 bucket.

As for the error message, S3 bucket names are globally unique across all regions and all AWS accounts. The error message is telling you that it ran the GetBucketLocation call but couldn't find a bucket in ap-south-1. When creating your buckets I recommend making sure they are likely to be unique by doing something such as concatenating the account ID and possibly the region name into the bucket name.

like image 96
ydaetskcoR Avatar answered Sep 28 '22 19:09

ydaetskcoR