인프런 커뮤니티 질문&답변

김경호님의 프로필 이미지
김경호

작성한 질문수

지금 당장 데브옵스 - 테라폼 X AWS

S3

terraform실행하면 s3 ACL 오류 발생합니다.

작성

·

1.5K

0

 Warning: Argument is deprecated

with aws_s3_bucket.s3,

on s3.tf line 13, in resource "aws_s3_bucket" "s3":

13: resource "aws_s3_bucket" "s3" {

Use the aws_s3_bucket_website_configuration resource instead

(and 2 more similar warnings elsewhere)

 

Error: creating Amazon S3 (Simple Storage) Bucket (saju-front-test): InvalidBucketAclWithObjectOwnership: Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting

status code: 400, request id: YX8V44RQW8C4RTBN, host id: YBAR+uXk/vTroI+XEYafZ7Xt72KQ9ePGvFs+TzLcefvekr7EkGbkTH0GmYOovnUOd+OtySk8y1U=

 

with aws_s3_bucket.s3,

on s3.tf line 13, in resource "aws_s3_bucket" "s3":

13: resource "aws_s3_bucket" "s3" {

답변 2

0

지금 당장님의 프로필 이미지
지금 당장
지식공유자

직접 확인 해 본 결과 전달 주신 에러가 발생하였습니다.

원인은 AWS 에서 4월 부터 Policy 정책에 대해서 퍼블릭 설정은 막았습니다. (보안 이슈 등의 이유로)

테라폼에서 퍼블릭 정책 설정을 직접할 수 없습니다. Policy 에 대해서는 AWS 에 콘솔에 접속해서 진행이 필요합니다.

현재 변경이 필요한 부분은 S3 테라폼 코드 수정이 필요합니다. 아래 첨부하였으며 강의에는 빠른 시일 내에 반영하겠습니다.

테라폼 코드를 실행 후 policy 정책 부분을 aws console에서 접속해서 s3 -> saju-front-test-2023 에 들어가서 권한 -> 버킷 정책에서 아래 내용을 추가해 주시면 됩니다.

{
 "Version": "2012-10-17",
 "Id": "Policy1546621853468",
 "Statement": [
  {
   "Sid": "Stmt1546621828605",
   "Effect": "Allow",
   "Principal": "*",
   "Action": "s3:GetObject",
   "Resource": "arn:aws:s3:::saju-front-test-2023/*"
  }
 ]
}

////////////////////////////// 변경된 테라폼 S3 코드 ///////////////////////////////////////////

# aws s3 rm s3://saju-front-prod --recursive
# terraform destroy 를 하기전에 S3 버킷 내용이 삭제되어야 한다.
# s3 버킷 생성시 AWS를 이용하는 모든 사용자들의 s3 버킷 이름과 중복해서 사용할 수 없습니다.

# AWS 리전
provider "aws" {
  region = "ap-northeast-2"
}

# S3 버킷
# 위치 : s3 > 버킷
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket
resource "aws_s3_bucket" "example" {
  bucket = "saju-front-test-2023"


  tags = {
    Name = "saju-front-test"
    Service = "saju-test"
  }
}

resource "aws_s3_bucket_website_configuration" "s3" {
  bucket = "saju-front-test-2023"   //버킷 이름

  index_document {
    suffix = "index.html"
  }

  error_document {
    key = "index.html"
  }
}


resource "aws_s3_bucket_ownership_controls" "example" {
  bucket = aws_s3_bucket.example.id
  rule {
    object_ownership = "BucketOwnerPreferred"
  }
}

resource "aws_s3_bucket_public_access_block" "example" {
  bucket = aws_s3_bucket.example.id

  block_public_acls       = false
  block_public_policy     = false
  ignore_public_acls      = false
  restrict_public_buckets = false
}

resource "aws_s3_bucket_acl" "example" {
  depends_on = [
    aws_s3_bucket_ownership_controls.example,
    aws_s3_bucket_public_access_block.example,
  ]

  bucket = aws_s3_bucket.example.id
  acl    = "public-read"
}


# S3 정적 웹 호스팅 엔드포인트
output "s3_endpoint" {
  value = aws_s3_bucket_website_configuration.s3.website_endpoint
}

잘 안되시거나 궁금한 부분 있으시면 다시 질문 주시면 감사드립니다. 

 

검색하다가 우연히 답글을 보게 되었는데 terraform으로 policy 정책을 업데이트 할 수 없다는 건 사실이 아닙니다.

 

우선 오류 메시지대로 객체 소유권을 BucketOwnerPreferred로 설정 후 aws_s3_bucket_public_access_block 리소스로 public access 제한을 해제한 뒤 policy 업데이트를 하면 잘 적용됩니다.

 


resource "aws_s3_bucket" "example" {
  bucket = "example-bucket"
}
resource "aws_s3_bucket_acl" "example" {
  depends_on = [aws_s3_bucket_ownership_controls.example]

  bucket = aws_s3_bucket.example.id
  acl    = "public-read"
}

resource "aws_s3_bucket_ownership_controls" "example" {
  bucket = aws_s3_bucket.example.id

  rule {
    object_ownership = "BucketOwnerPreferred"
  }
}

resource "aws_s3_bucket_public_access_block" "example" {
  bucket = aws_s3_bucket.example.id

  block_public_acls       = false
  block_public_policy     = false
  ignore_public_acls      = false
  restrict_public_buckets = false
}

resource "aws_s3_bucket_policy" "example_policy" {
  bucket = aws_s3_bucket.example.id
  policy = data.aws_iam_policy_document.allow_get_object.json
  depends_on = [ aws_s3_bucket_public_access_block.example ]
}

data "aws_iam_policy_document" "allow_get_object" {
  statement {
    actions   = ["s3:GetObject"]
    resources = ["${aws_s3_bucket.example.arn}/*"]
    principals {
      type        = "*"
      identifiers = ["*"]
    }
  }
}

0

지금 당장님의 프로필 이미지
지금 당장
지식공유자

안녕하세요. S3 버킷 이름은 중복되어서는 안 됩니다.

해당 내용을 포함시키긴 했는데 설명이 부족했던 것 같습니다.

saju-front-test 대신에 saju-front-test-0422 이런식으로 고유 이름으로 변경 후 다시 한 번 테스트 해주시면 감사드립니다.

image

김경호님의 프로필 이미지
김경호
질문자

bucket 이름 변경해도 ACL 오류 입니다.

Error: creating Amazon S3 (Simple Storage) Bucket (saju-front-test-0422): InvalidBucketAclWithObjectOwnership: Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting

│ status code: 400, request id: GPACQ3WRB6QG7X34, host id: pOcCGvBYLWCD8POW8sTrZMZ5U/sbzflUw9Ajc9tbW05BHnCrKv+l9BBRugyKuBAs4CeOavRRYi0=

│ with aws_s3_bucket.s3,

│ on s3.tf line 13, in resource "aws_s3_bucket" "s3":

│ 13: resource "aws_s3_bucket" "s3" {

김경호님의 프로필 이미지
김경호

작성한 질문수

질문하기