본문 바로가기
클라우드/GCP

[GCP/테라폼] GCP에서 Terraform으로 SSL 인증서 발급, DNS 설정, CDN 구성하는 방법

by cloudgarden 2024. 8. 7.

*Bucket도 테라폼에서 생성하는 코드

*현재 삭제된 계정이기 때문에 보안과 상관없이 코드 공개해도 무관

 

1. 테라폼 구성도

 

2. 테라폼 코드

# Terraform 구성 파일

provider "google" {
  credentials = file("/home/ubuntu/project/key.json")
  project     = var.project_id
  region      = var.region
}

variable "project_id" {
  description = "The ID of the GCP project"
  type        = string
}

variable "region" {
  description = "The region to deploy resources in"
  type        = string
}

# SSL 인증서 발급
resource "google_compute_ssl_certificate" "my-certificate" {
  name        = "my-certificate"
  private_key = file("/home/ubuntu/project/private_key_decrypted.pem")  # 복호화된 개인 키 파일 경로
  certificate = file("/home/ubuntu/project/certificate.pem")
}


# 도메인 등록 및 설정
resource "google_dns_managed_zone" "example_zone" {
  name        = "test-zone" # DNS 영역 이름
  dns_name    = "jungwon.store." # 도메인 이름
  description = "My DNS zone for jungwon.store"
}

resource "google_dns_record_set" "example_ns" {
  name         = "jungwon.store." # DNS 레코드 이름
  type         = "NS"
  ttl          = 300
  managed_zone = google_dns_managed_zone.example_zone.name

  rrdatas = [
    "ns-cloud-a1.googledomains.com.",
    "ns-cloud-a2.googledomains.com.",
    "ns-cloud-a3.googledomains.com.",
    "ns-cloud-a4.googledomains.com."
  ]
}
 
# A 레코드 설정
resource "google_dns_record_set" "example_a" {
  name         = "jungwon.store."
  type         = "A"
  ttl          = 300
  managed_zone = google_dns_managed_zone.example_zone.name

  rrdatas = ["210.124.140.121"]  # 서버의 실제 IP 주소 입력하기 # curl ifconfig.me

# 스토리지 설정
resource "google_storage_bucket" "frontend_bucket" {
  name          = "test-frontend-bucket" # 버킷 이름
  location      = var.region
  force_destroy = true

  website {
    main_page_suffix = "index.html"
    not_found_page   = "404.html"
  }
}

resource "google_storage_bucket_object" "frontend_files" {
  for_each = fileset("${path.module}/frontend", "**") # 업로드할 파일 목록

  name   = each.key # 객체 이름
  bucket = google_storage_bucket.frontend_bucket.name # 대상 버킷 이름
  source = "${path.module}/frontend/${each.key}" # 소스 파일 경로
}

# CDN 설정
resource "google_compute_backend_bucket" "frontend_backend_bucket" {
  name        = "frontend-backend-bucket" # 백엔드 버킷 이름
  bucket_name = google_storage_bucket.frontend_bucket.name
  enable_cdn  = true
}

resource "google_compute_url_map" "frontend_url_map" {
  name            = "frontend-url-map" # URL 맵 이름
  default_service = google_compute_backend_bucket.frontend_backend_bucket.self_link # 기본 서비스
}

resource "google_compute_target_http_proxy" "frontend_http_proxy" {
  name    = "frontend-http-proxy" # HTTP 프록시 이름
  url_map = google_compute_url_map.frontend_url_map.self_link # URL 맵 연결
}

resource "google_compute_global_forwarding_rule" "frontend_forwarding_rule" {
  name       = "frontend-forwarding-rule" # 포워딩 룰 이름
  target     = google_compute_target_http_proxy.frontend_http_proxy.self_link # 대상 프록시
  port_range = "80"
}

# SSL 인증서 로드 밸런서에 연결
resource "google_compute_target_https_proxy" "frontend_https_proxy" {
  name               = "frontend-https-proxy" # HTTPS 프록시 이름
  url_map            = google_compute_url_map.frontend_url_map.self_link # URL 맵 연결
  ssl_certificates   = [google_compute_ssl_certificate.my-certificate.self_link] # SSL 인증서 연결
}

resource "google_compute_global_forwarding_rule" "frontend_https_forwarding_rule" {
  name       = "frontend-https-forwarding-rule" # 포워딩 룰 이름
  target     = google_compute_target_https_proxy.frontend_https_proxy.self_link # 대상 프록시
  port_range = "443"
}

 

 

3. 코드 설명

A. GCP Provider 설정

provider "google" {     #테라폼이 GCP와 상호작용할 수 있도록 설정
  credentials = file("/home/ubuntu/project/key.json")     #인증정보를 json 파일로
  project     = var.project_id 
  region      = var.region
}

 

 

B. 변수 정의

variable "project_id" {
  description = "The ID of the GCP project"
  type        = string
}

variable "region" {
  description = "The region to deploy resources in"
  type        = string
}

 

 

C. SSL 인증서 발급

resource "google_compute_ssl_certificate" "my-certificate" {    #GCP에서 SSL 인증서 생성
  name        = "my-certificate" #인증서 이름 지정
  private_key = file("/home/ubuntu/project/private_key_decrypted.pem")     # SSL 인증서에 사용할 개인 키 파일 경로
  certificate = file("/home/ubuntu/project/certificate.pem")    # SSL 인증서 파일의 경로
}

 

 

D. 도메인 등록 및 설정

resource "google_dns_managed_zone" "example_zone" {    #GCP의 DNS 관리 영역 설정
  name        = "test-zone" # DNS 영역 이름
  dns_name    = "jungwon.store." # 도메인 이름
  description = "My DNS zone for jungwon.store" 
}

resource "google_dns_record_set" "example_ns" {    #DNS 레코드의 이름 지정
  name         = "jungwon.store." # DNS 레코드 이름
  type         = "NS"
  ttl          = 300
  managed_zone = google_dns_managed_zone.example_zone.name

  rrdatas = [
    "ns-cloud-a1.googledomains.com.",
    "ns-cloud-a2.googledomains.com.",
    "ns-cloud-a3.googledomains.com.",
    "ns-cloud-a4.googledomains.com."
  ]
}

 

# A 레코드 설정
resource "google_dns_record_set" "example_a" {
  name         = "jungwon.store."
  type         = "A"
  ttl          = 300
  managed_zone = google_dns_managed_zone.example_zone.name

  rrdatas = ["210.124.140.121"]  # 서버의 실제 IP 주소 입력하기 #curl ifconfig.me로 서버 IP를 알 수 있음

 

 

E. 스토리지 설정

resource "google_storage_bucket" "frontend_bucket" {    #GCP의 Cloud Storage 버킷 생성
  name          = "test-frontend-bucket"    #버킷 이름
  location      = var.region
  force_destroy = true

  website {
    main_page_suffix = "index.html"
    not_found_page   = "404.html"
  }
}

resource "google_storage_bucket_object" "frontend_files" {    #버킷에 파일을 업로드
  for_each = fileset("${path.module}/frontend", "**")    #업로드할 파일 목록

  name   = each.key # 객체 이름
  bucket = google_storage_bucket.frontend_bucket.name # 대상 버킷 이름
  source = "${path.module}/frontend/${each.key}" # 소스 파일 경로
}

 

 

F. CDN 설정

resource "google_compute_backend_bucket" "frontend_backend_bucket" {    #CDN에 사용할 백엔드 버킷 설정
  name        = "frontend-backend-bucket"     #백엔드 버킷 이름
  bucket_name = google_storage_bucket.frontend_bucket.name
  enable_cdn  = true
}

resource "google_compute_url_map" "frontend_url_map" {    #URL 매핑을 정의
  name            = "frontend-url-map"     #URL 맵 이름
  default_service = google_compute_backend_bucket.frontend_backend_bucket.self_link     #기본 서비스
}

resource "google_compute_target_http_proxy" "frontend_http_proxy" {    #HTTP 요청을 처리할 프록시 설정
  name    = "frontend-http-proxy"     #HTTP 프록시 이름
  url_map = google_compute_url_map.frontend_url_map.self_link     #URL 맵 연결
}

resource "google_compute_global_forwarding_rule" "frontend_forwarding_rule" {    #HTTP 포워딩 규칙 설정
  name       = "frontend-forwarding-rule"    #포워딩 룰 이름
  target     = google_compute_target_http_proxy.frontend_http_proxy.self_link    #대상 프록시
  port_range = "80"
}

 

 

G. HTTPS 로드 밸런서 설정

resource "google_compute_target_https_proxy" "frontend_https_proxy" {    #HTTPS 요청을 처리할 프록시 설정
  name               = "frontend-https-proxy"    #HTTPS 프록시 이름
  url_map            = google_compute_url_map.frontend_url_map.self_link    #URL 맵 연결
  ssl_certificates   = [google_compute_ssl_certificate.my-certificate.self_link]    #SSL 인증서 연결
}

resource "google_compute_global_forwarding_rule" "frontend_https_forwarding_rule" {    #HTTPS 포워딩 규칙 설정
  name       = "frontend-https-forwarding-rule"    #포워딩 룰 이름
  target     = google_compute_target_https_proxy.frontend_https_proxy.self_link    #대상 프록시
  port_range = "443"
}

 

 

5. 자동으로 만들어진 파일

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*기존에 있던 Bucket "aws-s3bucket" 불러와서 사용하는 코드

# Google Cloud Provider 설정
provider "google" {
  credentials = file("/home/ubuntu/project/key.json")
  project     = var.project_id
  region      = var.region
}

variable "project_id" {
  description = "The ID of the GCP project"
  type        = string
}

variable "region" {
  description = "The region to deploy resources in"
  type        = string
}

# 이미 존재하는 GCP 버킷을 참조
data "google_storage_bucket" "existing_bucket" {
  name = "login_from_aws" # 이미 존재하는 버킷 이름
}

# SSL 인증서 발급
resource "google_compute_ssl_certificate" "my-certificate" {
  name        = "my-certificate"
  private_key = file("/home/ubuntu/project/private_key_decrypted.pem")  # 복호화된 개인 키 파일 경로
  certificate = file("/home/ubuntu/project/certificate.pem")
}

# 도메인 등록 및 설정
resource "google_dns_managed_zone" "example_zone" {
  name        = "test-zone" # DNS 영역 이름
  dns_name    = "jungwon.store." # 도메인 이름
  description = "My DNS zone for jungwon.store"
}

resource "google_dns_record_set" "example_ns" {
  name         = "jungwon.store." # DNS 레코드 이름
  type         = "NS"
  ttl          = 300
  managed_zone = google_dns_managed_zone.example_zone.name

  rrdatas = [
    "ns-cloud-a1.googledomains.com.",
    "ns-cloud-a2.googledomains.com.",
    "ns-cloud-a3.googledomains.com.",
    "ns-cloud-a4.googledomains.com."
  ]
}

# A 레코드 설정
resource "google_dns_record_set" "example_a" {
  name         = "jungwon.store."
  type         = "A"
  ttl          = 300
  managed_zone = google_dns_managed_zone.example_zone.name

  rrdatas = ["210.124.140.121"]  # 서버의 실제 IP 주소 입력하기 # curl ifconfig.me
}

# GCP 버킷에 파일 업로드
resource "google_storage_bucket_object" "frontend_files" {
  for_each = fileset("${path.module}/login_from_aws", "**") # 업로드할 파일 목록

  name   = each.key # 객체 이름
  bucket = data.google_storage_bucket.existing_bucket.name # 기존 버킷 이름 참조
  source = "${path.module}login_from_aws/${each.key}" # 소스 파일 경로
}

# CDN 설정
resource "google_compute_backend_bucket" "frontend_backend_bucket" {
  name        = "frontend-backend-bucket" # 백엔드 버킷 이름
  bucket_name = data.google_storage_bucket.existing_bucket.name # 기존 버킷 이름 참조
  enable_cdn  = true
}

resource "google_compute_url_map" "frontend_url_map" {
  name            = "frontend-url-map" # URL 맵 이름
  default_service = google_compute_backend_bucket.frontend_backend_bucket.self_link # 기본 서비스
}

resource "google_compute_target_http_proxy" "frontend_http_proxy" {
  name    = "frontend-http-proxy" # HTTP 프록시 이름
  url_map = google_compute_url_map.frontend_url_map.self_link # URL 맵 연결
}

resource "google_compute_global_forwarding_rule" "frontend_forwarding_rule" {
  name       = "frontend-forwarding-rule" # 포워딩 룰 이름
  target     = google_compute_target_http_proxy.frontend_http_proxy.self_link # 대상 프록시
  port_range = "80"
}

# SSL 인증서 로드 밸런서에 연결
resource "google_compute_target_https_proxy" "frontend_https_proxy" {
  name               = "frontend-https-proxy" # HTTPS 프록시 이름
  url_map            = google_compute_url_map.frontend_url_map.self_link # URL 맵 연결
  ssl_certificates   = [google_compute_ssl_certificate.my-certificate.self_link] # SSL 인증서 연결
}

resource "google_compute_global_forwarding_rule" "frontend_https_forwarding_rule" {
  name       = "frontend-https-forwarding-rule" # 포워딩 룰 이름
  target     = google_compute_target_https_proxy.frontend_https_proxy.self_link # 대상 프록시
  port_range = "443"
}