inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Thấu hiểu và bảo mật AWS Cloud IAM trong thực tế vận hành

1.9. Tìm hiểu các ví dụ sử dụng Path

terraform destroy 로 s3 bucket을 삭제할 경우

Đã giải quyết

68

taeho Kim

5 câu hỏi đã được viết

1

1. 무엇을 하고 싶으신가요?

해당 실습을 조금 더 빠르고 간편하게 재현하고 싶어서 s3 bucket과 안에 오브젝트 파일을 생성하는 부분까지 테라폼 코드로 프로비저닝 하였습니다.

 

강의를 보며 결과까지 모두 확인을 하였고, 이제 위 리소스들을 전부 destroy 하고 싶습니다.

 

2. 언제, 어떤 오류가 발생하시나요?

terraform apply를 할 경우,
Role 3개와
버킷, 버킷 정책, 오브젝트 파일

총 6개의 리소스가 생성됩니다.

 

terraform state list를 통해 관리 대상을 확인해보아도 6개의 리소스를 확인할 수 있습니다.

그런데 terraform destroy 명령을 수행할 경우
버킷을 제외한 5개의 리소스만 삭제 플랜에 출력되는 것을 확인하였고 이대로 진행할 경우

결국 empty한 s3 bucket만 남아 따로 cli 명령이나 콘솔에서 삭제를 해주어야합니다.

 

3. 어떤 시도를 해보셨나요?

내부 오브젝트 파일 때문이라는 가설을 세우고

force_destroy = true

속성을 true로 지정하였지만 버킷 내부 객체까지만 삭제되었고 버킷은 삭제되지 않습니다.

이후 권한 문제라는 가설을 세워보았지만 s3 액세스 정책을 deny 기반으로 ListBucket을 지정하였기 때문에 해당 가설도 기각하였습니다.

 

4. 작성한 코드를 공유해주세요.

data "aws_caller_identity" "this" {}

# IAM Role
resource "aws_iam_role" "this" {
    count = 2
    name = "thbins-${count.index}"
    path = "/dev/"
    assume_role_policy = jsonencode({
        Version = "2012-10-17"
        Statement = [
            {
                Action = "sts:AssumeRole"
                Effect = "Allow"
                Principal = {
                    # AWS = "${data.aws_caller_identity.this.arn}"
                    AWS = "arn:aws:iam::${data.aws_caller_identity.this.account_id}:root"
                }
            },
        ]
    })
    managed_policy_arns = ["arn:aws:iam::aws:policy/AdministratorAccess"]
}

resource "aws_iam_role" "this2" {
    name = "thbins-2"
    path = "/"
    assume_role_policy  = jsonencode({
        Version = "2012-10-17"
        Statement = [
            {
                Action = "sts:AssumeRole"
                Effect = "Allow"
                Principal = {
                    # AWS = "${data.aws_caller_identity.this.arn}"
                    AWS = "arn:aws:iam::${data.aws_caller_identity.this.account_id}:root"
                }
            },
        ]
    })
    managed_policy_arns = ["arn:aws:iam::aws:policy/AdministratorAccess"]
}

# S3
variable "bucket_name" {
  description = "S3 bucket name (must be globally unique)"
  type        = string
}

resource "aws_s3_bucket" "test" {
  bucket = var.bucket_name
  force_destroy = true # 버킷 안에 객체를 생성하기 때문에 해당 속성을 true로 지정한다.
}

data "aws_iam_policy_document" "test_bucket" {
  statement {
    sid    = "Statement1"
    effect = "Deny"

    principals {
      type        = "AWS"
      identifiers = ["*"]
    }

    actions = [
      "s3:ListBucket",
    ]

    resources = [
      aws_s3_bucket.test.arn,
      "${aws_s3_bucket.test.arn}/*",
    ]

    condition {
      test     = "StringNotLike"
      variable = "aws:PrincipalArn"

      values = [
        # 여기서 account_id를 하드코딩하지 않고 자동으로 맞춰줌
        "arn:aws:iam::${data.aws_caller_identity.this.account_id}:role/dev/*",
      ]
    }
  }
}

resource "aws_s3_bucket_policy" "test" {
  bucket = aws_s3_bucket.test.id
  policy = data.aws_iam_policy_document.test_bucket.json
}

resource "aws_s3_object" "test_file" {
  bucket = aws_s3_bucket.test.id
  key    = "test_success.txt"
  content = "This is a test file for IAM path-based S3 access demo.\n"

  # 선택: 텍스트 파일임을 명시
  content_type = "text/plain"
}

aws Terraform devops devsecops iam

Câu trả lời 1

0

rex

안녕하세요.

좋은 질문 감사드립니다.

 

먼저.. 경험하기 어려운 일을 당하셔서 많이 당황하셨을 것 같습니다.

https://stackoverflow.com/questions/79581321/terraform-thinks-s3-bucket-has-been-deleted-after-adding-a-bucket-policy

위 링크를 보면 근본 원인을 설명하고 있는데요. 간단히만 말씀드리면,

S3 HeadBucket API는 버킷이 없는 것과 권한이 없는 것을 구분하지 않아서 그렇습니다.

현재 코드가 s3:ListBucket API에 대해서 Deny 하는 정책이다 보니 생성은 정상적으로 되는데, 삭제하는 경우에는 권한이 없는 것임에도 불구하고 버킷이 제거된 것으로 판단하게 되는거죠.

그렇기에 아래처럼 정책을 Allow 기반으로 변경해주면 정상적으로 동작하게 됩니다.

data "aws_iam_policy_document" "test_bucket" {
  statement {
    sid    = "Statement1"
    effect = "Allow"

    principals {
      type        = "AWS"
      identifiers = ["*"]
    }

    actions = [
      "s3:ListBucket",
    ]

    resources = [
      "arn:aws:s3:::${var.bucket_name}",
      "arn:aws:s3:::${var.bucket_name}/*",
    ]

    condition {
      test     = "StringLike"
      variable = "aws:PrincipalArn"

      values = [
        # 여기서 account_id를 하드코딩하지 않고 자동으로 맞춰줌
        "arn:aws:iam::${data.aws_caller_identity.this.account_id}:role/*",
      ]
    }
  }
}

참고 부탁드립니다. 감사합니다.

천강민 드림.

쿠버네티스 어나더 클래스-Sprint 1, 2 강의 관련 질문이있습니다.

1

4

1

혹시 강의에서 사용하시는 손글씨 도구? 프로그램이 뭔가요??

0

4

0

보안그룹 아웃바운드 규칙

0

4

1

twitterdb 연결이 안돼요

1

23

2

rdb 만들 때 인스턴스 구성시 인스턴스 유형에 활성화 되는 것이 없습니다.

0

13

1

데이터베이스 13번 문제

0

24

2

배포 파이프라인 구축 후 마주하게 되는 고민들 (💻 실습)

1

23

2

macOS에서 Windows 실행하는 프로그램

1

19

2

38강 클러스터에 컨트롤러 연결 질문

0

44

2

수업기간 연장 부탁드립니다.

0

47

2

가상머신, Jenkins 등의 설치, 설정

0

23

1

쿠버네티스에서의 스토리지 사용

1

42

2

[해결] Jenkins 설치 시 "Package jenkins has no installation candidate" 에러

0

34

1

6번 질문

0

52

2

26년 5월 합격 관련

1

67

2

강의 자료

1

38

2

출력용 교재 요청

0

51

2

curl 200 반환 실패의 건

1

75

4

Service(name: traefik)의 EXTERNAL_IP 가 Pending 입니다.

1

47

2

[15. ConfigMap, Secret - 실습] Env (File) 실습 시 문의사항

1

50

2

IRSA 의 토큰이 최대 24시간인데 만료되면 어떻게 되나요?

1

527

1

IAM 사용자별 EKS 접근 권한 추가 방법

1

948

1

강의 자료 문의

1

361

2

강의순서 문의

1

407

1