# Terraform 으로 재사용 가능한 S3 모듈 만들기

bhs9610·2020년 9월 23일
1

이 글에선 Serverless 프로젝트를 하면서 필요한 리소스를 Terraform 모듈로 만들어 볼겁니다.


🛸 모듈을 사용하는 이유?

먼저 모듈을 사용하면 코드 중복을 피할 수 있고, 이는 동일한 코드를 사용해 동일한 유형의 리소스를 만들 수 있습니다. 코드를 만들거나 여러 리소스를 만들기 위해 코드를 복붙할 필요가 없습니다. 예를 들어, Terraform 모듈에 코드를 넣고 스테이징 및 프로덕션 환경에서 해당 모듈을 재사용 할 수 있습니다. 요렇게 하면 코드를 귀찮게 복붙할 필요도 없고 동일한 모듈을 다른 환경에서 사용하는겁니다.

여기서는 S3 버킷을 생성을 위한 모듈을 만들어보겠습니다.

전제 조건

이 포스팅에서는 테라폼 설치 및 aws cli 설정에 대해서 다루지 않습니다. 필요한 전제 조건은 아래와 같습니다.

  • Terraform 이 설치된 Host
  • Terraform 에 대한 사전지식
  • AWS 계정
  • AWS IAM 사용자의 'access_key' 와 'secret_key'

👿 Terraform 모듈 만들기


terraform 'main.tf' 파일과 모듈을 사용하기 위한 디렉토리를 만듭니다.

mkdir -p modules/s3-man

modules / s3-man 아래에 main.tf 파일을 생성하고 S3 버킷을 생성하는 모듈의 코드 소스를 작성합니다.

resource "aws_s3_bucket" "s3_bucket" {
  bucket = var.bucket_name
  acl    = "public-read"
  policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "AddPerm",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::YOUR-BUCKETNAME/*"
    }
]
}
EOF 
  website {
    index_document = "index.html"
    error_document = "error.html"
  }
   tags = var.tags
}

"modules / s3-man / variables.tf" 에서 main.tf 에서 사용할 변수를 선언합니다. 변수는 원하는대로 수정해서 리소스 값에 사용해도 됩니다.

vim modules / aws-s3 / variables.tf
variable "bucket_name" {
  description = "Name of the s3 bucket. Must be unique."
  type = string
}

variable "tags" {
  description = "Tags to set on the bucket."
  type = map(string)
  default = {}
}

여기 까지가 모듈을 정의한 것이고, 이제 모듈을 호출할 "main.tf" 파일을 만들어야 합니다. 모듈은 module 블록을 사용하여 호출 할 수 있습니다.


🕹️ 모듈 호출하기

모듈을 호출할 "main.tf" 를 만들어 보겠습니다.

vim main.tf
provider "aws" {
      region     = var.region
      access_key = var.access_key
      secret_key = var.secret_key
}

module "website_s3_bucket" {
  source = "./s3-man"

  bucket_name = var.bucket_name

  tags = {
    Terraform   = "true"
    Environment = "dev"
  }
}

만들 모듈을 호출하는 main.tf 입니다. 하지만, 모든 모듈에는 "source" 부분에 인수가 필요합니다. 이건 모듈이 어디에 있는지 알려주는 Path 이라고 생각하시면됩니다. 로컬 디렉토리 경로나 github 등 여러 Path 을 사용 할 수 있습니다.

변수를 정의할 "variables.tf" 를 만들어보겠습니다. 여기에 AWS "access_key" 및 "secret_key" 와 "region" 에 대한 변수입니다.

vim variables.tf
variable "access_key" {
     description = "Access key to AWS console"
}
variable "secret_key" {
     description = "Secret key to AWS console"
}
variable "region" {
     description = "Region of AWS VPC"
}
variable "bucket_name" {
  description = "(Required) Creates a unique bucket name"
  type        = "string"
  default     = "<사용할 버킷이름>"
}

🤫 AWS 자격 증명 파일 만들기

이제 AWS 자격 증명을 위한 "terraform.tfvars" 를 만들어보도록 할건데요, 여기서 작성하는 키는 IAM 의 사용자 키로 입력 하도록 하겠습니다. tfvars에 "variable" 에 정의한 변수를 키값 형태로 넣게되면은 Terrafrom 에서 알아서 인식해 사용합니다. 여기서 Key 설정을 하지 않으면 terraform apply 시 직접 입력해야합니다.

vim terraform.tfvars
region = "<region name>"
access_key = "<key_id>"
secret_key = "<secret_id>"

🎮 만든 모듈 배포하기

먼저, 'terraform init' 명령으로 프로바이더 플로그인을 다운로드 합니다. 저희는 AWS 입니다.

'terraform plan' 으로 현재 모듈 배포시 AWS 인프라에 발생할 변경 사항을 체크해줍니다L

terraform plan
...
..
Plan: 1 to add, 0 to change, 0 to destroy.

'terraform apply' 를 통해 main.tf 에 언급된 AWS 리소스를 생성합니다. 리소스를 만들건지 물어보는 메시지가 나오는데 'yes' 해주면 됩니다.

terraform apply
.....
..
**Apply complete! Resources: 1 added, 0 changed, 0 destroyed.**

위에 명령을 실행하면, 1개의 리소스가 추가되고 0개가 삭제 했다는 메시지를 확인 할 수 있습니다.

만든 S3 버킷 삭제하기

main.tf 에 정의한 구성을 사용해서 만든 S3 버킷이 필요없어서 삭제 할 땐 'terraform destory' 명령을 사용하여 모든 리소스를 삭제 할 수 있습니다. 해당 명령 사용시 만든 버킷이 삭제됩니다.

terraform distory

결과


모듈을 만들고 이 모듈을 사용해서 S3 버킷을 만들어 보았습니다. 이제 이 모듈로 여러 환경에서 S3 버킷을 생성 할 수 있겠죠? 다른 환경에서 쓰고 싶으면 변수 값을 변경하기만 하면 됩니다. 구현한 테라폼 모듈은 AWS 에서 Serverless 사용하기 에서 사용할 생각입니다!

참고자료

https://www.howtoforge.com/how-to-create-a-terraform-module/#create-an-s-bucket-using-the-terraform-module

https://www.google.com/search?q=terraform+으로+aws&sxsrf=ALeKk03Fpl8lbHnifbFwFo3T0LecGlTKGg:1600866009932&source=lnms&tbm=isch&sa=X&ved=2ahUKEwj3hevOqv_rAhXVKqYKHeTyBI4Q_AUoAnoECAwQBA&biw=762&bih=770&dpr=1.25#imgrc=MwUO9xf-eFlTVM

https://www.nclouds.com/blog/terraform-aws-app-modernization/

profile
@changhyuni

0개의 댓글