web-dev-qa-db-ja.com

エラーの読み込み状態を解決する方法:AccessDenied:アクセス拒否ステータスコード:403 TerraformバックエンドにS3を使用しようとすると?

私の単純な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 - バケットが作成され、Dynmpoテーブルも作成したことを私のAWSで見ることができます。

  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キーと秘密をファイルに書き込んでいます

私は何が悪いのですか?助けに感謝します!

4
helpper

私はこれまでに遭遇しました。以下は、そのエラーを克服するのに役立つステップです。

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

エラーはなくされるべきです。

3
Mintu

私も同じ問題に直面しました。次に、私は自分のローカルシステムから状態ファイルを手動で削除します。 terraform.tfstateファイルをfillraform/directoryにあり、もう一度Initを実行できます。 AWS CLIに複数のプロファイルが設定されている場合AWSプロバイダーの設定でプロファイルを言及していないことは、Terraformをデフォルトプロファイルを使用するようになります。

1
RVndra Singh

私は隣接していましたが、何も役に立ちません。これがあなたの問題を解決することを願っています。私の訴訟:私は地元から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バケットと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. Terraformバックエンド設定でregionを対応する値に変更します。
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
  }
}
0
Sanh Phan Văn