Terraform Backend(Remote State)
Terraform Backend
Backend
์๊ฒฉ์ผ๋ก State ํ์ผ์ ๊ด๋ฆฌํ๊ธฐ ์ํด์ , Backend Block์ด ํ์ํ๋ค. Terraform Backend Block๋ง ๊ตฌ์ฑํ๊ณ , ์ธ๋ถ์ ์ธ ๋ด์ฉ์ ์ค์ ํ์ง ์์ผ๋ฉด Terraform์ ์๋์ผ๋ก Local Backend๋ก ์ค์ ํ๋ค. ์๋์ ๊ฐ์ด ์๊ฒฉ์ผ๋ก ์ํํ์ผ์ ๊ด๋ฆฌํ๋ฉด, state locking ๊ธฐ๋ฅ๋๋ถ์ ํ์ ํ ๋ ์์ ํ ์์ ์ด ๊ฐ๋ฅํ๋ฉฐ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ณด๋ฅผ ์ํธํํ ์ ์๋ค๊ณ ๋ ํ๋ค.
์ง์๋ชฉ๋ก์ ์๋์ ๊ฐ๋ค.
- local
- remote : Terraform Cloud
- azurerm
- consul
- cos
- gcs
- http
- Kubernetes
- oss
- pg
- s3
Remote State
๋ง์ฝ, ํ๊ฐ์ ํ์ ์ด ํ์ํ ๋ state ํ์ผ์ ๋ก์ปฌ์ ์ ์ฅํ๋ฉด ๋ค๋ฅธ ํ์๋ค์ ์๋ง์ ์ํ๋ฅผ ๊ณต์ ๋ฐ์ง ๋ชปํ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฅผ ๊ณต์ ํด์ผ ํ๋ฉฐ, ๋ง์ฝ ๋์์ ์์ ํ ๊ฒฝ์ฐ ์ถฉ๋์ด ๋ฐ์ํ๋ค.
ํ ๋จ์๋ก ์์ ํ ๋๋ ํ์๋ค์ด ๋ฐฐํฌ ์ํ๋ฅผ ์๊ณ , ๋๊ฐ ๋จผ์ ์ ์ฉํ ์ง ์์๋ ์์์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ก๊ฐ ์๋ก์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฎ์ด์ฐ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๊ฒฉ์ผ๋ก ์ ์ฅ์ ํ๋ค๋ฉด ํ์ดํ๋ผ์ธ์ ์ํด ์๋์ผ๋ก ์ต์ ์ํ(state:latest)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐํฌํ ์ ์๋ค.
- ์๋์ ์์๋ S3 ๋ฒํท์ ํตํด state๋ฅผ ์๊ฒฉ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ชจ์ต์ด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "4.24.0"
}
}
backend "s3" {
bucket = "env0-acme-tfstate"
dynamodb_table = "env0-acme-tfstate-lock"
key = "acme-demo-s3"
region = "us-west-2"
role_arn = "arn:aws:iam::..."
# external_id = "value"
}
}
provider "aws" {
region = "us-west-2"
}
State locking
์๊ฒฉ ๋ฐฑ์๋์ ๊ฒฝ์ฐ ์ํ ์ฅ๊ธ์ ์ฌ์ฉํด ๋์ผํ ์ํ์ ๋ํด Terraform์ด ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.
OS์์ ๋๊ธฐํ๋ฅผ ๋ฐฐ์ ์ ๋์ ๊ฐ์ด locking์ ํตํด terraform์ ์์ ์ ํ์ ๋๊ธฐ์์ผ, ๋์์์ ์ ๋ฐฉ์งํ๋ค. ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
๋จผ์ DynamoDB์ ํ
์ด๋ธ์ ๋ง๋ ๋ค. ์ด ํ
์ด๋ธ์ tfstate๋ฅผ S3์ ๊ด๋ฆฌํ๋ฉด์ ๋์์ ์์
์ด ์ผ์ด๋์ง ์๋๋ก ํ๋ Lock ํ
์ด๋ธ์ด๋ค. Lock ํ
์ด๋ธ์ ์ ํ์ฌํญ์ด๋ Lock ํ
์ด๋ธ์ด ์๋ค๋ฉดย plan
์ด๋ย apply
๋ฅผ ํ ๋ ๋จผ์ ์ ๊ทธ๊ณ ์์
์ด ๋๋๋ฉด ์ ๊ธ์ ํด์ ํ๊ฒ ๋๋ค.
- terrafrom state ํ์ผ ๊ด๋ฆฌ + Lock ํ ์ด๋ธ์ฉ Dynamodb ๋ฆฌ์์ค
1
2
3
4
5
6
7
8
9
10
11
resource "aws_dynamodb_table" "terraform_state_lock" {
name = "TerraformStateLock"
read_capacity = 5
write_capacity = 5
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
- Terraform ์ค์
1
2
3
4
5
6
7
8
9
10
11
terraform {
required_version = ">= 0.9.5"
backend "s3" {
bucket = "kr.ne.outsider.terraform.state"
key = "test/terraform.tfstate"
region = "ap-northeast-1"
encrypt = true
lock_table = "TerraformStateLock"
acl = "bucket-owner-full-control"
}
}
์ด๋ฌ๊ณ ๋ง์ฝ plan ์ด๋, apply๋ฅผ ์ ์ฉํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด Lock์ ๊ด๋ฆฌํ๋ค.
1
2
3
4
$ terraform plan
...
Releasing state lock. This may take a few moments...
์ค์ต
์๋ ์ค์ต์ T101์์ ์งํํ ์ฝ๋์ด๋ค. S3 + dynamodb_table์ ์ด์ฉํ๋ค. lock ๊ตฌํ ๋ฐ ํ์ธํ๋ ์ฝ๋์ด๋ค. ๋์์ ์์
ํ๋ฉด locking state
์๋ฌ ๋ฉ์์ง ๋ฐ์ํด์ผํ์ง๋ง, ์๊ฐ๋ณด๋ค ์ฝ๋๊ฐ ๋นจ๋ฆฌ ์คํ๋์ด ์ฌ๊ธฐ์๋ lock state ๋ฉ์ธ์ง๋ฅผ ๋ณด๊ธฐ ํ๋ค๋ค. ๊ธฐ์
์ด๋ ํฐ ํ๋ก์ ํธ์ ์ธํ๋ผ์ธ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฐ์ผ ๋ฏํ๋ค.
AWS S3/DynamoDB ๋ฐฑ์๋
์๋๋ ๊ด๋ จ ์ฝ๋์ด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
provider "aws" {
profile = "eks"
region = "ap-northeast-2"
}
resource "aws_s3_bucket" "mys3bucket" {
bucket = "kane-t101study-tfstate"
}
# Enable versioning so you can see the full revision history of your state files
resource "aws_s3_bucket_versioning" "mys3bucket_versioning" {
bucket = aws_s3_bucket.mys3bucket.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_dynamodb_table" "mydynamodbtable" {
name = "terraform-locks"
billing_mode = "PAY_PER_REQUEST"
hash_key = "LockID"
attribute {
name = "LockID"
type = "S"
}
}
output "s3_bucket_arn" {
value = aws_s3_bucket.mys3bucket.arn
description = "The ARN of the S3 bucket"
}
output "dynamodb_table_name" {
value = aws_dynamodb_table.mydynamodbtable.name
description = "The name of the DynamoDB table"
}
EC2๋ฅผ ๋ฐฐํฌํ๋ ์ฝ๋์ ์๋์ ๊ฐ์ ์๊ฒฉ backend๋ฅผ ์ค์ ํ๋ค.
1
2
3
4
5
6
7
8
9
terraform {
backend "s3" {
bucket = "kane-t101study-tfstate"
key = "dev/terraform.tfstate"
region = "ap-northeast-2"
dynamodb_table = "terraform-locks"
# encrypt = true
}
}
๋ฐฐํฌํ ํ, AWS ์ฝ์์ ์ ์ํ๋ฉด ์๋์ ๊ฐ์ด table์ ํ์ธํ ์ ์๋ค.
์ด์ , s3๋ฅผ ๋ชจ๋ํฐ๋งํ๋ฉฐ Terraform์ ๋ฐฐํฌํ์ฌ state ํ์ผ์ด ์ ์์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ์ง ํ์ธํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
while true; do aws s3 ls s3://$NICKNAME-t101study-tfstate --recursive --human-readable --summarize ; echo "------------------------------"; date; sleep 1; done
Total Objects: 0
Total Size: 0 Bytes
------------------------------
Mon Aug 28 00:50:18 KST 2023
Total Objects: 0
Total Size: 0 Bytes
------------------------------
...
# ๋ฆฌ์์ค ์์ฑ
------------------------------
Mon Aug 28 00:53:16 KST 2023
2023-08-28 00:50:56 21.1 KiB dev/terraform.tfstate
Total Objects: 1
Total Size: 21.1 KiB
------------------------------
Mon Aug 28 00:53:17 KST 2023
2023-08-28 00:53:18 22.4 KiB dev/terraform.tfstate
------------------------------
...
# ๋ฆฌ์์ค ์
๋ฐ์ดํธ
------------------------------
Total Objects: 1
Total Size: 22.4 KiB
------------------------------
# ๋ฆฌ์์ค ์ญ์
...
------------------------------
Mon Aug 28 00:56:04 KST 2023
2023-08-28 00:56:03 180 Bytes dev/terraform.tfstate
Total Objects: 1
Total Size: 180 Bytes
------------------------------
Mon Aug 28 00:56:05 KST 2023
์๋์ ๊ฐ์ด ์ฝ์์์๋ ํ์ธํ ์ ์๋ค. ์์ฑ ์์๋ ์๋์์๋ถํฐ ์ ๋ฐฉํฅ์ด๋ค.