æŽæ°æ¥ïŒ2025幎6æ12æ¥
45åã§èªããŸã
䜿çšããGitLabã¯ãŒã¯ãããŒãæå°éã«æãã€ã€ãè€æ°ã®ç°å¢ïŒäºåã®æºåãªãã«äžæçã«å©çšã§ããsandboxãªã©ïŒãžã®ç¶ç¶çãããã€ã管çããæ¹æ³ã解説ããŸãã

DevSecOpsããŒã ã§ã¯ãè€æ°ã®ç°å¢ã«ãŸãããç¶ç¶çãããã€ã管çããæ©èœãå¿ èŠãšãªãããšããããŸãããã®å Žåãã¯ãŒã¯ãããŒã倿Žããã«ããããã€ãè¡ããããã«ããå¿ èŠããããŸããGitLab DevSecOpsãã©ãããã©ãŒã ãªããäºåã®æºåãªãã«äžæçã«å©çšã§ããsandboxã䜿çšããŠå·¥æ°ãæå°éã«æããã¢ãããŒããªã©ãéããŠãããããããŒãºã«å¯Ÿå¿ã§ããŸãããã®èšäºã§ã¯ãTerraformã䜿ã£ãŠè€æ°ã®ç°å¢äžã§ã€ã³ãã©ã®ç¶ç¶çãããã€ãè¡ãæ¹æ³ã«ã€ããŠã玹ä»ããŸãã
ãã®ææ³ã¯ãPulumiãAnsibleã®ãããªå¥ã®æè¡ã䜿çšããInfrastructure as CodeïŒIaCïŒã§ããã©ã®ãããªèšèªã§æžããããœãŒã¹ã³ãŒãã§ãããŸãã¯å€æ§ãªèšèªãæ··åšããã¢ãã¬ãã§ãã£ãŠãããããããããžã§ã¯ãã«ç°¡åã«é©çšã§ããŸãã
ãã®ãã¥ãŒããªã¢ã«ã®çµäºæã«ã¯ã以äžã®ãããªç°å¢ããããã€ãããã€ãã©ã€ã³ã宿ããŸãã
ãã®èšäºã§äœ¿çšããããããŒãã£ãŒãã®èª¬æã¯ä»¥äžã®ãšããã§ãã
- è§ãäžžãããã¯ã¹ã¯GitLabãã©ã³ãã§ãã
- åè§ã®ããã¯ã¹ã¯ç°å¢ã§ãã
- ç¢å°äžã®ããã¹ãã¯ãããããã¯ã¹ããæ¬¡ã®ããã¯ã¹ãžã®ã¢ã¯ã·ã§ã³ãæããŸãã
- ã²ã圢ã®ããã¯ã¹ã¯æ±ºå®ã¹ãããã§ãã
flowchart LR
A(main) -->|æ°æ©èœ| B(feature_X)
B -->|èªåãããã€| C[review/feature_X]
B -->|ããŒãž| D(main)
C -->|ç Žæ£| D
D -->|èªåãããã€| E[integration]
E -->|æå| F[qa]
D -->|ã¿ã°ä»ã| G(X.Y.Z)
F -->|æ€èšŒ| G
G -->|èªåãããã€| H[staging]
H -->|æå| I{plan}
I -->|æå| J[production]
ã¹ãããããšã«ãçç±ãšè¡ãããšã説æããäžã§ãæ¹æ³ãã玹ä»ããŸããããã«ããããã®ãã¥ãŒããªã¢ã«ãå®å šã«çè§£ããæ£ç¢ºã«å®è¡ãããããªããŸãã
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã¯ã»ãŒäºå®äžã®æ¥çæšæºãšèšããŸããã»ãšãã©ã®äŒæ¥ã¯ãCIãã€ãã©ã€ã³ãå®è£ æžã¿ã§ãããããã®å®è·µã®æšæºåãæ€èšããŠããŸãã
ãŸããCIãã€ãã©ã€ã³ã®æåŸã«ãªããžããªãŸãã¯ã¬ãžã¹ããªã«ã¢ãŒãã£ãã¡ã¯ããããã·ã¥ããç¶ç¶çãªããªããªãŒãäžè¬çã§ãã
ç¶ç¶çãããã€ã¡ã³ãã¯ããã«é²ãã§ããããã®ã¢ãŒãã£ãã¡ã¯ããèªåçã«ãããã€ããŸããããã®æ®åã¯ãŸã éå®çã§ããå°å ¥ãããŠããå Žåãäž»ã«ã¢ããªã±ãŒã·ã§ã³åéã§èŠãããŸããã€ã³ãã©ã®ç¶ç¶çãããã€ã¡ã³ãã«é¢ããŠã¯ãç¶æ³ãããäžæçã§ãè€æ°ã®ç°å¢ã®ç®¡çã«éãã眮ãããåŸåããããŸããäžæ¹ã§ãã€ã³ãã©ã®ã³ãŒãããã¹ãããã»ãã¥ãªãã£ã確ä¿ããæ€èšŒããããšã¯ããé£ãããšãããŠããŸãããã®åéã¯ãDevOpsããŸã æçã«è³ã£ãŠããªãåéã®ã²ãšã€ã§ããã»ãã®åéãšããŠã¯ãã»ãã¥ãªãã£ã®ã·ããã¬ãããæããããŸããå ·äœçã«ã¯ãã»ãã¥ãªãã£ããŒã ã®ä»å ¥ãããã«éèŠãªããšã«ãã»ãã¥ãªãã£äžã®ãªã¹ã¯ãžã®å¯Ÿå¿ãããªããªãŒã©ã€ããµã€ã¯ã«ã®æ©æã«çµã¿èŸŒã¿ãDevOpsããDevSecOpsãžãšçºå±ãããåãçµã¿ã®ããšã§ãã
ãã®ãããªæŠæ³ãèžãŸããæ¬ãã¥ãŒããªã¢ã«ã§ã¯ãã€ã³ãã©ã«DevSecOpsãã·ã³ãã«ãã€å¹æçã«å°å ¥ããã·ããªãªã«åãçµã¿ãŸãã5ã€ã®ç°å¢ã«ãªãœãŒã¹ããããã€ããäŸã亀ããªãããéçºããæ¬çªç°å¢ãžã𿮵éçã«é²ããŠãããŸãã
泚ïŒå人çã«ã¯FinOpsã¢ãããŒããæ¡çšããç°å¢ã®æ°ãæžããããšãæšå¥šããŠããŸãããéçºç°å¢ãã¹ããŒãžã³ã°ç°å¢ãæ¬çªç°å¢ä»¥å€ã®ç°å¢ãä¿æãã¹ãå ŽåããããŸãããã®ãããããããã玹ä»ããäŸããèªèº«ã®ããŒãºã«åãããŠèª¿æŽããŠãã ããã
ã¯ã©ãŠãæè¡ã®å°é ã«ãããIaCã®å©çšãä¿é²ãããŠããŸãããã®åéãæåã«éæããã®ã¯ãAnsibleãšTerraformã§ãããOpenTofuãPulumiãAWS CDKãGoogle Deploy Managerãå§ããšããå€ãã®äŒç€Ÿããã®åŸã«ç¶ããŸããã
IaCãå®çŸ©ããããšã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ãå®å šã«ãããã€ããã®ã«æé©ãªãœãªã¥ãŒã·ã§ã³ã§ããç®æšãéæã§ãããŸã§å¿ èŠãªã ãããã¹ãããããã€ãåå®è¡ãç¹°ãè¿ãè¡ããŸãã
æ®å¿µãªããšã«ãã¿ãŒã²ããç°å¢ããšã«è€æ°ã®ãã©ã³ãããªããžããªãä¿æããŠããäŒæ¥ããããããŸãããããåå ã§åé¡ãçããŸãããããã£ãäŒæ¥ã§ã¯ãããã»ã¹ã®å®æœã培åºãããŠããŸãããæ¬çªç°å¢ã®ã³ãŒãããŒã¹ãžã®å€æŽãããã®åã®ç°å¢ã§æ£ãããã¹ããããŠãããã©ããã確èªã§ããŸããããã®çµæãããç°å¢ããå¥ã®ç°å¢ãžæµããã ãã«ãªããŸãã
ãã®ãã¥ãŒããªã¢ã«ãå¿ èŠã ãšæ°ã¥ããã®ã¯ãããã«ã³ãã¡ã¬ã³ã¹ã«åå ããéã«ãæ¬çªç°å¢ãžã®ãããã€åã«ã€ã³ãã©ã¹ãã©ã¯ãã£ãååã«ãã¹ãããã¯ãŒã¯ãããŒããªããšåå è å šå¡ããèãããšãã§ããã¿ãªããæ¬çªç°å¢ã§çŽæ¥ã³ãŒãã«ããããé©çšããããšããããšèšã£ãŠããŸããã確ãã«ãã®æ¹æ³ã¯æã£åãæ©ãã§ãããæãããŠå®å šã§ããããïŒåã®ç°å¢ã«ãã£ãŒãããã¯ãã©ãæ»ãã®ã§ããããïŒãŸã坿¬¡å¹æãçããªãããã«ããã«ã¯ã©ãããã°ããã®ã§ããããïŒæ°ããªè匱æ§ãæ¬çªç°å¢ã«ããŸãã«ãæ©ãããã·ã¥ãããããšã§äŒç€Ÿããªã¹ã¯ã«ãããããªãããã«ããã«ã¯ãã©ã®ããã«ç®¡çãã¹ãã§ããããïŒ
ããã§éèŠãªã®ã¯ãDevOpsããŒã ãæ¬çªç°å¢ã«çŽæ¥ãããã€ããã®ã¯ãªãããšããããšã§ãããã€ãã©ã€ã³ã®å¹çæ§ãé床ãåäžã§ããå¯èœæ§ãããããã§ããããïŒèªååã§ããªãã®ã§ããããïŒããã©ããããæ¬çªç°å¢ä»¥å€ã§æ£ç¢ºã«ãã¹ãããæ¹æ³ããªããããªã®ã§ããããïŒ
次ã®ã»ã¯ã·ã§ã³ã§ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ãèªååããã»ãã®äººã«åœ±é¿ãåãŒãç°å¢ã«ã³ãŒããããã·ã¥ãããåã«ãDevOpsããŒã ã广çãã€ç¢ºå®ã«ãã¹ãã宿œããããã®æ¹æ³ãã説æããŸãããŸããã³ãŒããã©ã®ããã«ä¿è·ããããšã³ãããŒãšã³ãã§ãããã€ã管çãããŠãããã確èªããŠãããŸãã
åè¿°ã®ãšãããçŸåšã§ã¯å€ãã®IaCèšèªãååšããŠããããããã®èšäºã ãã§å®¢èгçã«ãã¹ãŠãåãäžããããšã¯ã§ããŸããããã®ããããã®èšäºã§ã¯ããŒãžã§ã³1.4ã§å®è¡ãããåºæ¬çãªTerraformã³ãŒãã䜿çšããŸããIaCèšèªãã®ãã®ã§ã¯ãªãã貎瀟ã®ãšã³ã·ã¹ãã ã«é©çšã§ããããã»ã¹ã«æ³šç®ããŠãã ããã
ãŸãã¯ãåºæ¬çãªTerraformã³ãŒãããå§ããŸãããã
ä»®æ³ãããã¯ãŒã¯ã§ããAWSã®ä»®æ³ãã©ã€ããŒãã¯ã©ãŠãïŒVPCïŒã«ãããã€ããããšæããŸããVPCã«ã¯ããããªãã¯ãµãããããšãã©ã€ããŒããµããããããããã€ããŸããååãããããããã«ããããã¯ã¡ã€ã³VPCã®ãµããããã§ããæåŸã«ããããªãã¯ãµããããã«Amazon Elastic Cloud ComputeïŒEC2ïŒã€ã³ã¹ã¿ã³ã¹ïŒä»®æ³ãã·ã³ïŒã远å ããŸãã
ããã¯ãæ¯èŒçç°¡åãªæ¹æ³ã§4ã€ã®ãªãœãŒã¹ããããã€ããæ¹æ³ã瀺ããŠããŸããã³ãŒãã§ã¯ãªãããã€ãã©ã€ã³ã«çŠç¹ãåœãŠãããšãããã§ã®ç®çã§ãã
ããã§ç®æããªããžããªã®å®æåœ¢ã¯ã以äžã®ãšããã§ãã

ã¹ãããããšã«è¡ã£ãŠãããŸãããã
ãŸãã¯ãterraform/main.tfãã¡ã€ã«ã§ãªãœãŒã¹ããã¹ãŠå®£èšããŸãã
provider "aws" {
region = var.aws_default_region
}
resource "aws_vpc" "main" {
cidr_block = var.aws_vpc_cidr
tags = {
Name = var.aws_resources_name
}
}
resource "aws_subnet" "public_subnet" {
vpc_id = aws_vpc.main.id
cidr_block = var.aws_public_subnet_cidr
tags = {
Name = "Public Subnet"
}
}
resource "aws_subnet" "private_subnet" {
vpc_id = aws_vpc.main.id
cidr_block = var.aws_private_subnet_cidr
tags = {
Name = "Private Subnet"
}
}
resource "aws_instance" "sandbox" {
ami = var.aws_ami_id
instance_type = var.aws_instance_type
subnet_id = aws_subnet.public_subnet.id
tags = {
Name = var.aws_resources_name
}
}
ã芧ã®ãšããããã®ã³ãŒãã§ã¯ããã€ãã®å€æ°ãå¿
èŠãšãªããããterraform/variables.tfãã¡ã€ã«ã§ãããã宣èšããŸãã
variable "aws_ami_id" {
description = "The AMI ID of the image being deployed."
type = string
}
variable "aws_instance_type" {
description = "The instance type of the VM being deployed."
type = string
default = "t2.micro"
}
variable "aws_vpc_cidr" {
description = "The CIDR of the VPC."
type = string
default = "10.0.0.0/16"
}
variable "aws_public_subnet_cidr" {
description = "The CIDR of the public subnet."
type = string
default = "10.0.1.0/24"
}
variable "aws_private_subnet_cidr" {
description = "The CIDR of the private subnet."
type = string
default = "10.0.2.0/24"
}
variable "aws_default_region" {
description = "Default region where resources are deployed."
type = string
default = "eu-west-3"
}
variable "aws_resources_name" {
description = "Default name for the resources."
type = string
default = "demo"
}
ãã§ã«IaCåŽã«é¢ããŠã¯ãããã§ã»ãŒæºåãæŽããŸãããããããªãããããã§ã¯Terraformã®ç¶æ ãå ±æã§ããŸããããåç¥ãªãæ¹ã®ããã«å€§ãŸãã«èª¬æãããšãTerraformã¯ä»¥äžãè¡ãããšã§åäœããŸãã
planã«ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã®çŸåšã®ç¶æ
ãšã³ãŒãã§å®çŸ©ãããŠããå
容ã®å·®åã確èªããŠãããå·®åãåºåããŸããapplyã«ãããplanã®å·®åãé©çšããŠãç¶æ
ãæŽæ°ããŸããæåã®ã©ãŠã³ãã§ã¯ç¶æ ã¯ç©ºã§ããã®åŸãTerraformã«ãã£ãŠé©çšããããªãœãŒã¹ã®è©³çްïŒIDãªã©ïŒãæ¿å ¥ãããŸãã
åé¡ã¯ããã®ç¶æ ãã©ãã«ä¿åãããããšããããšã§ãããŸããè€æ°ã®ããããããŒãã³ãŒãäžã§å ±åäœæ¥ãè¡ããããã«ããã«ã¯ã©ãããã°ããã®ã§ããããïŒ
解決çã¯ãšãŠãç°¡åã§ãGitLabãå©çšããŠãTerraform HTTPããã¯ãšã³ããä»ããŠç¶æ ãä¿åããŠå ±æããã ãã§ãã
ãã®ããã¯ãšã³ãã䜿çšããã«ã¯ããŸãã¯ãã£ãšãã·ã³ãã«ãªterraform/backend.tfãã¡ã€ã«ãäœæããŸããæ¬¡ã®ã¹ãããã¯ããã€ãã©ã€ã³ã§åŠçããŸãã
terraform {
backend "http" {
}
}
ããã§ã4ã€ã®ãªãœãŒã¹ããããã€ããããã®æäœéã®Terraformã³ãŒããã§ãããããŸããã倿°ã®å€ã¯å®è¡ããéã«æå®ããã®ã§ãåŸã§ã説æããŸãã
ãããã以äžã®ã¯ãŒã¯ãããŒãå®è£ ããŸãã
flowchart LR
A(main) -->|æ°æ©èœ| B(feature_X)
B -->|èªåãããã€| C[review/feature_X]
B -->|ããŒãž| D(main)
C -->|ç Žæ£| D
D -->|èªåãããã€| E[integration]
E -->|æå| F[qa]
D -->|ã¿ã°ä»ã| G(X.Y.Z)
F -->|æ€èšŒ| G
G -->|èªåãããã€| H[staging]
H -->|æå| I{plan}
I -->|æå| J[production]
review/feature_branchã«ç¶ç¶çã«ãããã€ãããŸããããã¯ãããããããŒãšéçšããŒã ã誰ã«ã圱é¿ãäžããããšãªãã³ãŒãããã¹ãã§ããå®å
šãªç°å¢ã§ãããŸããããã§ã³ãŒãã¬ãã¥ãŒãã¹ãã£ããŒã®å®è¡ãªã©ã®ããã»ã¹ã宿œããã³ãŒãã®å質ãšã»ãã¥ãªãã£ã蚱容ç¯å²å
ã§ããããšã確èªããè³ç£ãå±éºã«ãããããããšã®ãªãããã«ããŸãããã®ãã©ã³ãã§ãããã€ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ããã©ã³ããéãããããšèªåçã«ç Žæ£ãããŸããããã«ããäºç®ç¯å²å
ã«åãããããªããŸãã
flowchart LR
A(main) -->|æ°æ©èœ| B(feature_X)
B -->|èªåãããã€| C[review/feature_X]
B -->|ããŒãž| D(main)
C -->|ç Žæ£| D
integrationç°å¢ã§ãããã®ç°å¢ãããå°ãå®å®ãããããã«ãåé€ã¯èªååãããŠããããæåã§ããªã¬ãŒã§ããããã«ãªã£ãŠããŸãã
flowchart LR
D(main) -->|èªåãããã€| E[integration]
qaç°å¢ã«ãããã€ãããŸããããã§ãã€ãã©ã€ã³ããã®åé€ãé²ãã«ãŒã«ãèšå®ããŸããäœãããã§ã«3ã€ç®ã®ãã®ç°å¢ã¯ããªãå®å®ããŠããã¯ããªã®ã§ããã®ã«ãŒã«ã¯èª€ã£ãŠåé€ãããã®ãé²ãããšãç®çãšããŸãã貎瀟ã®ããã»ã¹ã«åãããŠãã奜ããªãããªã«ãŒã«ã調æŽããŠãã ããã
flowchart LR
D(main)-->|èªåãããã€| E[integration]
E -->|æå| F[qa]
stagingç°å¢ãžã®ãããã€ãå³åº§ã«ããªã¬ãŒãããŸãã
flowchart LR
D(main) -->|ã¿ã°ä»ã| G(X.Y.Z)
F[qa] -->|æ€èšŒ| G
G -->|èªåãããã€| H[staging]
productionã«å°éããŸãããã€ã³ãã©ã¹ãã©ã¯ãã£ã«é¢ããŠèšããšãïŒ10%ã25%ãªã©ïŒæ®µéçã«ãããã€ããã®ã¯é£ããå Žåãå€ããããã€ã³ãã©ã¹ãã©ã¯ãã£å
šäœããããã€ããŸãããã ãããã®æåŸã®ã¹ãããã§è¡ãæåããªã¬ãŒã§ããã®ãããã€ãå¶åŸ¡ããŸãããããŠããã®æ¥µããŠéèŠãªç°å¢ãæå€§éã«å¶åŸ¡ã§ããããã«ããããã«ãä¿è·ç°å¢ãšããŠç®¡çããŸãã
flowchart LR
H[staging] -->|æå| I{plan}
I -->|æå| J[production]
äžèšã®ã¯ãŒã¯ãããŒãå®è£ ããããã«ã2ã€ã®ããŠã³ã¹ããªãŒã ãã€ãã©ã€ã³ãšãšãã«ãã€ãã©ã€ã³ãæ§ç¯ããŸãã
ãŸãã¯ãã¡ã€ã³ãã€ãã©ã€ã³ããå§ããŸããããã¡ã€ã³ãã€ãã©ã€ã³ã¯ããã£ãŒãã£ãŒãã©ã³ããžã®ããã·ã¥ãããã©ã«ããã©ã³ããžã®ããŒãžããŸãã¯ã¿ã°ä»ããçºçãããšãå¿
ãèªåçã«ããªã¬ãŒãããŸãããã®ãã€ãã©ã€ã³ã«ãã£ãŠãdevãintegrationãstagingç°å¢ã«å¯Ÿããçã®ç¶ç¶çãããã€ãå®çŸã§ããŸãããããžã§ã¯ãã®ã«ãŒãã«ãã.gitlab-ci.ymlãã¡ã€ã«ã§å®£èšããŸãã

Stages:
- test
- environments
.environment:
stage: environments
variables:
TF_ROOT: terraform
TF_CLI_ARGS_plan: "-var-file=../vars/$variables_file.tfvars"
trigger:
include: .gitlab-ci/.first-layer.gitlab-ci.yml
strategy: depend # Wait for the triggered pipeline to successfully complete
forward:
yaml_variables: true # Forward variables defined in the trigger job
pipeline_variables: true # Forward manual pipeline variables and scheduled pipeline variables
review:
extends: .environment
variables:
environment: review/$CI_COMMIT_REF_SLUG
TF_STATE_NAME: $CI_COMMIT_REF_SLUG
variables_file: review
TF_VAR_aws_resources_name: $CI_COMMIT_REF_SLUG # Used in the tag Name of the resources deployed, to easily differenciate them
rules:
- if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
integration:
extends: .environment
variables:
environment: integration
TF_STATE_NAME: $environment
variables_file: $environment
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
staging:
extends: .environment
variables:
environment: staging
TF_STATE_NAME: $environment
variables_file: $environment
rules:
- if: $CI_COMMIT_TAG
#### TWEAK
# This tweak is needed to display vulnerability results in the merge widgets.
# As soon as this issue https://gitlab.com/gitlab-org/gitlab/-/issues/439700 is resolved, the `include` instruction below can be removed.
# Until then, the SAST IaC scanners will run in the downstream pipelines, but their results will not be available directly in the merge request widget, making it harder to track them.
# Note: This workaround is perfectly safe and will not slow down your pipeline.
include:
- template: Security/SAST-IaC.gitlab-ci.yml
#### END TWEAK
ãã®ãã€ãã©ã€ã³ã¯ãtestãšenvironmentsã®2ã€ã®ã¹ããŒãžã®ã¿ãå®è¡ããŸããåè
ã¯ã*TWEAKïŒåŸ®èª¿æŽïŒ*ã«ãããã¹ãã£ããŒãå®è¡ããããã«å¿
èŠã§ããåŸè
ã§ã¯ãäžèšã§å®çŸ©ããã±ãŒã¹ïŒãã©ã³ããžã®ããã·ã¥ãããã©ã«ããã©ã³ããžã®ããŒãžãã¿ã°ä»ãïŒããšã«ç°ãªã倿°ã»ãããæã€åãã€ãã©ã€ã³ãããªã¬ãŒãããŸãã
ããã§åãã€ãã©ã€ã³ã«strategy:dependããŒã¯ãŒãã§äŸåã远å ããŸããããã«ããããããã€ã®å®äºåŸã«GitLabã®ãã€ãã©ã€ã³ãã¥ãŒãæŽæ°ãããŸãã
ã芧ã®ãšããããŒã¹ãšãªããžã§ããç¡å¹ã«ãªãããã«å®çŸ©ããç¹å®ã®å€æ°ãšã«ãŒã«ã§æ¡åŒµããŠãã¿ãŒã²ããç°å¢ããšã«åäžã®ãããã€ã¡ã³ãã ããããªã¬ãŒãããããã«ããŠããŸãã
å®çŸ©æžã¿å€æ°ã«å ããå®çŸ©ããå¿ èŠãããæ°ããª2ã€ã®ãšã³ããªã䜿çšããŸãã
../vars/$variables_file.tfvars.gitlab-ci/.first-layer.gitlab-ci.ymlã§å®çŸ©ãŸãã¯ãç°¡åãªæ¹ãã€ãŸã倿°ã®å®çŸ©ããå§ããŸãããã
ããã§ã¯ã2ã€ã®ãœãªã¥ãŒã·ã§ã³ãçµã¿åãããŠTerraformã«å€æ°ãæäŸããŸãã

TF_VARãä»ããç°å¢å€æ°ã䜿çšããæ¹æ³ã§ãã倿°ãæ¿å
¥ãããã®2ã€ç®ã®æ¹æ³ã¯ã倿°ããã¹ã¯ããä¿è·ããããã«ã¹ã³ãŒãã®ç°å¢ãèšå®ããGitLabã®æ©èœãšãé¢ä¿ãããæ©å¯æ
å ±ã®æŒãããé²ã匷åãªãœãªã¥ãŒã·ã§ã³ã§ãïŒæ¬çªç°å¢ã®ãã©ã€ããŒãClassless Inter-Domain RoutingïŒCIDRïŒã§éåžžã«æ©å¯æ§ãé«ãããŒã¿ãããåããããšèããããå Žåã¯ããã®æ¹æ³ã§ä¿è·ããã°ãæ¬çªç°å¢ãããã³ä¿è·ãã©ã³ããã¿ã°ã«å¯ŸããŠå®è¡ããããã€ãã©ã€ã³ã§ã®ã¿å©çšã§ããããã«ãããžã§ãã®ãã°ã§ãã®å€ããã¹ã¯ãããããã«ããããšãã§ããŸãïŒã
ãŸããå倿°ãã¡ã€ã«ã倿Žã§ãããŠãŒã¶ãŒãèšå®ããããã«ãCODEOWNERSãã¡ã€ã«ã§å倿°ãã¡ã€ã«ã管çããå¿
èŠããããŸãã
[Production owners]
vars/production.tfvars @operations-group
[Staging owners]
vars/staging.tfvars @odupre @operations-group
[CodeOwners owners]
CODEOWNERS @odupre
ãã®èšäºã¯ãTerraformã®ãã¬ãŒãã³ã°çšã§ã¯ãªãããã詳ãã説æãããããã§ã¯vars/review.tfvarsãã¡ã€ã«ã玹ä»ããã ãã«çããŸããåœç¶ãªãããããã«ç¶ãç°å¢ãã¡ã€ã«ãã»ãŒåãã§ããããã§ã¯æ©å¯æ§ã®äœã倿°ãšãã®å€ãèšå®ããã ãã§ãã
aws_vpc_cidr = "10.1.0.0/16"
aws_public_subnet_cidr = "10.1.1.0/24"
aws_private_subnet_cidr = "10.1.2.0/24"
å®éã®äœæ¥ã¯ãã®ãã€ãã©ã€ã³å ã§è¡ãããŸãããã®ãããæåã®ãã€ãã©ã€ã³ãããå°ãè€éã§ããããããªãããåãåãããã°äœã§ãä¹ãè¶ããããŸãïŒ
ã¡ã€ã³ãã€ãã©ã€ã³ã®å®çŸ©ã§èª¬æããããã«ãããŠã³ã¹ããªãŒã ãã€ãã©ã€ã³ã¯.gitlab-ci/.first-layer.gitlab-ci.ymlã§å®£èšãããŠããŸãã

å°ããªã¹ãããã«åããŠèª¬æããŸããæåŸã«å šäœåãèŠããã¯ãã§ãã
ãŸãã¯ãTerraformã®ãã€ãã©ã€ã³ãå®è¡ããããšæããŸããGitLabã¯ãªãŒãã³ãœãŒã¹ã§ãããããTerraformçšã®ãã³ãã¬ãŒãããªãŒãã³ãœãŒã¹ã§ãããã®ããããã®ãã³ãã¬ãŒããå«ããã ãã§æžã¿ãŸãã以äžã®ã¹ããããã䜿çšããŠè¡ããŸãã
include:
- template: Terraform.gitlab-ci.yml
ãã®ãã³ãã¬ãŒãã¯ãplanãšapplyãè¡ãããåã«ãTerraformã«ãããã©ãŒãããã®ãã§ãã¯ãšã³ãŒãã®æ€èšŒãå®è¡ããŸãããããã€ãããã®ãç Žæ£ããããšãã§ããŸãã
ããã«ãGitLabã¯çµ±åãããåäžã®DevSecOpsãã©ãããã©ãŒã ã§ããããããã®ãã³ãã¬ãŒãå ã«2ã€ã®ã»ãã¥ãªãã£ã¹ãã£ããŒãèªåçã«çµã¿èŸŒã¿ãã³ãŒãå ã®æœåšçãªè åšãæ€åºããæ¬¡ã®ç°å¢ã«ãããã€ãããåã«èŠåãçºããŸãã
ããã§ã³ãŒãã®ç¢ºèªãä¿è·ããã«ãããããã€ãå®äºããã®ã§ãããã€ãã®äŸ¿å©ãªæãã玹ä»ããŸãã
ãžã§ãã®çµæããã£ãã·ã¥ããŠãåŸç¶ã®ãã€ãã©ã€ã³ãžã§ãã§åå©çšããŸããããã¯ãšãŠãç°¡åã§ã以äžã®ã³ãŒãã远å ããã ãã§è¡ããŸãã
default:
cache: # Use a shared cache or tagged runners to ensure terraform can run on apply and destroy
- key: cache-$CI_COMMIT_REF_SLUG
fallback_keys:
- cache-$CI_DEFAULT_BRANCH
paths:
- .
ããã§ã¯ãã³ãããããšã«ç°ãªããã£ãã·ã¥ãå®çŸ©ããå¿ èŠã«å¿ããŠmainãã©ã³ãåã«ãã©ãŒã«ããã¯ããããã«ããŸãã
䜿çšããŠãããã³ãã¬ãŒããããèŠããšããžã§ãã®å®è¡ã¿ã€ãã³ã°ãå¶åŸ¡ããã«ãŒã«ãããããšãããããŸããå šãã©ã³ãã§ãã¹ãŠã®å¶åŸ¡ïŒQAãšã»ãã¥ãªãã£ã®äž¡æ¹ïŒãå®è¡ããããšæããŸãããã®ãããæ¬¡ã«ãããã®èšå®ãäžæžãããŸãã
GitLabãã³ãã¬ãŒãã¯åŒ·åãªæ©èœã§ããã³ãã¬ãŒãã®äžéšã®ã¿ãäžæžãã§ããŸããå質ãã§ãã¯ãšã»ãã¥ãªãã£ãã§ãã¯ãå¿ ãå®è¡ããããããäžéšã®ãžã§ãã®ã«ãŒã«ãäžæžãããããšæããŸãããããã®ãžã§ãåãã«å®çŸ©ãããã®ä»ãã¹ãŠã¯ããã³ãã¬ãŒãã§å®çŸ©ãããå 容ã®ãŸãŸã«ããŸãã
fmt:
rules:
- when: always
validate:
rules:
- when: always
kics-iac-sast:
rules:
- when: always
iac-sast:
rules:
- when: always
ããã§å質ãšã»ãã¥ãªãã£ã®å¶åŸ¡ã宿œã§ãããããã¯ãŒã¯ãããŒå ã®ã¡ã€ã³ã®ç°å¢ïŒintegrationãšstagingïŒãšreviewç°å¢ã®åäœã«éããä»ããããšæããŸãããŸãã¯ã¡ã€ã³ã®ç°å¢ã®æ¯ãèããå®çŸ©ããreviewç°å¢çšã«ãã®èšå®ã埮調æŽããŠãããŸãããã
åè¿°ã®ããã«ããã®2ã€ã®ç°å¢ã«mainãã©ã³ããšã¿ã°ããããã€ãããããããã®ããã«å¶åŸ¡ããã«ãŒã«ãbuildãšdeployã®äž¡æ¹ã®ãžã§ãã«è¿œå ããŸãããããŠãintegrationç°å¢ã§ã®ã¿destroyãæå¹ã«ããŸããstagingç°å¢ã¯éèŠåºŠãé«ããããã¯ã³ã¯ãªãã¯ã§åé€ã§ããªãããã«ããŸãããã®æäœã¯ãšã©ãŒãåŒãèµ·ããããããé¿ããããšèããŠããŸãã
æåŸã«ãdeployãžã§ããdestroyãžã§ãã«ãªã³ã¯ããŠãGitLab GUIããçŽæ¥ç°å¢ãstopã§ããããã«ããŸãã
ããã§äœ¿çšããGIT_STRATEGYã¯ãç Žæ£ããéã«Runnerå
ã®ãœãŒã¹ãã©ã³ãããã³ãŒããååŸãããããšãé²ããŸããããã¯ããã©ã³ããæåã§åé€ãããå Žåã¯å€±æããããããã£ãã·ã¥ã䜿çšããŠãTerraformã®åœä»€ãå®è¡ããããã«å¿
èŠãªãã®ãã¹ãŠãååŸããŸãã
build: # terraform plan
environment:
name: $TF_STATE_NAME
action: prepare
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_TAG
deploy: # terraform apply --> automatically deploy on corresponding env (integration or staging) when merging to default branch or tagging. Second layer environments (qa and production) will be controlled manually
environment:
name: $TF_STATE_NAME
action: start
on_stop: destroy
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_TAG
destroy:
extends: .terraform:destroy
variables:
GIT_STRATEGY: none
dependencies:
- build
environment:
name: $TF_STATE_NAME
action: stop
rules:
- if: $CI_COMMIT_TAG # Do not destroy production
when: never
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $TF_DESTROY == "true" # Manually destroy integration env.
when: manual
åè¿°ã®ãšãããããã¯integrationãšstagingç°å¢ãžã®ãããã€ãšããããŒãºã«å³ããŠããŸããããããªãããããããããŒãã»ãã®äººã«åœ±é¿ãåãŒããã«ãèªåã®ã³ãŒãã«è§ŠããŠæ€èšŒã§ããäžæçãªç°å¢ããŸã äžè¶³ããŠããŸãããã®ãããæ¬¡ã¯reviewç°å¢ãžã®ãããã€ãè¡ããŸãã
reviewç°å¢ãžã®ãããã€ã¯ãintegrationãstagingç°å¢ãžã®ãããã€ãšå€§å·®ã¯ãããŸãããããã§ãããã§ãGitLabã®æ©èœã掻çšããŠããžã§ãå®çŸ©ã®äžéšã®ã¿ãäžæžãããŸãã
ãŸãã¯ããããã®ãžã§ãããã£ãŒãã£ãŒãã©ã³ãã§ã®ã¿å®è¡ãããããã«ãŒã«ãèšå®ããŸãã
次ã«ãdeploy_reviewãžã§ããdestroy_reviewãžã§ãã«ãªã³ã¯ããŸããããã«ãããGitLabãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããæåã§ç°å¢ã忢ã§ããããã«ãªããŸãããããã«éèŠãªã®ã¯ããã£ãŒãã£ãŒãã©ã³ãã®å®äºæã«ç°å¢ã®ç Žæ£ãèªåçã«ããªã¬ãŒãããããã«ãªããŸããããã¯ãéçšã«ãããè²»çšãæããã®ã«å¹æçãªãåªããFinOpsãã©ã¯ãã£ã¹ã§ãã
Terraformã§ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®æ§ç¯æãšåæ§ã«ãç Žæ£ããéã«ãplanãã¡ã€ã«ãå¿
èŠãªãããdestroy_reviewããbuild_reviewã«äŸåã远å ããŠããã®ã¢ãŒãã£ãã¡ã¯ããååŸããŸãã
æåŸã«ãã芧ã®ãšãããç°å¢ã®ååã$environmentã«èšå®ããŸããããã¯ãã¡ã€ã³ãã€ãã©ã€ã³ã§review/$CI_COMMIT_REF_SLUGã«èšå®ãããtrigger:forward:yaml_variables:trueãšããåœä»€ã«ããããã®åãã€ãã©ã€ã³ã«è»¢éãããŸãã
build_review:
extends: build
rules:
- if: $CI_COMMIT_TAG
when: never
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
when: on_success
deploy_review:
extends: deploy
dependencies:
- build_review
environment:
name: $environment
action: start
on_stop: destroy_review
# url: https://$CI_ENVIRONMENT_SLUG.example.com
rules:
- if: $CI_COMMIT_TAG
when: never
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
when: on_success
destroy_review:
extends: destroy
dependencies:
- build_review
environment:
name: $environment
action: stop
rules:
- if: $CI_COMMIT_TAG # Do not destroy production
when: never
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Do not destroy staging
when: never
- when: manual
ããŠããŸãšãããšãããã§æ¬¡ã®ããšãè¡ããã€ãã©ã€ã³ãã§ããŸããã
integrationãžã®ç¶ç¶çãããã€stagingãžã®ç¶ç¶çãããã€ããã«ã¬ã€ã€ã远å ããä»åã¯æåã§ã®ããªã¬ãŒãããšã«qaãšproductionç°å¢ã«ãããã€ãããããã«ããŸãããã
誰ããæ¬çªç°å¢ã«ç¶ç¶çãããã€ãããããã§ã¯ãªããããæ¬¡ã®2ã€ã®ãããã€ã«ã¯æåã«ããæ€èšŒã远å ããŸããåã«CDã®èгç¹ã§èããå Žåããã®ããªã¬ãŒã远å ããããšã¯ãããŸããããã»ãã®ããªã¬ãŒãããžã§ããå®è¡ããæ¹æ³ãåŠã¶æ©äŒãšããŠæããŠãã ããã
ãããŸã§ãããã€ãå®è¡ããéã¯ãå¿ ãã¡ã€ã³ãã€ãã©ã€ã³ããåãã€ãã©ã€ã³ãéå§ããŠããŸããã
ããã©ã«ããã©ã³ããšã¿ã°ããããã«ãããã€ãå®è¡ãããããããããã®è¿œå ã¹ãããçšã«å¥ã®ã¬ã€ã€ã远å ããŸããæ°ããªæé ã¯å¿ èŠãããŸãããã¡ã€ã³ãã€ãã©ã€ã³ã§è¡ã£ãã®ãšãŸã£ããåãããã»ã¹ãå床繰ãè¿ããŸãããã®æ¹æ³ã ãšãå¿ èŠãªæ°ã ãã¬ã€ã€ãæäœã§ããŸããäžã«ã¯æå€§ã§9ã€ã®ç°å¢ãããäŸãèŠãããšããããŸããç°å¢ã®æ°ãæããããšã®å©ç¹ã«ã€ããŠã¯ãããããŠèª¬æããŸãããããã®ããã»ã¹ã䜿çšããããšã§ãåææ®µéããæçµçãªããªããªãŒãŸã§ãåããã€ãã©ã€ã³ãéåžžã«ç°¡åã«å®è£ ã§ããŸãããã®äžããã€ãã©ã€ã³ã®å®çŸ©ãã·ã³ãã«ã«ä¿ã¡ã€ã€ãã³ã¹ãããããã«ç¶æã§ããå°ããªå¡ã«åå²å¯èœã§ãã
ããã§ã¯å€æ°ã®ç«¶åãé²ãããã«ãæ°ããvaråã䜿çšããŠTerraformã®ç¶æ ãšå ¥åãã¡ã€ã«ãèå¥ããŠããŸãã
.2nd_layer:
stage: 2nd_layer
variables:
TF_ROOT: terraform
trigger:
include: .gitlab-ci/.second-layer.gitlab-ci.yml
# strategy: depend # Do NOT wait for the downstream pipeline to finish to mark upstream pipeline as successful. Otherwise, all pipelines will fail when reaching the pipeline timeout before deployment to 2nd layer.
forward:
yaml_variables: true # Forward variables defined in the trigger job
pipeline_variables: true # Forward manual pipeline variables and scheduled pipeline variables
qa:
extends: .2nd_layer
variables:
TF_STATE_NAME_2: qa
environment: $TF_STATE_NAME_2
TF_CLI_ARGS_plan_2: "-var-file=../vars/$TF_STATE_NAME_2.tfvars"
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
production:
extends: .2nd_layer
variables:
TF_STATE_NAME_2: production
environment: $TF_STATE_NAME_2
TF_CLI_ARGS_plan_2: "-var-file=../vars/$TF_STATE_NAME_2.tfvars"
rules:
- if: $CI_COMMIT_TAG
ããã§éèŠãªãã¯ããã¯ã¯ãæ°ããããŠã³ã¹ããªãŒã ãã€ãã©ã€ã³ã«äœ¿çšããstrategyã®èšå®ã§ããtrigger:strategyã¯ããã©ã«ãã®å€ã®ãŸãŸã«ããŠãããŸããããããªããã°ãã¡ã€ã³ãã€ãã©ã€ã³ã¯ãå«ãã€ãã©ã€ã³ãå®äºãããŸã§åŸ
æ©ããããšã«ãªããŸããæåããªã¬ãŒã ãšãéåžžã«é·ãæéãããããã€ãã©ã€ã³ããã·ã¥ããŒããèªã¿ã¥ãããçè§£ãã«ãããªãå¯èœæ§ããããŸãã
ããã§ã€ã³ã¯ã«ãŒããã.gitlab-ci/.second-layer.gitlab-ci.ymlãã¡ã€ã«ãäœãªã®ãçåã«æããæ¹ãããã£ããããããããŸããããã¡ãã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æããŸãã
1ã€ç®ã®ã¬ã€ã€ã®å
šè©³çްïŒ.gitlab-ci/.first-layer.gitlab-ci.ymlã«ä¿åïŒã確èªãããå Žåã¯ã以äžã®ã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
variables:
TF_VAR_aws_ami_id: $AWS_AMI_ID
TF_VAR_aws_instance_type: $AWS_INSTANCE_TYPE
TF_VAR_aws_default_region: $AWS_DEFAULT_REGION
include:
- template: Terraform.gitlab-ci.yml
default:
cache: # Use a shared cache or tagged runners to ensure terraform can run on apply and destroy
- key: cache-$CI_COMMIT_REF_SLUG
fallback_keys:
- cache-$CI_DEFAULT_BRANCH
paths:
- .
stages:
- validate
- test
- build
- deploy
- cleanup
- 2nd_layer # Use to deploy a 2nd environment on both the main branch and on the tags
fmt:
rules:
- when: always
validate:
rules:
- when: always
kics-iac-sast:
rules:
- if: $SAST_DISABLED == 'true' || $SAST_DISABLED == '1'
when: never
- if: $SAST_EXCLUDED_ANALYZERS =~ /kics/
when: never
- when: on_success
iac-sast:
rules:
- if: $SAST_DISABLED == 'true' || $SAST_DISABLED == '1'
when: never
- if: $SAST_EXCLUDED_ANALYZERS =~ /kics/
when: never
- when: on_success
###########################################################################################################
## Integration env. and Staging. env
## * Auto-deploy to Integration on merge to main.
## * Auto-deploy to Staging on tag.
## * Integration can be manually destroyed if TF_DESTROY is set to true.
## * Destroy of next env. is not automated to prevent errors.
###########################################################################################################
build: # terraform plan
environment:
name: $TF_STATE_NAME
action: prepare
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_TAG
deploy: # terraform apply --> automatically deploy on corresponding env (integration or staging) when merging to default branch or tagging. Second layer environments (qa and production) will be controlled manually
environment:
name: $TF_STATE_NAME
action: start
on_stop: destroy
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_TAG
destroy:
extends: .terraform:destroy
variables:
GIT_STRATEGY: none
dependencies:
- build
environment:
name: $TF_STATE_NAME
action: stop
rules:
- if: $CI_COMMIT_TAG # Do not destroy production
when: never
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $TF_DESTROY == "true" # Manually destroy integration env.
when: manual
###########################################################################################################
###########################################################################################################
## Dev env.
## * Temporary environment. Lives and dies with the Merge Request.
## * Auto-deploy on push to feature branch.
## * Auto-destroy on when Merge Request is closed.
###########################################################################################################
build_review:
extends: build
rules:
- if: $CI_COMMIT_TAG
when: never
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
when: on_success
deploy_review:
extends: deploy
dependencies:
- build_review
environment:
name: $environment
action: start
on_stop: destroy_review
# url: https://$CI_ENVIRONMENT_SLUG.example.com
rules:
- if: $CI_COMMIT_TAG
when: never
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
when: on_success
destroy_review:
extends: destroy
dependencies:
- build_review
environment:
name: $environment
action: stop
rules:
- if: $CI_COMMIT_TAG # Do not destroy production
when: never
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Do not destroy staging
when: never
- when: manual
###########################################################################################################
###########################################################################################################
## Second layer
## * Deploys from main branch to qa env.
## * Deploys from tag to production.
###########################################################################################################
.2nd_layer:
stage: 2nd_layer
variables:
TF_ROOT: terraform
trigger:
include: .gitlab-ci/.second-layer.gitlab-ci.yml
# strategy: depend # Do NOT wait for the downstream pipeline to finish to mark upstream pipeline as successful. Otherwise, all pipelines will fail when reaching the pipeline timeout before deployment to 2nd layer.
forward:
yaml_variables: true # Forward variables defined in the trigger job
pipeline_variables: true # Forward manual pipeline variables and scheduled pipeline variables
qa:
extends: .2nd_layer
variables:
TF_STATE_NAME_2: qa
environment: $TF_STATE_NAME_2
TF_CLI_ARGS_plan_2: "-var-file=../vars/$TF_STATE_NAME_2.tfvars"
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
production:
extends: .2nd_layer
variables:
TF_STATE_NAME_2: production
environment: $TF_STATE_NAME_2
TF_CLI_ARGS_plan_2: "-var-file=../vars/$TF_STATE_NAME_2.tfvars"
rules:
- if: $CI_COMMIT_TAG
###########################################################################################################
ãã®æ®µéã§ããã§ã«3ã€ã®ç°å¢ã«åé¡ãªããããã€ããŠããŸããå人çã«ã¯ãã®ã¢ãããŒããçæ³çã§ããããã§ãããã ãããã£ãšå€ãã®ç°å¢ãå¿ èŠã§ããã°ãCDãã€ãã©ã€ã³ã«è¿œå ããŠãã ããã
trigger:includeãšããããŒã¯ãŒãã§ããŠã³ã¹ããªãŒã ãã€ãã©ã€ã³ãã€ã³ã¯ã«ãŒãããŠããããšã¯ãã§ã«ãæ°ã¥ãã ãšæããŸããããã«ããã.gitlab-ci/.second-layer.gitlab-ci.ymlãã¡ã€ã«ãã€ã³ã¯ã«ãŒããããŸããã»ãŒåããã€ãã©ã€ã³ãå®è¡ããããããåœç¶ãªããå
ã»ã©è©³ãã説æãããã®ãšå
容ã¯éåžžã«äŒŒãŠããŸããããã§å«ãã€ãã©ã€ã³ãå®çŸ©ããäž»ãªå©ç¹ã¯ãããèªäœãç¬ç«ããŠããããã倿°ãã«ãŒã«ãéåžžã«å®çŸ©ããããããšã§ãã
ãã®2ã€ç®ã®ã¬ã€ã€ãšãªããã€ãã©ã€ã³ã¯ããŸã£ããæ°ãããã€ãã©ã€ã³ã§ãããã®ããã1ã€ç®ã®ã¬ã€ã€ã®å®çŸ©ãæš¡å£ãã€ã€ã以äžãè¡ãå¿ èŠããããŸãã
destroyã¹ããŒãžã¯èªååãããªãããã«ãªã£ãããšã«ã泚æãã ãããäžè¿°ã®ãšãããTF_STATE_NAMEãšTF_CLI_ARGS_planã¯ãã¡ã€ã³ãã€ãã©ã€ã³ããåãã€ãã©ã€ã³ã«æž¡ãããŠããŸãããããã®å€ãåãã€ãã©ã€ã³ããå«ãã€ãã©ã€ã³ã«æž¡ãã«ã¯ãå¥ã®å€æ°åãå¿
èŠã§ããããã®ãããåãã€ãã©ã€ã³ã§ã¯å€æ°åã®æ«å°Ÿã«_2ãä»ãè¶³ããbefore_scriptã®å®è¡äžã«é©åãªå€æ°ã«å€ãã³ããŒããŠããŸãã
åã¹ãããã«ã€ããŠã¯èª¬ææžã¿ã§ãããããããã§ã¯çްãããšããã¯çããçŽæ¥ã°ããŒãã«ãª2ã€ç®ã®ã¬ã€ã€ã®å®çŸ©ïŒ.gitlab-ci/.second-layer.gitlab-ci.ymlã«ä¿åïŒã®å
šäœåãã確èªãã ããã
# Use to deploy a second environment on both the default branch and the tags.
include:
template: Terraform.gitlab-ci.yml
stages:
- validate
- test
- build
- deploy
fmt:
rules:
- when: never
validate:
rules:
- when: never
kics-iac-sast:
rules:
- if: $SAST_DISABLED == 'true' || $SAST_DISABLED == '1'
when: never
- if: $SAST_EXCLUDED_ANALYZERS =~ /kics/
when: never
- when: always
###########################################################################################################
## QA env. and Prod. env
## * Manually trigger build and auto-deploy in QA
## * Manually trigger both build and deploy in Production
## * Destroy of these env. is not automated to prevent errors.
###########################################################################################################
build: # terraform plan
cache: # Use a shared cache or tagged runners to ensure terraform can run on apply and destroy
- key: $TF_STATE_NAME_2
fallback_keys:
- cache-$CI_DEFAULT_BRANCH
paths:
- .
environment:
name: $TF_STATE_NAME_2
action: prepare
before_script: # Hack to set new variable values on the second layer, while still using the same variable names. Otherwise, due to variable precedence order, setting new value in the trigger job, does not cascade these new values to the downstream pipeline
- TF_STATE_NAME=$TF_STATE_NAME_2
- TF_CLI_ARGS_plan=$TF_CLI_ARGS_plan_2
rules:
- when: manual
deploy: # terraform apply
cache: # Use a shared cache or tagged runners to ensure terraform can run on apply and destroy
- key: $TF_STATE_NAME_2
fallback_keys:
- cache-$CI_DEFAULT_BRANCH
paths:
- .
environment:
name: $TF_STATE_NAME_2
action: start
before_script: # Hack to set new variable values on the second layer, while still using the same variable names. Otherwise, due to variable precedence order, setting new value in the trigger job, does not cascade these new values to the downstream pipeline
- TF_STATE_NAME=$TF_STATE_NAME_2
- TF_CLI_ARGS_plan=$TF_CLI_ARGS_plan_2
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_TAG && $TF_AUTO_DEPLOY == "true"
- if: $CI_COMMIT_TAG
when: manual
###########################################################################################################
ããã§æºåå®äºã§ãã æ¬çªç°å¢ã«ãããã€ããåã«ããžã§ãã®å®è¡ã管çããæ¹æ³ã¯èªç±ã«å€æŽã§ããŸããããšãã°ãGitLabã®æ©èœã掻çšããŠãæ¬çªç°å¢ãžã®ãããã€åã«ãžã§ããé å»¶ãããèšå®ãããããšãå¯èœã§ãã
ã€ãã«ç®æšãéæã§ããŸããããã£ãŒãã£ãŒãã©ã³ããmainãã©ã³ããã¿ã°ã ãã§ã5ã€ã®ç°ãªãç°å¢ãžã®ãããã€ã管çã§ããããã«ãªããŸããã
ããããã¯ãèªç±ã«é²ããŠãã ãããããšãã°ãtrigger:rules:changesããŒã¯ãŒãã䜿ã£ãŠããœãããŠã§ã¢ã®ãœãŒã¹ã³ãŒãã®ããŠã³ã¹ããªãŒã ãã€ãã©ã€ã³ãããªã¬ãŒããããã«ãã¡ã€ã³ãã€ãã©ã€ã³ãç°¡åã«æŽæ°ããããšãå¯èœã§ãããŸããçºçãã倿Žã«å¿ããŠãå¥ã®ãã³ãã¬ãŒãã䜿çšã§ããŸãããã®æ¹æ³ã¯ãŸãå¥ã®æ©äŒã«ã