Terraform 입문 - 레이아웃 및 S3, IAM 생성

empty·2020년 9월 6일
3

Terraform

목록 보기
1/4

레이아웃

작업디렉토리

테라폼을 사용하면서 작업디렉토리를 얼마나 효율적으로 사용하는것은 개인적으로 정말 중요하다고 생각한다. 따라서 왜 이렇게 구분해놓았는지에 대한 기준을 자신 나름대로 세워야 한다.

로컬에 저장되어 있는 작업 디렉터리

.
└── main
    ├── global       ────────> 공통적으로 사용되는 모듈을 실행하는 구성파일을 저장
    │   ├── iam
    │   └── s3
    │       ├── main.tf
    │       └── var.tf
    └── stage         ────────> 스테이징환경의 모듈을 실행하는 구성파일을 저장
        ├── ec2
        │   ├── main.tf
        │   ├── output.tf
        │   └── var.tf
        ├── eks
        ├── main.tf   ────────> 스테이징환경의 모듈을 모두!! 실행하는 구성파일
        └── vpc
             ├── main.tf
             ├── output.tf
             └── var.tf

위의 작업 디렉터리는 로컬에 저장되어있고 각각의 main.tf 파일들은 Github에 올라가있는 모듈을 source로 불러오는 식으로 모듈을 사용한다.

모듈은 Github에 올려놓고 데이터 소스로 가져오는 식으로 모듈을 사용한다.
└ 모듈을 불러와서 사용하면 변수값 지정이 안되는 현상이 있어서 github의 모듈을 로컬로 다운받아 사용한다.

-> Github와 연동되어있는 모듈의 구조

└── modules
    ├── dev
    ├── global
    │   ├── iam
    │   │   ├── main.tf
    │   │   └── output.tf
    │   └── s3
    │       ├── main.tf
    │       └── output.tf
    ├── prod
    └── stage
        ├── ec2
        │   ├── main.tf
        │   ├── output.tf
        │   └── var.tf
        ├── eks
        └── vpc
            ├── main.tf
            ├── output.tf
            └── var.tf

작업 디렉터리에서 VPC를 생성하는 main.tf에는
1. backend
2. module
3. output

3가지 리소스가 들어있다.

backend 를 통해 .tfstate 파일을 원격저장소(S3)에 저장한다.
provider 에서는 어느 서비스(제공자)를 사용할지 정의한다. (GCP,AZURE,OPENSTACK ...)
module 에서는 github에 올라가 있는 모듈을 불러오고 모듈의 변수를 정의한다.
output 은 모듈에 정의되어 있는 output.tf를 출력한다.

이렇게 하면 성공적으로 "vpc" 모듈을 불러와서 리소스를 생성하게 될 것이다.

S3

테라폼 작업을 어떻게 진행해야 하는지 간략하게 살펴보았다.
이제 테라폼의 상태를 저장하기 위한 S3와 상태파일에 Locking을 하기위한 DynamoDB를 생성해보자.

  • 사용되는 리소스
    aws_s3_bucket
    aws_dynamodb_table

modules/global/s3/main.tf

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

 # S3 Bucket for backend
resource "aws_s3_bucket" "tfstate" {
  bucket = "${var.bucket_name}-seoul-tfstate"

  versioning {
    enabled = true
  }
}

 # DynamoDB for fstate locking
resource "aws_dynamodb_table" "tfstate_lock" {
  hash_key = "LockID" #Primary Key is LockID
  name = "terraform_lock"
  read_capacity  = 1
  write_capacity = 1

  attribute {
    name = "LockID"
    type = "S"
  }
}

우선 .tfstate 파일을 저장하기 위한 S3를 생성하고 생성된 S3의 이름을 참조하여서 DynamoDB를 생성한다.

modules/global/s3/var.tf

variable "bucket_name" {
  description = "Define the bucket name to use remote_state"
  default = "testing"
}

버킷의 이름을 지정하는 변수파일이다. 이 변수값은 메인 디렉터리의 main.tf에서 정의할 수 있다.
(변수값을 지정하지 않으면 default 값인 "testing" 값이 정의된다.)

modules/global/s3/output.tf

output "aws_s3_bucket_name" {
  value = aws_s3_bucket.tfstate.bucket
}

output "aws_dynamodb_name" {
  value = aws_dynamodb_table.tfstate_lock.name
}

출력변수로 버킷의 이름과 DB의 이름을 출력하게 설정했다.

이제 리소스 생성을 위해 메인 디렉터리인 global/s3/main.tf를 실행해 보자

global/s3/main.tf

module "s3" {
  source = "../../modules/s3"
  bucket_name = "using-project"
}

output "s3_output" {
  value = module.s3
}

이제 terraform init 명령어로 플러그인을 내려받고 리소스를 생성하자.

terraform init -> terraform plan -> terraform apply

결과

  • 버킷 생성 확인

  • DynamoDB 생성 확인

IAM

이제 간단한 Admin 권한을 가진 IAM 유저를 만들어 보자

  • 사용되는 리소스
    aws_iam_user
    aws_iam_group
    aws_iam_group_policy
    aws_iam_group_membership
    aws_iam_policy_document

modules/global/iam/main.tf

resource "aws_iam_user" "admin_user"{
  count = length(var.iam_user_name)
  name = element(var.iam_user_name, count.index)
}

resource "aws_iam_group" "admin_user" {
  name = "admin_user"
}

resource "aws_iam_group_policy" "admin_user" {
  name   = "all_aws_policy_for_admin_user"
  group  = aws_iam_group.admin_user.id
  policy = data.aws_iam_policy_document.admin_policy.json
}

resource "aws_iam_group_membership" "admin" {
  count = length(var.iam_user_name)

  name  = "admin_group_membership"
  users = element([aws_iam_user.admin_user.*.name], count.index)
  group = aws_iam_group.admin_user.name
}

data "aws_iam_policy_document" "admin_policy" {
  statement {
    effect = "Allow"
    actions = ["*"]
    resources = ["*"]
  }
}

modules/global/iam/var.tf

variable "iam_user_name" {
  description = "Set the iam user name"
  type = "list"
  default = ["testing"]
}

modules/global/iam/output.tf

output "aws_iam_arn" {
  value = aws_iam_user.admin_user.*.arn
}

global/iam/main.tf

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

module "iam_user" {
  source = "../../modules/iam"
}

output "arn" {
  value = module.iam_user
}

terraform {
  backend "s3" {
    bucket = "testing-seoul-tfstate"
    key = "global/iam/terraform.tfstate"
    region = "ap-northeast-2"
    encrypt = true
    dynamodb_table = "tflock"
  }
}

모듈을 불러오고 출력변수로는 생성된 iam user의 arn 값을 출력한다.
또한 .tfstate 파일을 원격 저장소인 S3에 저장시킨다.

결과

  • 생성된 iam_user

  • 지정된 권한 확인

  • 필요하다면 '관리'를 눌러 비밀번호 설정을 해주자

2개의 댓글

comment-user-thumbnail
2021년 2월 4일

감자합니다.

1개의 답글