테라폼을 사용하면서 작업디렉토리를 얼마나 효율적으로 사용하는것은 개인적으로 정말 중요하다고 생각한다. 따라서 왜 이렇게 구분해놓았는지에 대한 기준을 자신 나름대로 세워야 한다.
.
└── 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의 모듈을 로컬로 다운받아 사용한다.
└── 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와 상태파일에 Locking을 하기위한 DynamoDB를 생성해보자.
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를 생성한다.
variable "bucket_name" {
description = "Define the bucket name to use remote_state"
default = "testing"
}
버킷의 이름을 지정하는 변수파일이다. 이 변수값은 메인 디렉터리의 main.tf에서 정의할 수 있다.
(변수값을 지정하지 않으면 default 값인 "testing" 값이 정의된다.)
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를 실행해 보자
module "s3" {
source = "../../modules/s3"
bucket_name = "using-project"
}
output "s3_output" {
value = module.s3
}
이제 terraform init 명령어로 플러그인을 내려받고 리소스를 생성하자.
terraform init -> terraform plan -> terraform apply
버킷 생성 확인
DynamoDB 생성 확인
이제 간단한 Admin 권한을 가진 IAM 유저를 만들어 보자
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 = ["*"]
}
}
variable "iam_user_name" {
description = "Set the iam user name"
type = "list"
default = ["testing"]
}
output "aws_iam_arn" {
value = aws_iam_user.admin_user.*.arn
}
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
지정된 권한 확인
필요하다면 '관리'를 눌러 비밀번호 설정을 해주자
감자합니다.