본문 바로가기

개발하자

오류 로드 상태 해결 방법: 액세스 거부: 액세스 거부 상태 코드: 테라폼 백엔드에 s3를 사용하려고 할 때 403?

반응형

오류 로드 상태 해결 방법: 액세스 거부: 액세스 거부 상태 코드: 테라폼 백엔드에 s3를 사용하려고 할 때 403?

간단한 테라폼 파일은 다음과 같습니다:

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. (terra from {} 블록이 코멘트일 때)

  2. - 나는 내 AWS에서 버킷이 생성되었다는 것과 Dynmpo 테이블도 볼 수 있다.

  3. 지금 나는 블록에서 테라에 대한 코멘트를 풀고 있고 나는 다음과 같은 오류를 얻는다:

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

내 IAM은 내가 관찰할 수 있는 대로 사용하고 있다. 나는 파일에 내 AWS 키와 비밀을 직접 쓰고 있다

내가 뭘 잘못하고 있는 거야?

어떤 도움이라도 감사합니다!




동일한 테라폼 프로젝트 내에서 원격 상태 저장소로 사용할 계획인 S3 버킷을 생성할 수 없습니다. 상태 버킷(+잠금 테이블)을 프로비저닝하거나 버킷을 수동으로 만드는 또 다른 테라폼 프로젝트를 만들어야 합니다.

보다 자세한 답변을 원하시면 읽어보시기 바랍니다




나는 여기저기 검색했지만 아무 도움도 되지 않았다. 이것이 당신의 문제를 해결하기를 바랍니다. 내 경우: 나는 로컬에서 AWS S3 버킷으로 상태를 마이그레이션하고 있었다.

  1. 지형 범위에 대한 코멘트 아웃
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
terraform apply "test.tfplan"

리소스 생성(S3 버킷 및 DynamoDb)

  1. 그런 다음 지형 범위에 대한 설명을 해제하고 실행하십시오
AWS_PROFILE=REPLACE_IT_WITH_YOUR  TF_LOG=DEBUG   terraform init

오류가 발생하면 검색하십시오

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

값을 복사합니다. 제 경우는 입니다.

  1. 테라폼 백엔드 구성을 해당 값으로 변경합니다.
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
  }
}



나도 같은 문제에 직면했다. 그런 다음 로컬 시스템에서 상태 파일을 수동으로 제거합니다. terraform.tfstate 파일은 .terraform/directory에서 찾을 수 있으며 다시 실행할 수 있습니다. aws cli에 여러 프로파일이 구성된 경우. AWS 제공자 구성에서 프로필을 언급하지 않으면 테라폼이 기본 프로필을 사용하게 될 것이다.




나는 이것을 전에 접했다. 다음은 이러한 오류를 극복하는 데 도움이 되는 단계입니다

  1. .terraform 디렉토리 삭제
  2. access_key 및 secret_key를 백엔드 블록 아래에 배치합니다. 주어진 코드 아래와 같이
  3. 테라폼 실행
  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>"
  }
}

그 오류는 사라져야 한다.




보다 나은 보안을 위해 사용 등을 할 수 있습니다;

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
  }
}
  • 대해서
  • 대해서



나는 달리기를 한 후에 같은 문제가 발생했다. 잘 작동했다. 여기 있는 제안 중 아무 것도 효과가 없었지만 내 셸을 zsh에서 bash로 바꾸는 것이 그것을 해결했다.




이것은 나에게 일어났고 문제는 내가 이미 존재하는 이름으로 버킷을 만들려고 했다는 것이다!




나는 테라폼 백엔드에 대해 동일한 S3 버킷을 공유하는 다른 프로젝트에서 실행함으로써 내 자격 증명이 괜찮다는 것을 알았다.

나에게 효과가 있었던 것:

rm -rf .terraform/

편집

필요한 패키지를 설치하려면 로컬 디렉토리를 삭제한 후 다시 실행해야 합니다.




내게 효과적인 것은 @Exequiel Barriero(사례 2)의 "오류 새로 고침 상태: S3의 상태 데이터에 예상된 내용이 없습니다"라는 주제에 대한 답이었다.

링크:

그러나 이 오류가 발생하고 백엔드와 관련이 없는 또 다른 이유는 레이어로 람다 함수를 생성하려고 했을 때 잘못된 ARN을 통과한 경우입니다. 내 경우에는 ARN의 추가 문자가 이 두통을 일으켰기 때문에 ARN을 주의 깊게 검토하십시오.




앞서 말했듯이, 우리는 백엔드 구성에 자격 증명을 포함해야 합니다. 이를 수행하는 또 다른 방법은 다음과 같습니다:

  backend "s3" {
    bucket = "great-name-terraform-state-2"
    key    = "global/s3/terraform.tfstate"
    region = "eu-central-1"
    profile = "AWS_PROFILE"
  }
}

또한 AWS 프로파일을 시스템에서 구성해야 합니다:

aws configure

또는

nano .aws/credentials

여기서 주의할 점은 EC2 인스턴스 내부에서 테라폼을 적용해야 할 경우 인스턴스에 IAM 역할이 할당되어 권한 충돌이 발생할 수 있습니다.




나는 내 IAM 역할이 사용을 확인하기 위해 버킷에 대한 목록을 수행할 수 있는 올바른 전제 조건이 없다는 동일한 문제가 있었다:

aws s3 ls

접근할 수 있는지 확인해봐. 적절한 IAM 역할을 추가하지 않을 경우




대부분 우리는 s3 및 dynamodb 테이블 구성에 댓글을 달거나 버킷 및 dynamodb 테이블 값을 확인하는 것을 좋아합니다. 때로는 해당 값이 일치하지 않을 때도 있습니다.




또는 파일에 잘못된 내용이 있을 수 있습니다.

내가 파일에서 두 줄을 지웠을 때 그것은 효과가 있었다!


반응형