Cloud Storage 버킷으로 전역 외부 애플리케이션 부하 분산기 설정

이 문서에서는 정적 콘텐츠 요청을 Cloud Storage 버킷으로 라우팅하기 위해 외부 애플리케이션 부하 분산기를 만드는 방법을 보여줍니다. 백엔드 버킷으로 부하 분산기를 구성하면 /love-to-fetch로 시작하는 URL 경로 요청은 us-east1 Cloud Storage 버킷으로 전송되고 다른 모든 요청은 사용자의 리전에 관계없이 europe-north1 Cloud Storage 버킷으로 전송됩니다.

백엔드가 HTTP(S)를 통해 동적 콘텐츠를 제공하는 경우 백엔드 버킷 대신 백엔드 서비스를 사용하는 것이 좋습니다.

기존 애플리케이션 부하 분산기를 사용하는 경우 전역 외부 애플리케이션 부하 분산기를 사용하여 새 배포를 계획할 때 이전 개요를 검토하세요.

Cloud Storage 버킷을 부하 분산기 백엔드로 사용

외부 애플리케이션 부하 분산기는 URL 맵을 사용하여 지정된 URL 경로에서 해당 백엔드로 트래픽을 전달합니다.

다음 다이어그램에서 부하 분산기는 /love-to-fetch/의 경로를 사용하여 us-east1 리전에 있는 Cloud Storage 버킷으로 트래픽을 전송합니다. 다른 모든 요청은 europe-north1 리전에 있는 Cloud Storage 버킷으로 이동합니다.

부하 분산기는 Cloud Storage 백엔드로 트래픽을 전송합니다.
Cloud Storage로 트래픽 분산

기본적으로 Cloud Storage는 Cloud CDN에서 사용하는 동일한 캐시를 사용합니다. 백엔드 버킷에서 Cloud CDN을 사용 설정하면 콘텐츠에 Cloud CDN 제어를 사용할 수 있습니다. 예를 들어 Cloud CDN 제어에는 캐시 모드, 서명된 URL, 무효화가 포함됩니다. Cloud CDN을 사용하면 대용량 콘텐츠(10MB 초과)를 캐시할 수도 있습니다. 백엔드 버킷에서 Cloud CDN을 사용하지 않으면, Cloud Storage 메타데이터에서 설정한 대로 더 작은 콘텐츠의 캐싱을 제어하는 데 원본 'Cache-Control' 헤더만 사용할 수 있습니다.

시작하기 전에

설정이 다음 기본 요건을 충족하는지 확인합니다. gcloud storage 유틸리티를 사용하는 경우 gcloud 도구로 객체 스토리지 탐색의 안내에 따라 설치할 수 있습니다.

기본 프로젝트 설정

콘솔

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

gcloud

gcloud config set project PROJECT_ID

PROJECT_ID를 이 가이드에 사용 중인 프로젝트로 바꿉니다.

Terraform

export GOOGLE_CLOUD_PROJECT=PROJECT_ID

권한

이 가이드를 따르려면 프로젝트에 Cloud Storage 버킷과 부하 분산기를 만들어야 합니다. 이렇게 하려면 프로젝트 소유자 또는 편집자이거나 다음 Compute Engine IAM 역할을 보유해야 합니다.

작업 필요한 역할
부하 분산기 구성요소 만들기 네트워크 관리자
Cloud Storage 버킷 만들기 스토리지 객체 관리자

자세한 내용은 다음 가이드를 참조하세요.

SSL 인증서 리소스 설정

HTTPS 부하 분산기의 경우 다음 문서에 설명된 대로 SSL 인증서 리소스를 만듭니다.

Google 관리형 인증서를 사용하는 것이 좋습니다.

이 예시에서는 이름이 www-ssl-cert인 SSL 인증서 리소스가 이미 있다고 가정합니다.

Cloud Storage 버킷 및 콘텐츠 준비

Cloud Storage 버킷을 준비하는 프로세스는 다음과 같습니다.

  • 버킷을 만듭니다.

  • 버킷에 콘텐츠를 복사합니다.

  • 버킷에 공개 액세스를 제공합니다.

Cloud Storage 버킷 만들기

이 예시에서는 부하 분산기가 액세스할 수 있는 Cloud Storage 버킷 두 개를 만듭니다. 프로덕션 배포의 경우 여러 Google Cloud 리전에 객체를 자동으로 복제하는 멀티 리전 버킷을 선택하는 것이 좋습니다. 이렇게 하면 콘텐츠의 가용성이 향상되고 애플리케이션 전체의 내결함성이 개선됩니다.

만든 Cloud Storage 버킷의 이름은 나중에 사용되니 기록해 둡니다. 이 가이드에서는 BUCKET_1_NAMEBUCKET_2_NAME이라고 합니다.

콘솔

  1. Google Cloud 콘솔에서 Cloud Storage 버킷 페이지로 이동합니다.

    Cloud Storage 버킷으로 이동

  2. 버킷 만들기를 클릭합니다.

  3. 버킷 이름 지정 상자에 이름 지정 가이드라인에 따라 전역적으로 고유한 이름을 입력합니다.

  4. 데이터 저장 위치 선택을 클릭합니다.

  5. 위치 유형리전으로 설정합니다.

  6. 위치europe-north1로 설정합니다. 이 가이드에서는 BUCKET_1_NAME입니다.

  7. 만들기를 클릭합니다.

  8. 버킷을 클릭하여 Cloud Storage 버킷 페이지로 돌아갑니다. 다음 안내를 따라 두 번째 버킷을 만들되, 위치us-east1로 설정합니다. 이 가이드에서는 BUCKET_2_NAME입니다.

gcloud

gcloud storage buckets create gs://BUCKET_1_NAME --project=PROJECT_ID --default-storage-class=standard --location=europe-north1 --uniform-bucket-level-access
gcloud storage buckets create gs://BUCKET_2_NAME --project=PROJECT_ID --default-storage-class=standard --location=us-east1 --uniform-bucket-level-access

BUCKET_1_NAMEBUCKET_2_NAME을 만들려는 버킷의 이름으로 바꿉니다.

Terraform

버킷을 만들려면 google_storage_bucket 리소스를 사용합니다.

# Create Cloud Storage buckets
resource "random_id" "bucket_prefix" {
  byte_length = 8
}

resource "google_storage_bucket" "bucket_1" {
  name                        = "${random_id.bucket_prefix.hex}-bucket-1"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
}

resource "google_storage_bucket" "bucket_2" {
  name                        = "${random_id.bucket_prefix.hex}-bucket-2"
  location                    = "us-east1"
  uniform_bucket_level_access = true
  storage_class               = "STANDARD"
  // delete bucket and contents on destroy.
  force_destroy = true
}

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

Cloud Storage 버킷으로 콘텐츠 전송

나중에 설정을 테스트할 수 있도록 다음 이미지를 공개 Cloud Storage 버킷에서 자체 Cloud Storage 버킷으로 복사합니다.

gcloud

  1. Cloud Shell 활성화를 클릭합니다.

  2. Cloud Shell에서 다음 명령어를 실행하여 버킷 이름 변수를 Cloud Storage 버킷 이름으로 바꿉니다.

gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://BUCKET_1_NAME/never-fetch/
gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://BUCKET_2_NAME/love-to-fetch/

Terraform

항목을 버킷에 복사하려면 google_storage_bucket_object 리소스를 사용하면 됩니다.

resource "google_storage_bucket_object" "cat_image" {
  name         = "never-fetch/three-cats.jpg"
  source       = "images/three-cats.jpg"
  content_type = "image/jpeg"

  bucket = google_storage_bucket.bucket_1.name
}

resource "google_storage_bucket_object" "dog_image" {
  name         = "love-to-fetch/two-dogs.jpg"
  source       = "images/two-dogs.jpg"
  content_type = "image/jpeg"

  bucket = google_storage_bucket.bucket_2.name
}

또는 null_resource 리소스를 사용합니다.

resource "null_resource" "upload_cat_image" {
provisioner "local-exec" {
  command = "gcloud storage cp gs://gcp-external-http-lb-with-bucket/three-cats.jpg gs://${google_storage_bucket.bucket_1.name}/never-fetch/"
}
}

resource "null_resource" "upload_dog_image" {
provisioner "local-exec" {
  command = "gcloud storage cp gs://gcp-external-http-lb-with-bucket/two-dogs.jpg gs://${google_storage_bucket.bucket_2.name}/love-to-fetch/"
}
}

Google Cloud 콘솔의 각 버킷 세부정보 페이지에서 새로고침을 클릭하여 파일이 성공적으로 복사되었는지 확인합니다.

Cloud Storage 버킷을 공개적으로 읽을 수 있도록 설정

Cloud Storage 버킷을 공개적으로 읽을 수 있게 하면 인터넷의 모든 사용자가 객체를 나열하고 보고 메타데이터(ACL 제외)를 볼 수 있습니다. 공개 버킷에 민감한 정보를 포함하지 마세요.

민감한 정보가 실수로 노출되는 가능성을 줄이려면 공개 객체와 민감한 정보를 동일한 버킷에 저장하지 마세요.

콘솔

모든 사용자에게 버킷의 객체를 볼 수 있는 액세스 권한을 부여하려면 버킷마다 다음 절차를 반복합니다.

  1. Google Cloud 콘솔에서 Cloud Storage 버킷 페이지로 이동합니다.

    Cloud Storage 버킷으로 이동

  2. 버킷 이름을 클릭한 다음 권한 탭을 클릭합니다.

  3. 추가를 클릭합니다.

  4. 새 주 구성원 상자에 allUsers를 입력합니다.

  5. 역할 선택 상자에서 Cloud Storage > 스토리지 객체 뷰어를 선택합니다.

  6. 저장을 클릭합니다.

  7. 공개 액세스 허용을 클릭합니다.

gcloud

모든 사용자에게 버킷의 객체를 볼 수 있는 액세스 권한을 부여하려면 다음 명령어를 실행합니다.

gcloud storage buckets add-iam-policy-binding gs://BUCKET_1_NAME --member=allUsers --role=roles/storage.objectViewer
gcloud storage buckets add-iam-policy-binding gs://BUCKET_2_NAME --member=allUsers --role=roles/storage.objectViewer

Terraform

모든 사용자에게 버킷의 객체를 볼 수 있는 액세스 권한을 부여하려면 google_storage_bucket_iam_member 리소스를 사용하고 allUsers 구성원을 지정합니다.

# Make buckets public
resource "google_storage_bucket_iam_member" "bucket_1" {
  bucket = google_storage_bucket.bucket_1.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

resource "google_storage_bucket_iam_member" "bucket_2" {
  bucket = google_storage_bucket.bucket_2.name
  role   = "roles/storage.objectViewer"
  member = "allUsers"
}

외부 IP 주소 예약

Cloud Storage 버킷을 설정한 후에는 대상에서 부하 분산기에 도달하는 데 사용하는 전역 고정 외부 IP 주소를 예약할 수 있습니다.

정적 외부 IP 주소는 도메인을 가리키는 단일 주소를 제공하므로 이 단계는 선택사항이지만 권장됩니다.

콘솔

  1. Google Cloud 콘솔에서 외부 IP 주소 페이지로 이동합니다.

    외부 IP 주소로 이동

  2. 고정 주소 예약을 클릭합니다.

  3. 이름 상자에 example-ip를 입력합니다.

  4. 네트워크 서비스 등급프리미엄으로 설정합니다.

  5. IP 버전IPv4로 설정합니다.

  6. 유형전역으로 설정합니다.

  7. 예약을 클릭합니다.

gcloud

gcloud compute addresses create example-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

예약된 IPv4 주소를 확인합니다.

gcloud compute addresses describe example-ip \
    --format="get(address)" \
    --global

Terraform

외부 IP 주소를 예약하려면 google_compute_global_address 리소스를 사용합니다.

# Reserve IP address
resource "google_compute_global_address" "default" {
  name = "example-ip"
}

백엔드 버킷으로 외부 애플리케이션 부하 분산기 만들기

이 안내에서는 HTTP 또는 HTTPS 부하 분산기를 만드는 방법을 설명합니다. HTTPS 부하 분산기를 만들려면 SSL 인증서 리소스를 부하 분산기의 프런트엔드에 추가해야 합니다. 자세한 내용은 SSL 인증서 개요를 참조하세요.

콘솔

구성 시작

  1. Google Cloud 콘솔에서 부하 분산 페이지로 이동합니다.

    부하 분산으로 이동

  2. 부하 분산기 만들기를 클릭합니다.
  3. 부하 분산기 유형에서 애플리케이션 부하 분산기(HTTP/HTTPS)를 선택하고 다음을 클릭합니다.
  4. 공개 또는 내부에서 공개(외부)를 선택하고 다음을 클릭합니다.
  5. 전역 또는 단일 리전 배포에서 전역 워크로드에 적합을 선택하고 다음을 클릭합니다.
  6. 부하 분산기 생성에서 전역 외부 애플리케이션 부하 분산기를 선택하고 다음을 클릭합니다.
  7. 구성을 클릭합니다.

기본 구성

  1. 이름 상자에 http-lb를 입력합니다.

백엔드 구성

  1. 백엔드 구성을 클릭합니다.

  2. 백엔드 서비스 및 백엔드 버킷 상자를 클릭하고 백엔드 버킷 만들기를 클릭합니다.

  3. 백엔드 버킷 이름 상자에 cats를 입력합니다.

  4. Cloud Storage 버킷 상자에서 찾아보기를 클릭합니다.

  5. BUCKET_1_NAME을 선택하고 선택을 클릭합니다. cats 백엔드 버킷을 먼저 만들면 기본적으로 일치하지 않는 모든 트래픽 요청이 전달됩니다. 부하 분산기에서 기본 백엔드 버킷의 리디렉션 규칙을 변경할 수 없습니다.

  6. 만들기를 클릭합니다.

  7. 같은 프로세스로 dogs라는 백엔드 버킷을 만들고 BUCKET_2_NAME을 선택합니다.

  8. 확인을 클릭합니다.

라우팅 규칙 구성

라우팅 규칙은 트래픽의 전달 방식을 결정합니다. 라우팅을 구성하려면 외부 애플리케이션 부하 분산기의 URL 맵의 구성 구성요소에 해당하는 호스트 규칙 및 경로 일치자를 설정합니다. 이 예시에 대한 규칙을 설정하려면 다음 안내를 따르세요.

  1. 라우팅 규칙을 클릭합니다.
  2. dogs의 경우 호스트 필드에 *를, 경로 필드에 /love-to-fetch/*를 입력합니다.

프런트엔드 구성

  1. 프런트엔드 구성을 클릭합니다.

  2. 다음 옵션이 이러한 값으로 구성되었는지 확인합니다.

    속성 값(값 입력 또는 지정된 옵션 선택)
    프로토콜 HTTP
    네트워크 서비스 계층 프리미엄
    IP 버전 IPv4
    IP 주소 example-ip
    포트 80
    선택사항: HTTP 연결 유지 제한 시간 5~1,200초 사이의 제한 시간 값을 입력합니다. 기본값은 610초입니다.

    HTTP 부하 분산기 대신 HTTPS 부하 분산기를 만들려면 SSL 인증서(gcloud compute ssl-certificates list)가 있어야 하며 다음과 같이 필드를 작성해야 합니다.

    속성 값(값 입력 또는 지정된 옵션 선택)
    프로토콜 HTTP(S)
    네트워크 서비스 계층 프리미엄
    IP 버전 IPv4
    IP 주소 example-ip
    포트 443
    선택사항: HTTP 연결 유지 제한 시간 5~1,200초 사이의 제한 시간 값을 입력합니다. 기본값은 610초입니다.
    인증서 SSL 인증서 리소스 설정 섹션에서 만든 www-ssl-cert 인증서를 선택하거나 새 인증서를 만듭니다.
    선택사항: HTTP-HTTPS 리디렉션 사용 설정 이 체크박스를 사용하여 리디렉션을 사용 설정합니다.

    이 체크박스를 사용 설정하면 HTTPS 부하 분산기와 동일한 IP 주소를 사용하는 추가적인 부분 HTTP 부하 분산기를 만들고 HTTP 요청을 부하 분산기의 HTTPS 프런트엔드로 리디렉션합니다.

    이 체크박스는 HTTPS 프로토콜이 선택되었고 예약된 IP 주소가 사용될 때만 선택할 수 있습니다.

  3. 완료를 클릭합니다.

구성 검토

  1. 검토 및 완료를 클릭합니다.

  2. 프런트엔드, 호스트 및 경로 규칙, 백엔드 버킷을 검토합니다.

  3. 만들기를 클릭하고 부하 분산기가 생성될 때까지 기다립니다.

  4. 부하 분산기의 이름을 클릭합니다(http-lb).

  5. 다음 작업을 위해 부하 분산기의 IP 주소를 기록합니다. 이 가이드에서는 IP_ADDRESS라고 합니다.

gcloud

백엔드 구성

gcloud compute backend-buckets create cats \
  --gcs-bucket-name=BUCKET_1_NAME
gcloud compute backend-buckets create dogs \
  --gcs-bucket-name=BUCKET_2_NAME

URL 맵 구성

gcloud compute url-maps create http-lb \
  --default-backend-bucket=cats
gcloud compute url-maps add-path-matcher http-lb \
  --path-matcher-name=path-matcher-2 \
  --new-hosts=* \
  --backend-bucket-path-rules="/love-to-fetch/*=dogs" \
  --default-backend-bucket=cats

대상 프록시 구성

gcloud compute target-http-proxies create http-lb-proxy \
  --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
  --url-map=http-lb

HTTP_KEEP_ALIVE_TIMEOUT_SEC를 5~1,200초의 클라이언트 HTTP 연결 유지 제한 시간 값으로 바꿉니다. 기본값은 610초입니다. 이 필드는 선택사항입니다.

전달 규칙 구성

gcloud compute forwarding-rules create http-lb-forwarding-rule \
  --load-balancing-scheme=EXTERNAL_MANAGED \
  --network-tier=PREMIUM \
  --address=example-ip \
  --global \
  --target-http-proxy=http-lb-proxy \
  --ports=80

Terraform

부하 분산기를 만들려면 다음 Terraform 리소스를 사용합니다.

백엔드 구성

백엔드 서비스를 만들려면 google_compute_backend_bucket 리소스를 사용합니다.

# Create LB backend buckets
resource "google_compute_backend_bucket" "bucket_1" {
  name        = "cats"
  description = "Contains cat image"
  bucket_name = google_storage_bucket.bucket_1.name
}

resource "google_compute_backend_bucket" "bucket_2" {
  name        = "dogs"
  description = "Contains dog image"
  bucket_name = google_storage_bucket.bucket_2.name
}

URL 맵 구성

URL 맵을 만들려면 google_compute_url_map 리소스를 사용합니다.

# Create url map
resource "google_compute_url_map" "default" {
  name = "http-lb"

  default_service = google_compute_backend_bucket.bucket_1.id

  host_rule {
    hosts        = ["*"]
    path_matcher = "path-matcher-2"
  }
  path_matcher {
    name            = "path-matcher-2"
    default_service = google_compute_backend_bucket.bucket_1.id

    path_rule {
      paths   = ["/love-to-fetch/*"]
      service = google_compute_backend_bucket.bucket_2.id
    }
  }
}

대상 프록시 구성

대상 HTTP 프록시를 만들려면 google_compute_target_http_proxy 리소스를 사용합니다.

# Create HTTP target proxy
resource "google_compute_target_http_proxy" "default" {
  name    = "http-lb-proxy"
  url_map = google_compute_url_map.default.id
}

전달 규칙 구성

전달 규칙을 만들려면 google_compute_global_forwarding_rule 리소스를 사용합니다.

# Create forwarding rule
resource "google_compute_global_forwarding_rule" "default" {
  name                  = "http-lb-forwarding-rule"
  ip_protocol           = "TCP"
  load_balancing_scheme = "EXTERNAL_MANAGED"
  port_range            = "80"
  target                = google_compute_target_http_proxy.default.id
  ip_address            = google_compute_global_address.default.id
}

참고: 모드를 기본 애플리케이션 부하 분산기로 변경하려면 load_balancing_scheme 속성을 "EXTERNAL_MANAGED" 대신 "EXTERNAL"로 설정합니다.

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

부하 분산기로 트래픽 전송

부하 분산기를 구성한 후 몇 분 후에 트래픽을 부하 분산기의 IP 주소로 전송할 수 있습니다.

콘솔

Google Cloud 콘솔은 지원되지 않습니다.

gcloud

curl 명령어를 사용하여 다음 URL의 응답을 테스트합니다. IP_ADDRESS부하 분산기의 IPv4 주소로 바꿉니다.

curl http://IP_ADDRESS/love-to-fetch/two-dogs.jpg
curl http://IP_ADDRESS/never-fetch/three-cats.jpg

추가 구성

이 섹션에서는 대체 및 추가 구성 옵션을 제공하는 구성 예시를 살펴봅니다. 모든 태스크는 선택사항입니다. 원하는 순서대로 수행할 수 있습니다.

클라이언트 HTTP 연결 유지 제한 시간 업데이트

이전 단계에서 만든 부하 분산기는 클라이언트 HTTP 연결 유지 제한 시간의 기본값으로 구성되었습니다.

클라이언트 HTTP 연결 유지 제한 시간을 업데이트하려면 다음 안내를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 부하 분산 페이지로 이동합니다.

    부하 분산으로 이동

  2. 수정할 부하 분산기의 이름을 클릭합니다.
  3. 수정을 클릭합니다.
  4. 프런트엔드 구성을 클릭합니다.
  5. 고급 기능을 펼칩니다. HTTP 연결 유지 제한 시간에 제한 시간 값을 입력합니다.
  6. 업데이트를 클릭합니다.
  7. 변경사항을 검토하려면 검토 및 완료를 클릭한 다음 업데이트를 클릭합니다.

gcloud

HTTP 부하 분산기의 경우 gcloud compute target-http-proxies update 명령어를 사용하여 대상 HTTP 프록시를 업데이트합니다.

    gcloud compute target-http-proxies update TARGET_HTTP_PROXY_NAME \
        --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
        --global
    

HTTPS 부하 분산기의 경우 gcloud compute target-https-proxies update 명령어를 사용하여 대상 HTTPS 프록시를 업데이트합니다.

    gcloud compute target-https-proxies update TARGET_HTTPS_PROXY_NAME \
        --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \
        --global
    

다음을 바꿉니다.

  • TARGET_HTTP_PROXY_NAME: 대상 HTTP 프록시의 이름입니다.
  • TARGET_HTTPS_PROXY_NAME: 대상 HTTPS 프록시의 이름입니다.
  • HTTP_KEEP_ALIVE_TIMEOUT_SEC: HTTP 연결 유지 제한 시간 값은 5~600초 사이입니다.

제한사항

  • 백엔드 버킷은 전역 외부 애플리케이션 부하 분산기 및 기본 애플리케이션 부하 분산기에서만 지원됩니다. 리전 외부 애플리케이션 부하 분산기 또는 기타 부하 분산기 유형에서는 지원되지 않습니다.
  • 백엔드 버킷은 IAP(Identity-Aware Proxy)에서 지원되지 않습니다.
  • 전역 외부 애플리케이션 부하 분산기는 Cloud Storage 버킷에 업로드를 지원하지 않습니다.

다음 단계