GitLab에 CI/CD 변수로 AWS Access key와 secrets키를 등록하면 해당 IAM이 가지고 있는 권한으로 AWS CLI명령어를 부여 받은 terraform 실행이 가능합니다.
/Settings/Variables/Add Variables
두 번째 방법으로는 Runner에 해당 권한을 AWS상에서 직접 부여하는 방법입니다. key를 변수로 등록하는 과정에서 키가 유출되는 것을 방지할 수 있습니다.
다만 해당 runner를 사용하는 사용자를 gitlab에 유저관리를 통해 제한하는 것이 중요합니다.
runner인스턴스선택/Actions/Security/ModifyIamrole
gitlab-ci.yml
default:
image: registry.gitlab.com/gitlab-org/terraform-images/stable:latest
cache:
key: example-production
paths:
- ${TF_ROOT}/.terraform
before_script:
- cd ${TF_ROOT}
variables:
TF_ROOT: ${CI_PROJECT_DIR}/environments/example/production
TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/example-production
stages:
- prepare
- validate
- build
- deploy
init:
stage: prepare
script:
- gitlab-terraform init
validate:
stage: validate
script:
- gitlab-terraform validate
plan:
stage: build
script:
- gitlab-terraform plan
- gitlab-terraform plan-json
artifacts:
name: plan
paths:
- ${TF_ROOT}/plan.cache
reports:
terraform: ${TF_ROOT}/plan.json
apply:
stage: deploy
environment:
name: production
script:
- gitlab-terraform apply
dependencies:
- plan
when: manual
only:
- master
main.tf
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "t1013-xgro-vpc"
cidr = "10.0.0.0/16"
azs = ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = false
enable_vpn_gateway = false
tags = {
Terraform = "true"
Environment = "dev"
}
}