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. Google Cloud ๊ณ„์ •์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค. Google Cloud๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  Google ์ œํ’ˆ์˜ ์‹ค์ œ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•ด ๋ณด์„ธ์š”. ์‹ ๊ทœ ๊ณ ๊ฐ์—๊ฒŒ๋Š” ์›Œํฌ๋กœ๋“œ๋ฅผ ์‹คํ–‰, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” $300์˜ ๋ฌด๋ฃŒ ํฌ๋ ˆ๋”ง์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify 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 ์ธ์ฆ์„œ ๋ฆฌ์†Œ์Šค ์„ค์ •

๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋Œ€์ƒ ํ”„๋ก์‹œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” SSL ์ธ์ฆ์„œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. SSL ์ธ์ฆ์„œ ๋ฆฌ์†Œ์Šค๋Š” ์ธ์ฆ์„œ ๋งต ๋˜๋Š” Compute Engine SSL ์ธ์ฆ์„œ (๊ธฐ๋ณธ ์ธ์ฆ์„œ)์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ๋งต

๋‹ค์Œ ๋ฌธ์„œ ์ค‘ ํ•˜๋‚˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์ธ์ฆ์„œ ๋งต์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Compute Engine SSL ์ธ์ฆ์„œ

HTTPS ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ ๋ฌธ์„œ ์ค‘ ํ•˜๋‚˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ Compute Engine SSL ์ธ์ฆ์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Google ๊ด€๋ฆฌํ˜• ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

(์„ ํƒ์‚ฌํ•ญ) BYOIP ์ฃผ์†Œ ์‚ฌ์šฉ

์‚ฌ์šฉ์ž IP ์‚ฌ์šฉ(BYOIP)์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ๊ณต๊ฐœ ์ฃผ์†Œ๋ฅผGoogle Cloud ๋กœ ๊ฐ€์ ธ์™€ Google Cloud ๋ฆฌ์†Œ์Šค์™€ ํ•จ๊ป˜ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž์˜ IPv4 ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ „๋‹ฌ ๊ทœ์น™์— ํ•˜๋‚˜๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์˜ ์•ˆ๋‚ด์— ๋”ฐ๋ผ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ๋งŒ๋“ค ๋•Œ BYOIP ์ฃผ์†Œ๋ฅผ IP ์ฃผ์†Œ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

BYOIP ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž IP ์ฃผ์†Œ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Cloud Storage ๋ฒ„ํ‚ท ๋ฐ ์ฝ˜ํ…์ธ  ์ค€๋น„

Cloud Storage ๋ฒ„ํ‚ท์„ ์ค€๋น„ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฒ„ํ‚ท์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • ๋ฒ„ํ‚ท์— ์ฝ˜ํ…์ธ ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฒ„ํ‚ท์— ๊ณต๊ฐœ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Cloud Storage ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ

์ด ์˜ˆ์‹œ์—์„œ๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๊ฐ€ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” Cloud Storage ๋ฒ„ํ‚ท ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ Google Cloud ๋ฆฌ์ „์—์„œ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ๋ณต์ œํ•˜๋Š” ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ๋ฒ„ํ‚ท์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ˜ํ…์ธ ์˜ ๊ฐ€์šฉ์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์˜ ๋‚ด๊ฒฐํ•จ์„ฑ์ด ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค.

๋งŒ๋“  Cloud Storage ๋ฒ„ํ‚ท์˜ ์ด๋ฆ„์€ ๋‚˜์ค‘์— ์‚ฌ์šฉ๋˜๋‹ˆ ๊ธฐ๋กํ•ด ๋‘ก๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” BUCKET_1_NAME ๋ฐ BUCKET_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_NAME ๋ฐ BUCKET_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 ๋ฒ„ํ‚ท์„ ๊ณต๊ฐœ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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"
}

Cloud Storage ๋ฒ„ํ‚ท์„ ๋น„๊ณต๊ฐœ๋กœ ์„ค์ •

๋น„๊ณต๊ฐœ ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ์„œ๋น„์Šค ๊ณ„์ • service-PROJECT_NUM@https-lb.iam.gserviceaccount.com์— ํ•„์š”ํ•œ IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•˜์„ธ์š”. ์ด ์„œ๋น„์Šค ๊ณ„์ •์€ ๋ฐฑ์—”๋“œ ๋ฒ„ํ‚ท์ด ์ƒ์„ฑ๋  ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

์„œ๋น„์Šค ๊ณ„์ •์—๋งŒ ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ๋ฒ„ํ‚ท๋งˆ๋‹ค ๋‹ค์Œ ์ ˆ์ฐจ๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

  1. Google Cloud ์ฝ˜์†”์—์„œ ๋ฒ„ํ‚ท ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ๋ฒ„ํ‚ท์œผ๋กœ ์ด๋™

  2. ์•ก์„ธ์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•  ๋ฒ„ํ‚ท์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๊ถŒํ•œ ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ถŒํ•œ ์„น์…˜์˜ ์ฃผ ๊ตฌ์„ฑ์›๋ณ„๋กœ ๋ณด๊ธฐ ํƒญ์—์„œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ์ฃผ ๊ตฌ์„ฑ์› ์ถ”๊ฐ€ ์„น์…˜์˜ ์ƒˆ ์ฃผ ๊ตฌ์„ฑ์› ํ•„๋“œ์— ํ˜ธ์ถœ ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ(service-PROJECT_NUM@https-lb.iam.gserviceaccount.com)๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  5. ์—ญํ•  ํ• ๋‹น ์„น์…˜์˜ ์—ญํ•  ์„ ํƒ ํ•„๋“œ์—์„œ Cloud Storageย > ์Šคํ† ๋ฆฌ์ง€ ๊ฐ์ฒด ๋ทฐ์–ด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ญํ• ์€ ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  6. ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ฒ„ํ‚ท์—์„œ ์ œ๊ณต๋˜๋Š” ๋ชจ๋“  ์ฝ˜ํ…์ธ ๊ฐ€ ์บ์‹œ๋˜๋„๋ก ์บ์‹œ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ชจ๋“  ์ฝ˜ํ…์ธ  ๊ฐ•์ œ ์บ์‹œ๋กœ ์ง€์ •ํ•˜๊ณ  ์ตœ๋Œ€ TTL ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

gcloud

์„œ๋น„์Šค ๊ณ„์ •์—๋งŒ ๋ฒ„ํ‚ท์˜ ๊ฐ์ฒด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  gcloud storage buckets add-iam-policy-binding gs://BUCKET_1_NAME \
      --member=serviceAccount:service-PROJECT_NUM@https-lb.iam.gserviceaccount.com \
      --role=roles/storage.objectViewer
  gcloud storage buckets add-iam-policy-binding gs://BUCKET_2_NAME \
      --member=serviceAccount:service-PROJECT_NUM@https-lb.iam.gserviceaccount.com \
      --role=roles/storage.objectViewer

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • BUCKET_1_NAME ๋ฐ BUCKET_2_NAME: ์‚ฌ์šฉํ•  Cloud Storage ๋ฒ„ํ‚ท์˜ ์ด๋ฆ„
  • PROJECT_NUM: Google Cloud ํ”„๋กœ์ ํŠธ ์ˆ˜

๋˜ํ•œ ๋ฒ„ํ‚ท์—์„œ ์ œ๊ณต๋˜๋Š” ๋ชจ๋“  ์ฝ˜ํ…์ธ ๊ฐ€ ์บ์‹œ๋˜๋„๋ก ์บ์‹œ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ชจ๋“  ์ฝ˜ํ…์ธ  ๊ฐ•์ œ ์บ์‹œ๋กœ ์ง€์ •ํ•˜๊ณ  ์ตœ๋Œ€ TTL ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€ 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 ์ธ์ฆ์„œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•„๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์†์„ฑ ๊ฐ’(๊ฐ’ ์ž…๋ ฅ ๋˜๋Š” ์ง€์ •๋œ ์˜ต์…˜ ์„ ํƒ)
    ํ”„๋กœํ† ์ฝœ HTTP(S)
    ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค ๋“ฑ๊ธ‰ Premium
    IP ๋ฒ„์ „ IPv4
    IP ์ฃผ์†Œ example-ip
    ํฌํŠธ 443
    ์„ ํƒ์‚ฌํ•ญ: HTTP ์—ฐ๊ฒฐ ์œ ์ง€ ์ œํ•œ ์‹œ๊ฐ„ 5~1,200์ดˆ ์‚ฌ์ด์˜ ์ œํ•œ ์‹œ๊ฐ„ ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 610์ดˆ์ž…๋‹ˆ๋‹ค.
    ์ธ์ฆ์„œ ์ธ์ฆ์„œ ์ €์žฅ์†Œ ์„ ํƒ์—์„œ ์ธ์ฆ์„œ ๋งต ์‚ฌ์šฉ ๋˜๋Š” ๊ธฐ์กด ์ธ์ฆ์„œ ์‚ฌ์šฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์— ๋”ฐ๋ผ ์ธ์ฆ์„œ ๋งต ๋˜๋Š” ๊ธฐ์กด ์ธ์ฆ์„œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    (์„ ํƒ์‚ฌํ•ญ) 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

๋Œ€์ƒ ํ”„๋ก์‹œ ๊ตฌ์„ฑ

HTTP ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ ๊ฒฝ์šฐ ๋Œ€์ƒ HTTP ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค์–ด ์š”์ฒญ์„ URL ๋งต์œผ๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.

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์ดˆ์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

HTTPS ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ ๊ฒฝ์šฐ ๋Œ€์ƒ HTTPS ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค์–ด ์š”์ฒญ์„ URL ๋งต์œผ๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ ํ”„๋ก์‹œ๋Š” HTTPS ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ SSL ์ธ์ฆ์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด์œ ํ•˜๋ฏ€๋กœ ์ด ๋‹จ๊ณ„์—์„œ ์ธ์ฆ์„œ ๋˜๋Š” ์ธ์ฆ์„œ ๋งต์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

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

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • HTTP_KEEP_ALIVE_TIMEOUT_SEC: 5~1,200์ดˆ์˜ ํด๋ผ์ด์–ธํŠธ HTTP ์—ฐ๊ฒฐ ์œ ์ง€ ์ œํ•œ ์‹œ๊ฐ„ ๊ฐ’ ๊ธฐ๋ณธ๊ฐ’์€ 610์ดˆ์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  • SSL_CERTIFICATE_NAME: Compute Engine SSL ์ธ์ฆ์„œ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ์ธ์ฆ์„œ ๊ด€๋ฆฌ์ž ์ธ์ฆ์„œ ๋งต์„ ๋งŒ๋“  ๊ฒฝ์šฐ --ssl-certificates=SSL_CERTIFICATE_NAME์„ --certificate-map=CERTIFICATE_MAP_NAME์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์ „๋‹ฌ ๊ทœ์น™ ๊ตฌ์„ฑ

HTTP ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ ๊ฒฝ์šฐ ํฌํŠธ 80์˜ ์ˆ˜์‹  HTTP ์š”์ฒญ์„ ๋Œ€์ƒ HTTP ํ”„๋ก์‹œ๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ์ „์—ญ ์ „๋‹ฌ ๊ทœ์น™์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

HTTPS ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ ๊ฒฝ์šฐ ํฌํŠธ 443์˜ ์ˆ˜์‹  HTTPS ์š”์ฒญ์„ ๋Œ€์ƒ HTTPS ํ”„๋ก์‹œ๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ์ „์—ญ ์ „๋‹ฌ ๊ทœ์น™์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

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์˜ ์‘๋‹ต์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. HTTP ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ ๊ฒฝ์šฐ IP_ADDRESS๋ฅผ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ IPv4 ์ฃผ์†Œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. HTTPS ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ ๊ฒฝ์šฐ http://IP_ADDRESS๋ฅผ https://DOMAIN๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ DOMAIN๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์˜ IP ์ฃผ์†Œ๋กœ ํ™•์ธ๋˜๋Š” SSL ์ธ์ฆ์„œ์™€ ์—ฐ๊ฒฐ๋œ ๋„๋ฉ”์ธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

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์ดˆ ์‚ฌ์ด)

Cloud Storage XML API์˜ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ํŒŒ๋ผ๋ฏธํ„ฐ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ํ†ตํ•ด ๋ฐฑ์—”๋“œ ๋ฒ„ํ‚ท์œผ๋กœ ์ „์†ก๋œ ์š”์ฒญ์— ํŠน์ • ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋Š” '์ง€์›๋˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ' ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ HTTP 404 ์‘๋‹ต์„ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์š”์ฒญ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ Cloud Storage XML API์—์„œ ์ด๋Ÿฌํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ‘œ์—๋Š” ์š”์ฒญ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŒ…๋  ๋•Œ Cloud Storage XML API์—์„œ ๋‹ค์–‘ํ•œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹์ด ์š”์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ด€์ฐฐ๋œ ๋™์ž‘๋ณ„๋กœ ๊ทธ๋ฃนํ™”๋˜์–ด ์ด ์ปจํ…์ŠคํŠธ์—์„œ ์ง€์›, ๋ฌด์‹œ ๋˜๋Š” ๊ฑฐ๋ถ€๋˜๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ด€์ฐฐ๋œ ๋™์ž‘
์ง€์›๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ generation, prefix, marker, max-keys ์ด๋Ÿฌํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ(์ ์ ˆํ•œ ๊ฐ’ ํฌํ•จ) ์ถ”๊ฐ€๋Š” Cloud Storage XML API ์ฐธ๊ณ  ๋ฆฌ์†Œ์Šค์˜ ์„ค๋ช…๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. API๋Š” ํ‘œ์ค€ HTTP ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋ฌด์‹œ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ acl, billing, compose, delimiter, encryption, encryptionConfig, response-content-disposition, response-content-type, tagging, versions, websiteConfig ์ด๋Ÿฌํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๊ฐ€ ์ด๋Ÿฌํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Cloud Storage์— ์ „๋‹ฌํ•˜๋ฉด Cloud Storage XML API๋Š” ์ด๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
๊ฑฐ๋ถ€๋œ ํŒŒ๋ผ๋ฏธํ„ฐ cors, lifecycle, location, logging, storageClass, versioning Cloud Storage XML API์—์„œ '์ง€์›๋˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ' ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ œํ•œ์‚ฌํ•ญ

  • ๋ฐฑ์—”๋“œ ๋ฒ„ํ‚ท์€ ์ „์—ญ ์™ธ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ ๋ฐ ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์ „ ์™ธ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ ๋˜๋Š” ๊ธฐํƒ€ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ ์œ ํ˜•์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฑ์—”๋“œ ๋ฒ„ํ‚ท์€ IAP(Identity-Aware Proxy)์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ „์—ญ ์™ธ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋Š” Cloud Storage ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Cloud CDN์ด ์‚ฌ์šฉ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์—์„œ ์„œ๋ช…๋œ URL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„