App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ์˜ ์•Œ๋ ค์ง„ ๋ฌธ์ œ

๋ฆฌ์ „ ID

REGION_ID๋Š” ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ์„ ํƒํ•œ ๋ฆฌ์ „์„ ๊ธฐ์ค€์œผ๋กœ Google์—์„œ ํ• ๋‹นํ•˜๋Š” ์ถ•์•ฝ๋œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ฆฌ์ „ ID๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ตญ๊ฐ€ ๋ฐ ์ฃผ/๋„ ์ฝ”๋“œ์™€ ๋น„์Šทํ•˜๊ฒŒ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ”๋“œ๋Š” ๊ตญ๊ฐ€ ๋˜๋Š” ์ฃผ/๋„์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 2020๋…„ 2์›” ์ดํ›„์— ์ƒ์„ฑ๋œ ์•ฑ์˜ ๊ฒฝ์šฐ REGION_ID.r์ด App Engine URL์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ๋‚ ์งœ ์ด์ „์— ๋งŒ๋“  ๊ธฐ์กด ์•ฑ์˜ ๊ฒฝ์šฐ URL์—์„œ ๋ฆฌ์ „ ID๋Š” ์„ ํƒ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

๋ฆฌ์ „ ID์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

์•Œ๋ ค์ง„ ๋ฌธ์ œ์˜ ์ „์ฒด ๋ชฉ๋ก์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์‹ ๊ณ ํ•˜๋ ค๋ฉด ๋ฌธ์ œ ์ถ”์ ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • gcloud app deploy๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•œ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด https://PROJECT_ID.REGION_ID.r.appspot.com์—์„œ ์„œ๋น„์Šค ์ œ๊ณต์„ ์‹œ์ž‘ํ•˜๊ธฐ๊นŒ์ง€ 1~2๋ถ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ HTTP 503 ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ์— ์™ธ๋ถ€ IP์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•˜๋Š” ์กฐ์ง ์ •์ฑ…์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์™ธ๋ถ€ IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ ์•ฑ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์กฐ์ง ์ •์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • constraints/compute.vmExternalIpAccess์— ๊ด€ํ•œ ์œ ํšจ ์ •์ฑ…์€ DENY_ALL๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
    • constraints/compute.vmExternalIpAccess์— ๊ด€ํ•œ ์œ ํšจ ์ •์ฑ…์€ ํŠน์ • VM ์ธ์Šคํ„ด์Šค๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
    • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ์—์„œ constraints/compute.requireOsConfig์— ๊ด€ํ•œ ์œ ํšจ ์ •์ฑ…์ด ์‚ฌ์šฉ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.

    ์ด๋Ÿฌํ•œ ์ œ์•ฝ์€ ์ž๋™์œผ๋กœ ๊ฐ์ง€๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐฐํฌ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜์–ด ๋ฐฐํฌ์— ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. gcloud beta resource-manager org-policies describe compute.vmExternalIpAccess --project=my-project --effective ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ์กฐ์ง ์ •์ฑ…์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ํ”„๋กœ์ ํŠธ์˜ ์กฐ์ง ์ •์ฑ…์„ ์žฌ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์กฐ์ง ์ •์ฑ…์„ ์„ค์ •ํ•œ ๊ฒฝ์šฐ์—๋„ ๋‚ด๋ถ€ IP ์ฃผ์†Œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋น„๊ณต๊ฐœ App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ ์•ฑ์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • gcloud app deploy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ์— ๊ธฐ์กด ์„œ๋น„์Šค์˜ ์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ•œ ํ›„ App Engine ๋Œ€์‹œ๋ณด๋“œ์˜ '์š”์•ฝ' ๊ทธ๋ž˜ํ”„์— ํ‘œ์‹œ๋˜๋Š” '๊ฐœ์ˆ˜/์ดˆ' ์ธก์ •ํ•ญ๋ชฉ์ด ํ˜„์ €ํ•˜๊ฒŒ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธก์ •ํ•ญ๋ชฉ์€ ์•ž์œผ๋กœ 5~10๋ถ„ ๋™์•ˆ ์˜ˆ์ƒ๋˜๋Š” ์š”์ฒญ ์ˆ˜๋กœ ์ ์ฐจ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

    ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”์ฒญ ์ˆ˜๊ฐ€ ์ค„์–ด๋“  ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ•  ๋•Œ ์ƒˆ ๋ฒ„์ „์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋œ ์‹œ๊ฐ„๊ณผ ์ƒˆ ์ธ์Šคํ„ด์Šค์˜ ์ธก์ •ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ์‹œ๊ฐ„ ์‚ฌ์ด์— ์ง€์—ฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    ์ด ์ธก์ •ํ•ญ๋ชฉ์ด ์ƒˆ ๋ฒ„์ „ ๋ฐฐํฌ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

    1. gcloud app deploy --no-promote๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
    2. ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด 15๋ถ„ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
    3. ํŠธ๋ž˜ํ”ฝ์„ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

    --no-promote๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๋˜ ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ 15๋ถ„ ์ „์— ์ƒˆ ๋ฒ„์ „์— ์ผ์ •๋Ÿ‰์˜ ํŠธ๋ž˜ํ”ฝ์„ ํ• ๋‹นํ•˜๋ฉด ์ด ์ธก์ •ํ•ญ๋ชฉ์ด ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ์—์„œ๋Š” ์•ฑ์ด ํ•ญ์ƒ HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ž๋™์œผ๋กœ ์š”์ฒญ์„ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋ฏ€๋กœ app.yaml์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ App Engine ํ‘œ์ค€ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” secure ์„ค์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋Œ€์•ˆ์œผ๋กœ X-Forwarded-Proto ํ—ค๋” ๊ฐ’์„ ํŒŒ์‹ฑํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋‚ด ๋ฆฌ๋””๋ ‰์…˜์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Strict-Transport-Security ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ ๋ฒ„์ „์— ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ์„œ๋น„์Šค ๊ณ„์ •์„ ํ• ๋‹นํ•˜๋ฉด agent.googleapis.com ํ”„๋ฆฌํ”ฝ์Šค๊ฐ€ ๋ถ™์€ ์ธก์ •ํ•ญ๋ชฉ์˜ ๋น„์šฉ์ด ํ”„๋กœ์ ํŠธ์— ์ฒญ๊ตฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์—์ด์ „ํŠธ ์ธก์ •ํ•ญ๋ชฉ์€ ํ”„๋กœ์ ํŠธ์— ์š”๊ธˆ์ด ์ฒญ๊ตฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ App Engine ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ •์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • IAP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ VM ์ธ์Šคํ„ด์Šค์— SSH ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ธ์Šคํ„ด์Šค ์ˆ˜ ๊ฐ์†Œ

  • ๋“œ๋ฌผ์ง€๋งŒ ์˜์—ญ ์žฅ์• ๋กœ ์ธํ•ด ๋˜๋Š” ์ „์ฒด ์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน์ด ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์ธ์Šคํ„ด์Šค ์ˆ˜๊ฐ€ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์‹œ์Šคํ…œ์ด ์ตœ์†Œ ์ธ์Šคํ„ด์Šค ์ˆ˜ ๋ฏธ๋งŒ์œผ๋กœ ๋–จ์–ด์ง€์ง€ ์•Š๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜ค๋ฒ„ํ”„๋กœ๋น„์ €๋‹ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ min_num_instances ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ์˜ ์ตœ์†Œ ์ธ์Šคํ„ด์Šค ์ˆ˜์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    1. ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ ์ธ์Šคํ„ด์Šค ์—…๋ฐ์ดํŠธ ์ถœ์‹œ
    2. ์˜์—ญ ์žฅ์• (๋ฆฌ์ „์—์„œ ์„ ํƒํ•œ CPU ์šฉ๋Ÿ‰์— ๋„๋‹ฌํ•˜๋Š” ๋“ฑ์˜ ์†Œ์ง„ ๋ฌธ์ œ)

    App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ์€ 3๊ฐœ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐฐํฌํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์—์„œ๋Š” ํ•„์š”ํ•œ ์ธ์Šคํ„ด์Šค๋ณด๋‹ค 50% ๋งŽ์€ ์ธ์Šคํ„ด์Šค๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

์ผ๊ด€๋˜์ง€ ์•Š์€ Cloud Load Balancing ์ธก์ •ํ•ญ๋ชฉ

App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ ๋Œ€์‹œ๋ณด๋“œ์—๋Š” ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ ๊ด€๋ฆฌํ˜• ๋ฐฑ์—”๋“œ๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŒ…๋œ ์š”์ฒญ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ธก์ •ํ•ญ๋ชฉ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. App Engine ๊ฐ€๋ณ€ํ˜• ํ™˜๊ฒฝ์„ Cloud Load Balancing๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด App Engine ์ธก์ •ํ•ญ๋ชฉ ํ…Œ์ด๋ธ”์˜ ํŠน์ • ์ธก์ •ํ•ญ๋ชฉ์ด ๋Œ€์‹  loadbalancing ํ…Œ์ด๋ธ”์˜ ์ธก์ •ํ•ญ๋ชฉ์œผ๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ HTTP(S) ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ฐธ์กฐํ•˜์„ธ์š”.