Terraform을 사용해서 AWS S3 만들기

mDev_97·2023년 10월 19일

Terraform

목록 보기
2/4
post-thumbnail

📌 해당 게시글은 Terraform을 사용하여 AWS IAM 만들기 에 이어서 진행됩니다.
게시글을 참고하여 IAM 유저를 생성하고 진행해주시기 바랍니다.

IAM 유저 권한 설정

Terraform을 사용하여 AWS IAM 만들기 게시글에서 우리는 IAM 유저에 [IAMFullAccess] 만을 주었습니다.
이처럼 해당 IAM 유저를 통해서 S3 Bucket을 만들기 위해서는 S3에 대한 권한을 주어야 합니다.

AWS Console에 접속해서 생성한 유저에 들어가서 권한을 주겠습니다.

[IAM 유저 접속] -> [권한 추가] 버튼 클릭

[직접 정책 연결] 선택 후 AmazonS3FullAccess 선택

권한 추가

그럼 아래와 같이 S3에 대한 권한이 추가된 것을 확인하실 수 있습니다.

📌 S3에 대한 접근 권한이 없다면 실습 마지막에 Access Denied가 발생하니 권한을 꼭 추가해 주세요!


Terraform을 사용해 AWS S3 만들기

AWS S3를 만드는 방법은 크게 두 가지가 있습니다.

  • AWS Console 사용
    - [AWS] S3란? 게시글 참고
  • AWS CLI 사용

이번 게시글에서는 Terraform을 사용해서 AWS CLI를 통해 S3 Bucket을 만들어 보겠습니다.

Provider 지정

우선 Provider를 다운 받기 위해서
우리는 AWS를 사용할 것이기 때문에 AWS로 Provider를 지정해줍니다.
리전은 서울로 지정해주겠습니다.

provider "aws" {
  region = "ap-northeast-2"
}

버킷 생성

aws_s3_bucket 이라는 리소스를 사용해서 네이밍을 해줍니다.
그리고 terraform-mybucket이라고 버킷의 이름을 정해줍니다.

resource "aws_s3_bucket" "moon-terraform-mybucket" {
  bucket = "moon-terraform-mybucket"

  tags = {
    environment = "devel"
  }
}

퍼블랙 액세스

S3 Bucket을 만들게 되면 자동으로 Permission이 없는 상태가 되기 때문에
이 Permission을 풀어주도록 하겠습니다.

resource "aws_s3_bucket_public_access_block" "public-access" {
  bucket = aws_s3_bucket.moon-terraform-mybucket.id

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

S3 Object 생성

이번에는 S3 Object를 만들어서 S3 버킷에 추가해줍니다.

이를 위해서 테라폼을 작성하는 위치의 디렉토리에 example.txt를 작성해줍니다.

# example.txt

hello world!

S3 오브젝트를 생성하는 테라폼 코드는 다음과 같습니다.

resource "aws_s3_object" "terraform-sample-txt" {
  bucket = aws_s3_bucket.moon-terraform-mybucket.id
  key    = "example.txt"
  source = "example.txt"
}

Policy 적용

이제 S3의 정책을 적용해줍니다.
지정할 정책은 S3를 퍼블릭하게 읽을 수 있도록 지정해줍니다.

S3는 AWS S3 Bucket Public Access Block 이라는 리소스를 사용해서
버킷에 대한 접근을 풀어주어야 합니다.

이렇게 버킷에 대한 접근을 풀어준 다음에야 정책을 적용하실 수 있습니다.
그렇지 않으면 에러가 발생하게 됩니다.

아래와 같이 depends on을 통해서 먼저 버킷에 대한 접근을 풀어주고
S3 버킷에 정책을 적용할 수 있도록 해줍니다.

resource "aws_s3_bucket_policy" "bucket-policy" {
  bucket = aws_s3_bucket.moon-terraform-mybucket.id

  depends_on = [
    aws_s3_bucket_public_access_block.public-access
  ]

  policy = <<POLICY
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicRead",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::${aws_s3_bucket.terraform-mybucket.id}/*"]
    }
  ]
}
POLICY
}

전체 코드

# main.tf

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_s3_bucket" "moon-terraform-mybucket" {
  bucket = "moon-terraform-mybucket"

  tags = {
    environment = "devel"
  }
}

resource "aws_s3_bucket_public_access_block" "public-access" {
  bucket = aws_s3_bucket.moon-terraform-mybucket.id

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

resource "aws_s3_object" "terraform-sample-txt" {
  bucket = aws_s3_bucket.moon-terraform-mybucket.id
  key    = "example.txt"
  source = "example.txt"
}

resource "aws_s3_bucket_policy" "bucket-policy" {
  bucket = aws_s3_bucket.moon-terraform-mybucket.id

  depends_on = [
    aws_s3_bucket_public_access_block.public-access
  ]

  policy = <<POLICY
{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicRead",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::${aws_s3_bucket.moon-terraform-mybucket.id}/*"]
    }
  ]
}
POLICY
}

Terraform 실행

우선 terraform init을 통해서 Provider를 다운로드 받아주도록 하겠습니다.

terraform init

그 다음으로는 플랜을 진행해보겠습니다.

아래의 결과와 버킷, 정책, 퍼블릭 액세스 블록, 샘플 오브젝트 4개를 만들 것이라는 알 수 있습니다.

terraform plan

그럼 이제 우리가 작성한 코드를 통해서 AWS S3를 만들기 위해서 작성한 코드를 적용해주도록 하겠습니다.

terraform apply


결과 확인

우리가 작성한 코드를 적용하였으니 이제 AWS Console에 가서
S3 버킷이 잘 만들어졌는지 확인해보도록 합니다.

AWS Console에서 S3로 들어오면 아래와 같이 우리가 코드로 작성한
moon-terraform-mybucketS3 버킷이 생성된 것을 볼 수 있습니다.

그리고 우리는 코드에서 S3의 액세스는 퍼블릭으로 주었기 때문에 빨간색으로 경고와 함께 퍼블릭으로 되어있는 것을 볼 수 있습니다.

버킷 안으로 들어오게 되면 코드로 작성했던 오브젝트인 example.txt가 저장되어 있습니다.

[권한] 탭으로 들어오시면 S3 버킷에 대한 권한이 우리가 지정한 것과 같이 부여되어 있는 것을 확인할 수 있습니다.

참고: Terraform Resource: aws_s3_bucket

profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글