๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 

๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 
๋ฌด์—‡์ด ๋จผ์ € ์™”๋Š”๊ฐ€? ๋‹ญ๊ณ ๊ธฐ์ธ๊ฐ€, ๋‹ฌ๊ฑ€์ธ๊ฐ€? ์ฝ”๋“œํ˜• ์ธํ”„๋ผ(Infrastructure-as-Code)์— ๊ด€ํ•œ ๊ธฐ์‚ฌ์˜ ์‹œ์ž‘์€ ๊ฝค ์ด์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ณ„๋ž€์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ IaC(Infrastructure-as-Code)๋Š” ์ธํ”„๋ผ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์„ ์–ธ์  ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํ•˜๋“œ์›จ์–ด ๋ถ€๋ถ„์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ์œผ๋กœ ๋๋‚˜๋Š” ๋‹ฌ์„ฑํ•˜๋ ค๋Š” ์ƒํƒœ๊ฐ€ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ IaC๋Š” ๋‹ค์Œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. ์ž์› ์ œ๊ณต. VM, S3, VPC ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฌด์šฉ ๊ธฐ๋ณธ ๋„๊ตฌ: ํ…Œ๋ผ ํผ ะธ ํด๋ผ์šฐ๋“œ ํฌ๋ฉ”์ด์…˜.
  2. ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ. ๊ธฐ๋ณธ ๋„๊ตฌ: ์ฑ…์ž„๊ฐ์žˆ๋Š”, ์…ฐํ”„ ๋“ฑ

๋ชจ๋“  ์ฝ”๋“œ๋Š” git ์ €์žฅ์†Œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์กฐ๋งŒ๊ฐ„ ํŒ€ ๋ฆฌ๋”๋Š” ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฒฐ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Š” ๋ฆฌํŒฉํ† ๋งํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์–ด๋–ค ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Š” ์ด๊ฒƒ์ด ์ข‹์€ ๊ฒƒ์ž„์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ์ข‹์€๋ฐ GitLab ะธ GitHub์˜-Terraform์šฉ ๊ณต๊ธ‰์ž(์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ)์ž…๋‹ˆ๋‹ค. ์ด๋“ค์˜ ๋„์›€์„ ๋ฐ›์•„ ํŒ€ ๊ตฌ์„ฑ์›, CI/CD, git-flow ๋“ฑ ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ„๋ž€์€ ์–ด๋””์„œ ์™”๋‚˜์š”?

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ ์ฐจ ์ฃผ์š” ์งˆ๋ฌธ์— ์ ‘๊ทผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„ , ์ž์‹ ์„ ํฌํ•จํ•œ ๋‹ค๋ฅธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  GitOps์˜ ์ผ๋ถ€๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก CI๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Git์ด ์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด?

  1. Git์— ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๋‚˜์š”?
  2. CI๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์น˜ํ•˜๋‚˜์š”?
  3. IaC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Gitlab์„ ๋ฐฐํฌํ•˜๊ณ  Kubernetes์—์„œ๋„ ๋ฐฐํฌํ•œ๋‹ค๋ฉด?
  4. GitLab Runner๋„ Kubernetes์— ์žˆ๋‚˜์š”?
  5. ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์˜ Kubernetes๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋‚ด ์ฝ”๋“œ๋ฅผ ์—…๋กœ๋“œํ•  GitLab, ์•„๋‹ˆ๋ฉด ์–ด๋–ค ์ข…๋ฅ˜์˜ GitLab์ด ํ•„์š”ํ•œ์ง€ ์„ค๋ช…ํ•˜๋Š” ์ฝ”๋“œ ์ค‘ ๋ฌด์—‡์ด ๋จผ์ € ์™”์Šต๋‹ˆ๊นŒ?

๊ณ„๋ž€์„ ๋„ฃ์€ ๋‹ญ๊ณ ๊ธฐ

ยซ์˜ค์•ผ์ฝ”๋™3 ๊ณต๋ฃก๊ณผ ํ•จ๊ป˜" [SRC]

ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค ๊ด€๋ฆฌํ˜• Kubernetes ์„ ํƒ.

TL; DR

ํ•œ ํŒ€์— ๋™์‹œ์— ๊ฐ€์ž…ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

$ export MY_SELECTEL_TOKEN=<token>
$ curl https://gitlab.com/chicken-or-egg/mks/make/-/snippets/2002106/raw | bash

์„ฑ๋ถ„ :

  • my.selectel.ru์˜ ๊ณ„์ •;
  • ๊ณ„์ • ํ† ํฐ
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ์ˆ ;
  • ํˆฌ๊ตฌ ๊ธฐ์ˆ ;
  • ํ…Œ๋ผํฌ๋ฐ ๊ธฐ์ˆ ;
  • ํ—ฌ๋ฆ„ ์ฐจํŠธ GitLab;
  • ํˆฌ๊ตฌ ์ฐจํŠธ GitLab Runner.

์กฐ๋ฆฌ๋ฒ• :

  1. ํŒจ๋„์—์„œ MY_SELECTEL_TOKEN ๊ฐ€์ ธ์˜ค๊ธฐ my.selectel.ru.
  2. ๊ณ„์ • ํ† ํฐ์„ ์ „์†กํ•˜์—ฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ์ƒ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ KUBECONFIG๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  4. Kubernetes์— GitLab์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  5. ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์ƒ์„ฑ๋œ GitLab์—์„œ GitLab ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฟŒ๋ฆฌ.
  6. GitLab-token์„ ์‚ฌ์šฉํ•˜์—ฌ GitLab์—์„œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  7. ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ GitLab์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  8. ?
  9. ์ด์ต!

1 ๋‹จ๊ณ„. ํ† ํฐ์€ ์„น์…˜์—์„œ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API ํ‚ค.

๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 2 ๋‹จ๊ณ„. 2๊ฐœ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ "๊ตฝ๊ธฐ" ์œ„ํ•ด Terraform์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์— ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ ์ž๋™ ํ• ๋‹น๋Ÿ‰์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

provider "selectel" {
 token = var.my_selectel_token
}

variable "my_selectel_token" {}
variable "username" {}
variable "region" {}


resource "selectel_vpc_project_v2" "my-k8s" {
 name = "my-k8s-cluster"
 theme = {
   color = "269926"
 }
 quotas {
   resource_name = "compute_cores"
   resource_quotas {
     region = var.region
     zone = "${var.region}a"
     value = 16
   }
 }
 quotas {
   resource_name = "network_floatingips"
   resource_quotas {
     region = var.region
     value = 1
   }
 }
 quotas {
   resource_name = "load_balancers"
   resource_quotas {
     region = var.region
     value = 1
   }
 }
 quotas {
   resource_name = "compute_ram"
   resource_quotas {
     region = var.region
     zone = "${var.region}a"
     value = 32768
   }
 }
 quotas {
   resource_name = "volume_gigabytes_fast"
   resource_quotas {
     region = var.region
     zone = "${var.region}a"
     # (20 * 2) + 50 + (8 * 3 + 10)
     value = 130
   }
 }
}

resource "selectel_mks_cluster_v1" "k8s-cluster" {
 name         = "k8s-cluster"
 project_id   = selectel_vpc_project_v2.my-k8s.id
 region       = var.region
 kube_version = "1.17.9"
}

resource "selectel_mks_nodegroup_v1" "nodegroup_1" {
 cluster_id        = selectel_mks_cluster_v1.k8s-cluster.id
 project_id        = selectel_mks_cluster_v1.k8s-cluster.project_id
 region            = selectel_mks_cluster_v1.k8s-cluster.region
 availability_zone = "${var.region}a"
 nodes_count       = 2
 cpus              = 8
 ram_mb            = 16384
 volume_gb         = 15
 volume_type       = "fast.${var.region}a"
 labels            = {
   "project": "my",
 }
}

ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

resource "random_password" "my-k8s-user-pass" {
 length = 16
 special = true
 override_special = "_%@"
}

resource "selectel_vpc_user_v2" "my-k8s-user" {
 password = random_password.my-k8s-user-pass.result
 name = var.username
 enabled  = true
}

resource "selectel_vpc_keypair_v2" "my-k8s-user-ssh" {
 public_key = file("~/.ssh/id_rsa.pub")
 user_id    = selectel_vpc_user_v2.my-k8s-user.id
 name = var.username
}

resource "selectel_vpc_role_v2" "my-k8s-role" {
 project_id = selectel_vpc_project_v2.my-k8s.id
 user_id    = selectel_vpc_user_v2.my-k8s-user.id
}

์‚ฐ์ถœ:

output "project_id" {
 value = selectel_vpc_project_v2.my-k8s.id
}

output "k8s_id" {
 value = selectel_mks_cluster_v1.k8s-cluster.id
}

output "user_name" {
 value = selectel_vpc_user_v2.my-k8s-user.name
}

output "user_pass" {
 value = selectel_vpc_user_v2.my-k8s-user.password
}

์‹œ์ž‘ํ•ด๋ณด์ž:

$ env 
TF_VAR_region=ru-3 
TF_VAR_username=diamon 
TF_VAR_my_selectel_token=<token> 
terraform plan -out planfile

$ terraform apply -input=false -auto-approve planfile

๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 
3 ๋‹จ๊ณ„. ์šฐ๋ฆฌ๋Š” Cubeconfig๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ KUBECONFIG๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด OpenStack์—์„œ ํ† ํฐ์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

openstack token issue -c id -f value > token

๊ทธ๋ฆฌ๊ณ  ์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ Managed Kubernetes Selectel API์— ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. k8s_id ๋ฌธ์ œ ํ…Œ๋ผ ํฌ๋ฆ„:

curl -XGET -H "x-auth-token: $(cat token)" "https://ru-3.mks.selcloud.ru/v1/clusters/$(cat k8s_id)/kubeconfig" -o kubeConfig.yaml

Cupconfig๋Š” ํŒจ๋„์„ ํ†ตํ•ด์„œ๋„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 
4 ๋‹จ๊ณ„. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ตฌ์›Œ์ง€๊ณ  ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ์œ„์— yaml์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ง›๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค:

  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค,
  • ์ €์žฅ ํด๋ž˜์Šค
  • ํฌ๋“œ ๋ณด์•ˆ ์ •์ฑ… ๋“ฑ.

์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค Selectel์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ์ €์žฅ์†Œ.

์ฒ˜์Œ์— ์˜์—ญ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ ํƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจ-3a, ์ด ์˜์—ญ์˜ ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
 name: fast.ru-3a
 annotations:
   storageclass.kubernetes.io/is-default-class: "true"
provisioner: cinder.csi.openstack.org
parameters:
 type: fast.ru-3a
 availability: ru-3a
allowVolumeExpansion: true

5 ๋‹จ๊ณ„. ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ‘œ์ค€์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค nginx ์ˆ˜์‹ . ์„ค์น˜์— ๋Œ€ํ•œ ์ง€์นจ์ด ์ด๋ฏธ ๋งŽ์ด ์žˆ์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

$ helm repo add nginx-stable https://helm.nginx.com/stable
$ helm upgrade nginx-ingress nginx-stable/nginx-ingress -n ingress --install -f ../internal/K8S-cluster/ingress/values.yml

์•ฝ 3~4๋ถ„ ๋™์•ˆ ์™ธ๋ถ€ IP๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 
์ˆ˜์‹ ๋œ ์™ธ๋ถ€ IP:

๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 
6 ๋‹จ๊ณ„. GitLab์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

$ helm repo add gitlab https://charts.gitlab.io
$ helm upgrade gitlab gitlab/gitlab -n gitlab  --install -f gitlab/values.yml --set "global.hosts.domain=gitlab.$EXTERNAL_IP.nip.io"

๋‹ค์‹œ ๋ชจ๋“  ํฌ๋“œ๊ฐ€ ์ƒ์Šนํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

kubectl get po -n gitlab
NAME                                      	READY   STATUS  	RESTARTS   AGE
gitlab-gitaly-0                           	0/1 	Pending 	0      	0s
gitlab-gitlab-exporter-88f6cc8c4-fl52d    	0/1 	Pending 	0      	0s
gitlab-gitlab-runner-6b6867c5cf-hd9dp     	0/1 	Pending 	0      	0s
gitlab-gitlab-shell-55cb6ccdb-h5g8x       	0/1 	Init:0/2	0      	0s
gitlab-migrations.1-2cg6n                 	0/1 	Pending 	0      	0s
gitlab-minio-6dd7d96ddb-zd9j6             	0/1 	Pending 	0      	0s
gitlab-minio-create-buckets.1-bncdp       	0/1 	Pending 	0      	0s
gitlab-postgresql-0                       	0/2 	Pending 	0      	0s
gitlab-prometheus-server-6cfb57f575-v8k6j 	0/2 	Pending 	0      	0s
gitlab-redis-master-0                     	0/2 	Pending 	0      	0s
gitlab-registry-6bd77b4b8c-pb9v9          	0/1 	Pending 	0      	0s
gitlab-registry-6bd77b4b8c-zgb6r          	0/1 	Init:0/2	0      	0s
gitlab-shared-secrets.1-pc7-5jgq4         	0/1 	Completed   0      	20s
gitlab-sidekiq-all-in-1-v1-54dbcf7f5f-qbq67   0/1 	Pending 	0      	0s
gitlab-task-runner-6fd6857db7-9x567       	0/1 	Pending 	0      	0s
gitlab-webservice-d9d4fcff8-hp8wl         	0/2 	Pending 	0      	0s
Waiting gitlab
./wait_gitlab.sh ../internal/gitlab/gitlab/.pods
waiting for pod...
waiting for pod...
waiting for pod...

๊ผฌํˆฌ๋ฆฌ ์žฅ๋ฏธ :

๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 
7 ๋‹จ๊ณ„. ์šฐ๋ฆฌ๋Š” GitLab ํ† ํฐ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๋กœ๊ทธ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋ณด์„ธ์š”.

kubectl get secret -n gitlab gitlab-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 --decode

์ด์ œ ๋กœ๊ทธ์ธํ•˜์—ฌ ํ† ํฐ์„ ๋ฐ›์œผ์„ธ์š”.

python3 get_gitlab_token.py root $GITLAB_PASSWORD http://gitlab.gitlab.$EXTERNAL_IP.nip.io

8 ๋‹จ๊ณ„. Gitlab Provider๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Git ์ €์žฅ์†Œ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

cd ../internal/gitlab/hierarchy && terraform apply -input=false -auto-approve planfile

๋ถˆํ–‰ํ•˜๊ฒŒ๋„ Terraform GitLab ๊ณต๊ธ‰์ž๋Š” ๋ถ€๋™ ๋ฒ„๊ทธ. ๊ทธ๋Ÿฐ ๋‹ค์Œ tf.state๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์ถฉ๋Œํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ `$make all` ๋ช…๋ น์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์„ธ์š”.

9 ๋‹จ๊ณ„. ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

$ make push

[master (root-commit) b61d977]  Initial commit
 3 files changed, 46 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 values.yml
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 770 bytes | 770.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)

์™„๋ฃŒ :

๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 
๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 
๋‹ญ๊ณ ๊ธฐ ๋˜๋Š” ๊ณ„๋ž€: IaC ๋ถ„ํ• 

๊ฒฐ๋ก 

์šฐ๋ฆฌ๋Š” ๋กœ์ปฌ ๋จธ์‹ ์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ์„ ์–ธ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ๋ชจ๋“  ์ž‘์—…์„ CI๋กœ ์ „์†กํ•˜๊ณ  ๋ฒ„ํŠผ๋งŒ ๋ˆ„๋ฅด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋กœ์ปฌ ์ƒํƒœ(Terraform ์ƒํƒœ)๋ฅผ CI๋กœ ์ด์ „ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ๋ถ€๋ถ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ตฌ๋… ๋ธ”๋กœ๊ทธ์ƒˆ๋กœ์šด ๊ธฐ์‚ฌ์˜ ์ถœ์‹œ๋ฅผ ๋†“์น˜์ง€ ์•Š๋„๋ก!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€