Как решить Ошибка при загрузке: AccessDenied: Access Denied status code: 403 при попытке использовать s3 для бэкэнда terraform?

Мой простой файл terraform:

provider "aws" {
  region = "region"
  access_key = "key" 
  secret_key = "secret_key"
}

terraform {
  backend "s3" {
    # Replace this with your bucket name!
    bucket         = "great-name-terraform-state-2"
    key            = "global/s3/terraform.tfstate"
    region         = "eu-central-1"
    # Replace this with your DynamoDB table name!
    dynamodb_table = "great-name-locks-2"
    encrypt        = true
  }
}

resource "aws_s3_bucket" "terraform_state" {
  bucket = "great-name-terraform-state-2"
  # Enable versioning so we can see the full revision history of our
  # state files
  versioning {
    enabled = true
  }
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "AES256"
      }
    }
  }
}

resource "aws_dynamodb_table" "terraform_locks" {
  name         = "great-name-locks-2"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
    }
}

Все, что я пытаюсь сделать, это заменить локальный бэкэнд на хранилище на S3. Я делаю следующее:

  1. terraform init (когда блок terrafrom {} является комментарием)

  2. terrafrom apply - Я вижу в своем AWS, что сегмент был создан, а также таблица Dynmpo.

  3. теперь я не комментирую блок terrafrom и снова terraform init, и я получаю следующую ошибку:

Error loading state:
    AccessDenied: Access Denied
        status code: 403, request id: xxx, host id: xxxx

У моего IAM есть административный доступ. Я использую Terraform v0.12.24, как вы видите, я напрямую записываю свой ключ и секрет AWS в файл.

Что я делаю неправильно?

Я ценю любую помощь!


person helpper    schedule 17.05.2020    source источник


Ответы (5)


Я сталкивался с этим раньше. Ниже приведены шаги, которые помогут вам преодолеть эту ошибку.

  1. Удалите каталог .terraform
  2. Поместите access_key и secret_key под внутренний блок. как ниже приведенный код
  3. Запустите terraform init
  backend "s3" {
    bucket = "great-name-terraform-state-2"
    key    = "global/s3/terraform.tfstate"
    region = "eu-central-1"
    access_key = "<access-key>"
    secret_key = "<secret-key>"
  }
}

Ошибка должна исчезнуть.

person Mintu    schedule 26.12.2020
comment
Вы также можете указать имя профиля AWS вместо ключей доступа и секретных ключей. - person Juancho; 26.02.2021
comment
Лучшие практики не рекомендуют вам хранить конфиденциальные материалы, такие как ваш доступ и секретные ключи, в ваших файлах Terraform. Это особенно верно, если вы также используете репозиторий кода, например Github. Как указывает @Juancho, все, что вам нужно сделать, это включить в бэкэнд строку, подобную этой: profile = your_profile_name_from_the_aws_credentials_file Кроме того, удаление вашего каталога .terraform совершенно не нужно. - person eatsfood; 16.04.2021
comment
Кроме того, вы можете использовать shared_credentials_file, чтобы указать на другой файл учетных данных в другом месте, чем ~ / .aws / credentials, если это необходимо. - person Juancho; 17.04.2021

Я тоже столкнулся с той же проблемой. Затем я вручную удаляю файл состояния из своей локальной системы. Вы можете найти файл terraform.tfstate в каталоге .terraform / и снова запустить init. если в aws cli настроено несколько профилей. Если не указать профиль в конфигурации поставщика aws, terraform будет использовать профиль по умолчанию.

person RVndra Singh    schedule 10.11.2020

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

  1. Закомментируйте область действия terraform
provider "aws" {
  region = "region"
  access_key = "key" 
  secret_key = "secret_key"
}

#terraform {
#  backend "s3" {
#    # Replace this with your bucket name!
#    bucket         = "great-name-terraform-state-2"
#    key            = "global/s3/terraform.tfstate"
#    region         = "eu-central-1"
#    # Replace this with your DynamoDB table name!
#    dynamodb_table = "great-name-locks-2"
#    encrypt        = true
#  }
#}

resource "aws_s3_bucket" "terraform_state" {
  bucket = "great-name-terraform-state-2"
  # Enable versioning so we can see the full revision history of our
  # state files
  versioning {
    enabled = true
  }
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "AES256"
      }
    }
  }
}

resource "aws_dynamodb_table" "terraform_locks" {
  name         = "great-name-locks-2"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"
  attribute {
    name = "LockID"
    type = "S"
    }
}
  1. Запустить
terraform init
terraform plan -out test.tfplan
tera apply "test.tfplan"

для создания ресурсов (S3 bucket и DynamoDb)

  1. Затем раскомментируйте область действия terraform, запустите
AWS_PROFILE=REPLACE_IT_WITH_YOUR  TF_LOG=DEBUG   terraform init

Если вы получаете ошибки, просто ищите X-Amz-Bucket-Region:

-----------------------------------------------------
2020/08/14 15:54:38 [DEBUG] [aws-sdk-go] DEBUG: Response s3/ListObjects Details:
---[ RESPONSE ]--------------------------------------
HTTP/1.1 403 Forbidden
Connection: close
Transfer-Encoding: chunked
Content-Type: application/xml
Date: Fri, 14 Aug 2020 08:54:37 GMT
Server: AmazonS3
X-Amz-Bucket-Region: eu-central-1
X-Amz-Id-2: REMOVED
X-Amz-Request-Id: REMOVED

Скопируйте значение X-Amz-Bucket-Region, в моем случае eu-central-1.

  1. Измените конфигурацию вашего region in terraform backend на соответствующее значение.
terraform {
  backend "s3" {
    # Replace this with your bucket name!
    bucket         = "great-name-terraform-state-2"
    key            = "global/s3/terraform.tfstate"
    region         = "eu-central-1"
    # Replace this with your DynamoDB table name!
    dynamodb_table = "great-name-locks-2"
    encrypt        = true
  }
}
person Sanh Phan Văn    schedule 14.08.2020
comment
Явная установка env var AWS_PROFILE сделала свое дело! ???? - person Benjamin; 24.06.2021

Невозможно создать корзину S3, которую вы планируете использовать в качестве удаленного хранилища состояний в рамках того же проекта terraform. Вам нужно будет создать еще один проект terraform, в котором вы подготовите свои сегменты состояния (+ таблицы блокировки) или просто создадите сегмент вручную.

Для получения более подробного ответа прочтите это

person DerPauli    schedule 17.05.2020
comment
создал другой проект, чтобы использовать предыдущее ведро и динамо-таблицу, сделал себе систему папок, как в ключе, когда было сделано terraform init получил Successfully configured the backend "s3"! Terraform will automatically use this backend unless the backend configuration changes. Error refreshing state: AccessDenied: Access Denied status code: 403, request id: xxx, host id: xxx - person helpper; 18.05.2020
comment
В большинстве случаев проще создать его вручную, особенно если это не нужно делать часто. Под созданием еще одного проекта TF я имел в виду: Изображение, которое вы работаете в команде DevOps, и вам необходимо на лету создавать новые проекты динамического терраформирования, чтобы предоставить их своей команде. Затем вместо создания сегмента состояния вручную вы можете написать простой файл терраформирования, который имеет локальное состояние и предоставляет корзину s3 и таблицу db Dynamo. После этого вы берете эти два компонента и ссылаетесь на них по имени в своем блоке terraform { backend "s3" {} }. - person DerPauli; 18.05.2020
comment
Мне было бы интересно посмотреть, какой результат вы получите, когда создадите ведро вручную. - person DerPauli; 18.05.2020
comment
извините за поздний повтор, ничего не работает, пытаюсь сделать ведро и таблицу из другого проекта - не сработало. а также пытался создать вручную всегда одну и ту же ошибку - person helpper; 25.05.2020
comment
Вы можете попробовать отладить команду инициализации terraform с помощью: TF_LOG=DEBUG terraform init. Возможно, стоит взглянуть на ваш файл ~ / .aws / credentials (или переменные среды echo $AWS_ACCESS_KEY_ID, echo $AWS_SECRET_ACCESS_KEY и echo $AWS_SESSION_TOKEN ), если есть некоторые другие учетные данные, которые могут переопределить ваши установленные учетные данные. - person DerPauli; 26.05.2020
comment
Лучше всего посмотреть на TF_LOG=DEBUG. Возможно, также посмотрите этот выпуск github для получения дополнительной информации. - person DerPauli; 26.05.2020

Для большей безопасности вы можете использовать shared_credentials_file и profile следующим образом;

provider "aws" {
  region = "region"
  shared_credentials_file = "$HOME/.aws/credentials # default
  profile = "default" # you may change to desired profile
}

terraform {
  backend "s3" {
    profile = "default" # change to desired profile
    # Replace this with your bucket name!
    bucket         = "great-name-terraform-state-2"
    key            = "global/s3/terraform.tfstate"
    region         = "eu-central-1"
    # Replace this with your DynamoDB table name!
    dynamodb_table = "great-name-locks-2"
    encrypt        = true
  }
}
person Mekky_Mayata    schedule 21.04.2021