인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

형빈님의 프로필 이미지
형빈

작성한 질문수

[2024] 실무에서 사용하는 클라우드 보안 프로그래밍 (AWS, Python, Terraform)

2.13. Multi Providers

s3 bucket 생성 에러

해결된 질문

작성

·

185

·

수정됨

1

안녕하세요 너무 질문을 자주 올리는거 같아 민망하네요 ㅎㅎ..

강의 수강 중 궁금한 점이 있어 질문드립니다.

 

  1. s3 배포 시 제약조건?

멀티 프로바이더 부분에서 s3 배포 시, 서울 리전에만 배포가 안됩니다. (still creating 무한루프)

제가 배포하려는 코드는 아래와 같습니다.

# provider.tf
provider "aws" {
  region = "ap-northeast-2"
}

provider "aws" {
  alias = "apne3"
  region = "ap-northeast-3"
}

# main.tf
resource "aws_s3_bucket" "apne2" {
  bucket = "tf-apne2-hb"
}

# 오사카 리전
resource "aws_s3_bucket" "apne3" {
  bucket = "tf-apne3-hb"
  provider = aws.apne3
}

서울 리전에 배포할 때 해당 버킷명을 사용할 때만 배포가 안되며, 다른 버킷명이나 다른 리전에 배포하면 잘 배포가 됩니다.

 

콘솔에서 위와 동일하게 생성해보면 "the ap-northeast-2 location constraint is incompatible for the region specific endpoint this request was sent to." 와 같은 에러가 떨어지는데 처음보는 경우라 혹시 알고 계신게 있는지 궁금해서 질문 남깁니다.

 

  1. vpc 배포 후 provider 변경

     

    resource "aws_vpc" "apne2" {
      cidr_block = "10.0.0.0/16"
    }
    
    resource "aws_vpc" "apne3" {
      cidr_block = "10.0.0.0/16"
    }

    위처럼 배포 시 서울 리전에 vpc가 2개 생성됐습니다.


    이후 apne3 vpc 리소스에 provider = aws.apne3


    을 추가한 후 plan 해보면 서울 리전에 vpc가 삭제되고 오사카 리전에 생기는게 아닌, 서울 리전에도 남고 오사카 리전에도 새로 추가가 됩니다.


    tfstate 파일에서도 provider와 속성값들이 변경은 되는데 기존 리소스는 왜 삭제되지 않는지 궁금합니다.

 

추가로 제가 질문을 거의 매일 남기는거 같아서 좀 죄송스럽습니다. 차라리 큰 챕터가 끝낼따마다 궁금한걸 정리한 후 한번에 질문드리면 더 나으실까요??

답변 1

1

천강민님의 프로필 이미지
천강민
지식공유자

안녕하세요.

질문은 언제든 편하게 남겨주셔도 괜찮습니다!

  1. S3 버킷의 경우, 전체 리전에서 고유해야 합니다.(Bucket names must be unique across all AWS accounts in all the AWS Regions within a partition.)

    1. 이러한 경우가 아니더라도 버킷을 삭제/재생성 하는 사이에 어느 정도의 시간이 걸릴지에 대해서는 문서화된 내용이 없습니다.(나만 알고 있는 이름으로 만들어도 운이 나쁘면 삭제/재생성에 몇 분이 걸릴 수도 있습니다.)

      1. 제 추측으론 이미 존재한다는 식의 응답을 주면, 그걸 토대로 버킷에 대한 무작위 대입(브루트포스)이나 다양한 방식의 공격이 들어오거나 버킷을 탈취하려는 시도를 할 수 있기 때문에 명확히 보여주지 않는 것 같습니다.

      2. 그렇기에 개인 실습 시에는 bucket_prefix 인자를 꼭 사용해주세요!

      3. 또한, 테라폼에서는 still creating이라고 표현되지만, Python으로 요청해보면 아래와 같이 결과가 나오게 됩니다.

    import boto3
    
    
    s3 = boto3.client("s3")
    try:
        s3.create_bucket(
            Bucket="tf-apne3-hb",
            CreateBucketConfiguration={
                "LocationConstraint": "ap-northeast-2",
            },
        )
    except Exception as e:
        print(e)
    
    --- 실행 결과 ---
    An error occurred (OperationAborted) when calling the CreateBucket operation: A conflicting conditional operation is currently in progress against this resource. Please try again.
    1. 이와 별개로 첨부해주신 오류(the ap-northeast-2 location constraint is incompatible for the region specific endpoint this request was sent to.)는 버킷을 생성하려는 리전과 실제 요청이 들어간 리전이 달라서 발생하는 오류입니다.

  2. 두 번째 질문은 사실 경험하기 되게 힘든 내용인데 대단하시네요.

    1. https://developer.hashicorp.com/terraform/cli/state/move

    2. 위 링크 보시면 질문하신 현상이 왜 발생하는지 알 수 있습니다.

    3. 간단히 얘기하면, 테라폼은 provider를 기준으로 리소스 변경을 추적하지 않아서 그렇습니다. 그렇기에 말씀주신 상황처럼 사용하게 되면 자칫 스테이트를 덮어써서 더 이상 관리가 힘들 수 있습니다.

    4. 그렇기에 실무에서는 무분별하게 이름을 변경하거나 갑자기 프로바이더를 변경하는 행위를 지양해야 합니다. 다만, 이걸 모두 기억하면서 하기는 힘드니 plan을 꼭 확인하시면서 이상한 점이 없는지 꼭! 확인하시기 바랍니다!

감사합니다.

형빈님의 프로필 이미지
형빈
질문자

빠르고 명쾌한 답변 감사합니다!!

형빈님의 프로필 이미지
형빈
질문자

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/BucketRestrictions.html 공식 문서에 명하게 원인이 나오진 않으나, 버킷 이름 재사용에 대한 내용이 명시되어 있네요.

이미 알고 계시는 분들도 있겠지만, 저와 비슷한 상황을 겪고 있는 분들이 있을 수도 있으니 추가 댓글 남깁니다.

 

형빈님의 프로필 이미지
형빈

작성한 질문수

질문하기