์„œ๋น„์Šค์— HTTP/2 ์‚ฌ์šฉ

์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค์—์„œ ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๋ฉด Cloud Run์€ ํ•ด๋‹น ์š”์ฒญ์„ HTTP/2์—์„œ HTTP/1๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” Cloud Run์—์„œ ์š”์ฒญ์„ HTTP1๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ์•Š๊ฒŒ ์„œ๋น„์Šค์—์„œ ์—”๋“œ ํˆฌ ์—”๋“œ HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

HTTP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ HTTPS ์š”์ฒญ์œผ๋กœ ํ˜ธ์ถœ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ตฌ์„ฑํ•˜๊ธฐ ์ „์—

Cloud Run ์„œ๋น„์Šค์—์„œ HTTP/2 ์ผ๋ฐ˜ ํ…์ŠคํŠธ(h2c) ํ˜•์‹์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Google์˜ ํ”„๋ŸฐํŠธ์—”๋“œ ์ œ๊ณต ์ธํ”„๋ผ๋Š” TLS๋ฅผ ์ข…๋ฃŒํ•œ ํ›„ ์•”ํ˜ธํ™”๋œ ์ฑ„๋„์„ ํ†ตํ•ด h2c ํŠธ๋ž˜ํ”ฝ์„ Cloud Run ๋ฐ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค์—์„œ h2c ์š”์ฒญ์„ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ curl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋กœ์ปฌ๋กœ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

curl -i --http2-prior-knowledge http://localhost:PORT

ํ•„์š”ํ•œ ์—ญํ• 

Cloud Run ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์œผ๋ ค๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋‹ค์Œ IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”.

Cloud Run๊ณผ ์—ฐ๊ฒฐ๋œ IAM ์—ญํ•  ๋ฐ ๊ถŒํ•œ ๋ชฉ๋ก์€ Cloud Run IAM ์—ญํ•  ๋ฐ Cloud Run IAM ๊ถŒํ•œ์„ ์ฐธ์กฐํ•˜์„ธ์š”. Cloud Run ์„œ๋น„์Šค๊ฐ€ Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€Google Cloud API์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์„œ๋น„์Šค ID ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์—ญํ•  ๋ถ€์—ฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฐฐํฌ ๊ถŒํ•œ ๋ฐ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ง€์›๋˜๋Š” HTTP/2 ์„œ๋น„์Šค

HTTP/2๋Š” ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ช‡๋ช‡ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Websockets: ์ฑ„ํŒ…, ๊ฒŒ์ž„, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ํ”ผ๋“œ์™€ ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ ๊ฐ„์˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • gRPC ์„œ๋น„์Šค: gRPC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ํ•˜๋Š” ์ง€์—ฐ ์‹œ๊ฐ„์ด ์งง์€ ๊ณ ์„ฑ๋Šฅ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋†’์€ API: ์ˆ˜๋งŽ์€ ์ž‘์€ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋‚ด๋ณด๋‚ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

HTTP/2 ์—”๋“œ ํˆฌ ์—”๋“œ ์„ค์ • ๋ฐ ์—…๋ฐ์ดํŠธ

๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ƒˆ ๋ฒ„์ „์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…์‹œ์  ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์œผ๋ฉด ์ดํ›„ ๋ฒ„์ „์—๋„ ์ด ๊ตฌ์„ฑ ์„ค์ •์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ƒˆ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ•  ๋•Œ Google Cloud ์ฝ˜์†”, Google Cloud CLI ๋˜๋Š” YAML์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP/2 ์—”๋“œ ํˆฌ ์—”๋“œ ์‚ฌ์šฉ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Cloud Run์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud Run์œผ๋กœ ์ด๋™

  2. ๋ฉ”๋‰ด์—์„œ ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒˆ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์„œ๋น„์Šค๋ฅผ ํด๋ฆญํ•œ ํ›„ ์ƒˆ ๋ฒ„์ „ ์ˆ˜์ • ๋ฐ ๋ฐฐํฌ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ์ƒˆ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ดˆ๊ธฐ ์„œ๋น„์Šค ์„ค์ • ํŽ˜์ด์ง€๋ฅผ ์ž‘์„ฑํ•œ ํ›„ ์ปจํ…Œ์ด๋„ˆ, ๋ณผ๋ฅจ, ๋„คํŠธ์›Œํ‚น, ๋ณด์•ˆ์„ ํด๋ฆญํ•˜์—ฌ ์„œ๋น„์Šค ๊ตฌ์„ฑ ํŽ˜์ด์ง€๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.

  4. ๋„คํŠธ์›Œํ‚น ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    ์ด๋ฏธ์ง€

    • HTTP/2 ์—ฐ๊ฒฐ ์‚ฌ์šฉ ์„ค์ •์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  5. ๋งŒ๋“ค๊ธฐ ๋˜๋Š” ๋ฐฐํฌ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํŠน์ • ์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud run services update SERVICE --use-http2

SERVICE๋ฅผ ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ ์ค‘ HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„œ๋น„์Šค๋ฅผ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud run deploy --image IMAGE_URL --use-http2

IMAGE_URL์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest)๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ €์žฅ์†Œ REPO_NAME์ด ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.

YAML

  1. ์ƒˆ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ YAML ๊ตฌ์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    gcloud run services describe SERVICE --format export > service.yaml
  2. ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ports๋ฅผ ์ด๋ฆ„ h2c๋กœ, containerPort๋ฅผ ์›ํ•˜๋Š” ํฌํŠธ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          name: REVISION
        spec:
          containers:
          - image: IMAGE_URL
            ports:
            - name: h2c
              containerPort: 8080

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • SERVICE: Cloud Run ์„œ๋น„์Šค ์ด๋ฆ„
    • IMAGE_URL: ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฐธ์กฐ(์˜ˆ: us-docker.pkg.dev/cloudrun/container/hello:latest). Artifact Registry๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ €์žฅ์†Œ REPO_NAME์ด ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. URL์˜ ํ˜•์‹์€ LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG์ž…๋‹ˆ๋‹ค.
    • REVISION์„ ์ƒˆ ๋ฒ„์ „ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „ ์ด๋ฆ„์„ ์ œ๊ณตํ•  ๊ฒฝ์šฐ ๋‹ค์Œ ๊ธฐ์ค€์„ ๋ฐ˜๋“œ์‹œ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      • SERVICE-๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      • ์†Œ๋ฌธ์ž, ์ˆซ์ž, -๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
      • -๋กœ ๋๋‚˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
      • 63์ž(์˜๋ฌธ ๊ธฐ์ค€) ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    gcloud run services replace service.yaml

Terraform

Terraform ๊ตฌ์„ฑ์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ Terraform ๋ช…๋ น์–ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Terraform ๊ตฌ์„ฑ์—์„œ ๋‹ค์Œ์„ google_cloud_run_v2_service ๋ฆฌ์†Œ์Šค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service-h2c"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
      # Enable HTTP/2
      ports {
        name           = "h2c"
        container_port = 8080
      }
    }
  }
}

์ปจํ…Œ์ด๋„ˆ๊ฐ€ 8080 ์ด์™ธ์˜ ํฌํŠธ์—์„œ HTTP ์š”์ฒญ์„ ๋ฆฌ์Šจํ•˜๋Š” ๊ฒฝ์šฐ 8080์„ ํ•ด๋‹น ํฌํŠธ ๋ฒˆํ˜ธ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

HTTP/2 ์„ค์ • ๋ณด๊ธฐ

Cloud Run ์„œ๋น„์Šค์˜ ํ˜„์žฌ http/2 ์„ค์ •์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Cloud Run์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud Run์œผ๋กœ ์ด๋™

  2. ๊ด€์‹ฌ์ด ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ํด๋ฆญํ•˜์—ฌ ์„œ๋น„์Šค ์„ธ๋ถ€์ •๋ณด ํŽ˜์ด์ง€๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

  3. ๋ฒ„์ „ ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ์˜ค๋ฅธ์ชฝ์˜ ์„ธ๋ถ€์ •๋ณด ํŒจ๋„์—์„œ http/2 ์„ค์ •์ด ๋„คํŠธ์›Œํ‚น ํƒญ ์•„๋ž˜์— ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

gcloud

  1. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    gcloud run services describe SERVICE
  2. ๋ฐ˜ํ™˜๋œ ๊ตฌ์„ฑ์—์„œ HTTP/2 ์„ค์ •์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ ๋’ค์—์„œ HTTP/2 ์‚ฌ์šฉ

HTTP/2๋ฅผ ๋ฆฌ์Šจํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ Cloud Run์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์—์„œ ์ˆ˜์‹ ๋˜๋Š” HTTP/2 ๋˜๋Š” gRPC ํŠธ๋ž˜ํ”ฝ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์—๋Š” ํŠน๋ณ„ํ•œ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Cloud Run์—์„œ HTTP/2 ๋˜๋Š” gRPC๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.