์ธํ”„๋ผ ์ถ”์ฒœ์„ ์ฝ”๋“œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ


๊ฐœ์š”

Google Cloud Policy Intelligence๋Š” ๊ธฐ์—…์—์„œ ์ •์ฑ…์„ ์ดํ•ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์—ฌ ์œ„ํ—˜์„ ์ค„์ผ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์šฐ์ˆ˜ํ•œ ๊ฐ€์‹œ์„ฑ๊ณผ ์ž๋™ํ™” ๋•๋ถ„์— ๊ณ ๊ฐ์ด ์›Œํฌ๋กœ๋“œ๋ฅผ ๋Š˜๋ฆฌ์ง€ ์•Š๊ณ ๋„ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ฒœ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Google Cloud ๋ฆฌ์†Œ์Šค ๊ถŒ์žฅ์‚ฌํ•ญ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํด๋ผ์šฐ๋“œ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ  ๋น„์šฉ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๊ถŒ์žฅ์‚ฌํ•ญ ๋ชฉ๋ก์€ ์ถ”์ฒœ์ž ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” VM ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ํฌ๊ธฐ ๊ถŒ์žฅ์‚ฌํ•ญ ๋ฐ Identity and Access Management(IAM) ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ฒœ์ž๋Š” ๋จธ์‹ ๋Ÿฌ๋‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Google Cloud ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋ถˆํ•„์š”ํ•œ ์•ก์„ธ์Šค ์‚ญ์ œ ๋ฐ Compute Engine ์ธ์Šคํ„ด์Šค ํฌ๊ธฐ ์กฐ์ •์— ๋Œ€ํ•œ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

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

IAM ๊ถŒ์žฅ์‚ฌํ•ญ

๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ๊ถŒ์žฅ์‚ฌํ•ญ ์ค‘ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์€ ์ตœ์†Œ ๊ถŒํ•œ์˜ ๋ณด์•ˆ ์›์น™๊ณผ ์กฐ์ง ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ถœ์‹œํ•˜๊ณ  IaC ์ €์žฅ์†Œ์™€ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

VM์˜ ํฌ๊ธฐ ๊ถŒ์žฅ์‚ฌํ•ญ

ํฌ๊ธฐ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์Šคํ„ด์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธ์Šคํ„ด์Šค์˜ ๋จธ์‹  ์œ ํ˜• ํฌ๊ธฐ ์กฐ์ ˆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์—ฌ ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Policy Intelligence ๊ถŒ์žฅ์‚ฌํ•ญ์„ ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋ฐฉ์‹์œผ๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค๊ณ„ํ•˜๊ณ  ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ผ๋ถ€๋กœ ์ถ”์ฒœ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” VM ํฌ๊ธฐ ์กฐ์ • ๋ฐ IAM ์ •์ฑ… ๋ฐ”์ธ๋”ฉ ๊ถŒ์žฅ์‚ฌํ•ญ์— ๋”ฐ๋ผ Google Cloud ์กฐ์ง์— ์ ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์œผ๋กœ IaC ์ €์žฅ์†Œ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” Hashicorp Terraform์„ IaC ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Deployment Manager์™€ ๊ฐ™์€ ๋‹ค๋ฅธ IaC ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์„ค๋ช…๋œ ์ž๋™ ํŒŒ์ดํ”„๋ผ์ธ์— ์‚ฌ์šฉ๋œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด๊ณผ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • IaC ๊ตฌํ˜„์— ์ ํ•ฉํ•˜๋„๋ก ์ด ๊ฐ€์ด๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ์˜คํ”ˆ์†Œ์Šค ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ๋Š”Google Cloud์˜ ๊ด€๋ฆฌ, ๋ณด์•ˆ, ์ธํ”„๋ผ ๊ณ„ํš์„ ๋‹ด๋‹นํ•˜๋Š” ์„ค๊ณ„์ž, ์ œํ’ˆ ์†Œ์œ ์ž, ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ ์•„ํ‚คํ…์ฒ˜

๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ๋Š” ์ด ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ž๋™ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ตฌ์„ฑ์š”์†Œ

์˜ˆ์•ฝ๋œ Cloud Scheduler ์ž‘์—…์€ Recommender Parser ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” Recommender API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ง€์ •ํ•œ ํ”„๋กœ์ ํŠธ์˜ ์ถ”์ฒœ์ž ๊ถŒ์žฅ์‚ฌํ•ญ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋Ÿฌํ•œ VM ํฌ๊ธฐ ์กฐ์ • ๋ฐ IAM ๊ถŒ์žฅ์‚ฌํ•ญ์„ ํŒŒ์‹ฑํ•˜์—ฌ Terraform ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์žˆ๋Š” ๊ตฌ์„ฑ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ์ด๋Ÿฌํ•œ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๋„๋ก IaC ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ํฌํ•จ๋œ pull ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. pull ์š”์ฒญ์„ ๊ฒ€ํ† ํ•˜๊ณ  ๋ณ‘ํ•ฉํ•˜๋ฉด Cloud Build ์ž‘์—…์—์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„Google Cloud ์กฐ์ง์˜ ์ธํ”„๋ผ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜๋ฆฌ๋œ ๊ถŒ์žฅ์‚ฌํ•ญ ์ถ”์ , ๋นŒ๋“œ ์™„๋ฃŒ์— ๋Œ€ํ•œ ์•Œ๋ฆผ ์ƒ์„ฑ, Terraform ์ƒํƒœ ์ €์žฅ์„ ์œ„ํ•ด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ๋ณธ Google Cloud ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์„œ๋น„์Šค๋ฅผ ์ž์„ธํžˆ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ชฉ๋ก์—์„œ๋Š” ๊ตฌ์„ฑ์š”์†Œ ์šฉ๋„์™€ ์•ก์„ธ์Šค ์ œ์–ด ์š”๊ตฌ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ์ธํ…”๋ฆฌ์ „์Šค ์ถ”์ฒœ์ž
์šฉ๋„: ๋ณด์•ˆ ๋ฐ VM ํฌ๊ธฐ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ์ œ์–ด: Google Cloud ์„œ๋น„์Šค ๊ณ„์ •์—๋Š” Recommender API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ IAM ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ฒœ์ž ์—ญํ•  ๋ฐ ๊ถŒํ•œ์„ ๊ฒ€ํ† ํ•˜์—ฌ recommender-parser ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์—ญํ• ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

Cloud Scheduler

์šฉ๋„: Cloud Scheduler๊ฐ€ Recommender Parser ์„œ๋น„์Šค๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. Cloud Scheduler๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ๋งŒํผ์˜ ํŒŒ์„œ ์„œ๋น„์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ˜ธ์ถœ์€ ๋‹ค์Œ ์ž…๋ ฅ์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก
  • ์ถ”์ฒœ ์œ ํ˜•
  • IaC ์ €์žฅ์†Œ ์ด๋ฆ„

์•ก์„ธ์Šค ์ œ์–ด: Cloud Scheduler์—์„œ ์ถ”์ฒœ์ž ํŒŒ์„œ ์„œ๋น„์Šค๋กœ์˜ ํ˜ธ์ถœ์— ์‚ฌ์šฉํ•  Google Cloud ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ •์ด Cloud Scheduler ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ๊ณ„์ •์— Cloud Scheduler ์„œ๋น„์Šค ์—์ด์ „ํŠธ ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์„œ๋น„์Šค ๊ณ„์ •์—์„œ Cloud Run ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ์ด ๊ณ„์ •์— Cloud Run ํ˜ธ์ถœ์ž ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์Šค์ผ€์ค„๋Ÿฌ ์ž‘์—…์— ๋Œ€ํ•œ ์ธ์ฆ๋œ ์•ก์„ธ์Šค ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Cloud Run

์šฉ๋„: recommender-parser ์„œ๋น„์Šค๋Š” ๋ชจ๋“  ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์ƒ์ฃผํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ ๊ฒฝ๋กœ๋Š” ํŠน์ • ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ๊ฐ ๊ถŒ์žฅ์‚ฌํ•ญ ์œ ํ˜•์˜ ๊ถŒ์žฅ์‚ฌํ•ญ ํŒŒ์‹ฑ
  • ์ฒ˜๋ฆฌ ์ค‘์ธ ๊ถŒ์žฅ์‚ฌํ•ญ์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ

์•ก์„ธ์Šค ์ œ์–ด: IAM์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ „์šฉ ์„œ๋น„์Šค ๊ณ„์ •์— ์„œ๋น„์Šค๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋น„์Šค๋งŒ Firestore์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Hashicorp Terraform

์šฉ๋„: Terraform 0.12๋Š” IaC ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

Terraform์šฉ Cloud Build ๋นŒ๋”๋Š” Terraform ๋ช…๋ น์–ด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ Cloud Build ์„œ๋น„์Šค ๊ณ„์ •์€ ์ด๋Ÿฌํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Cloud Build

์šฉ๋„: Google Cloud Build๋Š” Policy Intelligence ๊ถŒ์žฅ์‚ฌํ•ญ์— ๋”ฐ๋ผ IaC ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ธฐ์ค€์œผ๋กœ ์ธํ”„๋ผ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ์ œ์–ด: Cloud Build ์„œ๋น„์Šค ๊ณ„์ •์— ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์˜ ๋ฆฌ์†Œ์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ๊ถŒํ•œ ์ง‘ํ•ฉ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Cloud Build ์„œ๋น„์Šค ๊ณ„์ • ๊ตฌ์„ฑ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

GitHub

์šฉ๋„: IaC ์ €์žฅ์†Œ๋Š” ์†Œ์Šค ์ œ์–ด๋ฅผ ์œ„ํ•ด GitHub๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. GitHub์˜ IaC ์ €์žฅ์†Œ๋Š” Cloud Build์™€ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹์ด ์ˆ˜ํ–‰๋˜๋ฉด ์‚ฌ์ „ ๊ตฌ์„ฑ๋œ ์ž‘์—… ์ง‘ํ•ฉ์„ ์‹คํ–‰ํ•˜๋„๋ก Cloud Build ์ž‘์—…์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ์ œ์–ด: IaC ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด SSH ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ GitHub์—์„œ ์ปค๋ฐ‹์„ ํ‘ธ์‹œํ•˜๋ ค๋ฉด ๊ฐœ์ธ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Firestore

Firestore๋Š” ์ด ์•„ํ‚คํ…์ฒ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์™„์ „ ๊ด€๋ฆฌํ˜• ํ™•์žฅํ˜• NoSQL ๋ฌธ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ, Git ์ปค๋ฐ‹๊ณผ ๊ด€๋ จ๋œ ํ•ด๋‹น ์„ธ๋ถ€์ •๋ณด์™€ ํ•จ๊ป˜ Recommender Parser ์„œ๋น„์Šค์—์„œ ํŒŒ์‹ฑํ•œ ๊ถŒ์žฅ์‚ฌํ•ญ ID์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Firestore์— ์œ ์ง€๋˜๋Š” ์„ธ๋ถ€์ •๋ณด๋Š” ์—”๋“œ ํˆฌ ์—”๋“œ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ผ๋ถ€์ธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Recommender API๊ฐ€ ์ƒ์„ฑํ•œ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์„ ํƒํ•˜๊ณ  ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ์„œ๋น„์Šค๊ฐ€ ๊ถŒ์žฅ์‚ฌํ•ญ ์ƒํƒœ๋ฅผ CLAIMED๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ถŒ์žฅ์‚ฌํ•ญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉ๋˜๋ฉด ์„œ๋น„์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฟผ๋ฆฌํ•˜์—ฌ Cloud Build ์ž‘์—…์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉ๋œ ๊ถŒ์žฅ์‚ฌํ•ญ ID๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๊ถŒ์žฅ์‚ฌํ•ญ ์ƒํƒœ๋ฅผ SUCCEEDED๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. Cloud Build ์ž‘์—…์ด ์‹คํŒจํ•˜๋ฉด ๊ถŒ์žฅ์‚ฌํ•ญ ์ƒํƒœ๊ฐ€ FAILED๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ์ œ์–ด: ์ž์„ธํ•œ ๋‚ด์šฉ์€ Firestore ์—ญํ• ์„ ์ฐธ์กฐํ•˜์„ธ์š”. recommender-parser ์„œ๋น„์Šค๋Š” Firestore์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ด๋ฅผ ์œ„ํ•ด roles/datastore.user ์—ญํ• ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Pub/Sub

์šฉ๋„: Cloud Build๋Š” ๋นŒ๋“œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ(์˜ˆ: ๋นŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ๋นŒ๋“œ๊ฐ€ ์ž‘๋™ ์ƒํƒœ๋กœ ์ „ํ™˜๋  ๋•Œ, ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ) Pub/Sub ์ฃผ์ œ์— ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

Cloud Build๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” Pub/Sub ์ฃผ์ œ๋ฅผ cloud-builds๋ผ๊ณ  ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์—์„œ Cloud Build API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ์ œ์–ด: ํ‘ธ์‹œ ๊ตฌ๋…์€ ์„œ๋น„์Šค์—์„œ ์š”์ฒญ์„ ์Šน์ธํ•˜๋„๋ก ์ธ์ฆ ํ—ค๋”๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ‘ธ์‹œ ๊ตฌ๋… ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ชฉํ‘œ

  • ๋‹ค์Œ์„ ์œ„ํ•œ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ ๋นŒ๋“œ
    • ํ”Œ๋žซํผ Policy Intelligence ๊ถŒ์žฅ์‚ฌํ•ญ ์‚ฌ์ „ ๋ชจ๋‹ˆํ„ฐ๋ง
    • ๊ถŒ์žฅ์‚ฌํ•ญ ํŒŒ์‹ฑ ๋ฐ ๊ธฐ์กด IaC ์ €์žฅ์†Œ์— ์—…๋ฐ์ดํŠธ ์ ์šฉ
  • Google Cloud ์„œ๋น„์Šค ๋ชจ์Œ์ธ Hashicorp Terraform ๋ฐ GitHub๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํŒŒ์ดํ”„๋ผ์ธ์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.
  • ์ด ํŒŒ์ดํ”„๋ผ์ธ์„ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•˜๋Š” ๊ฐ€์ •๊ณผ ๊ถŒ์žฅ์‚ฌํ•ญ ์ดํ•ด
  • ํŒŒ์ดํ”„๋ผ์ธ ํ…Œ์ŠคํŠธ

๋น„์šฉ

์ด ๋ฌธ์„œ์—์„œ๋Š” ๋น„์šฉ์ด ์ฒญ๊ตฌ๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Google Cloud๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Cloud Run
  • Cloud Build
  • Compute Engine
  • Cloud Storage
  • Firestore
  • Pub/Sub
  • Cloud Scheduler
  • Recommender

ํ”„๋กœ์ ํŠธ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ธฐ์ค€์œผ๋กœ ์˜ˆ์ƒ ๋น„์šฉ์„ ์‚ฐ์ถœํ•˜๋ ค๋ฉด ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Google Cloud ์‹ ๊ทœ ์‚ฌ์šฉ์ž๋Š” ๋ฌด๋ฃŒ ์ฒดํ—˜ํŒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” GitHub ๊ณ„์ •์ด ์žˆ๊ณ  Git, Node.js, Terraform, Docker์— ์ต์ˆ™ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์‹œ ๋…ธํŠธ ๋ฐ ๊ฐ€์ •

IaC ๋„๊ตฌ ๋ฐ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์—๋Š” ๋งŽ์€ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ •๋ณด๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ ์ด ํŠœํ† ๋ฆฌ์–ผ์„ IaC ํŒŒ์ดํ”„๋ผ์ธ์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ข…๋ฅ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ํŒŒ์ดํ”„๋ผ์ธ์€ Terraform ๋ฒ„์ „ 0.12๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. HCL ๊ตฌ์„ฑ ๊ตฌ๋ฌธ์˜ ์ค‘์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด๋‚˜ Terraform ์ƒํƒœ ํŒŒ์ผ์˜ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ํŒŒ์ดํ”„๋ผ์ธ์€ IaC ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์ค‘์ฒฉ๋˜์ง€ ์•Š์œผ๋ฉฐ IaC ์ €์žฅ์†Œ ํ•˜๋‚˜๊ฐ€ Google Cloud ํ”„๋กœ์ ํŠธ ํ•˜๋‚˜ ์ด์ƒ์— ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ Terraform ๋ณ€์ˆ˜๋Š” ๋ช…๋ น์ค„ ์ธ์ˆ˜๊ฐ€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž…์€ tfvars ํŒŒ์ผ์— ์žˆ๋Š” Terraform ๋ณ€์ˆ˜์˜ ์„ ์–ธ์  ๊ตฌ์„ฑ์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ• ์˜ ๊ถŒํ•œ ํ•˜์œ„ ์ง‘ํ•ฉ์ด 60์ผ ๋™์•ˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๊ณ  VM ํฌ๊ธฐ ๊ถŒ์žฅ์‚ฌํ•ญ์ด ์œ ์‚ฌํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ๊ฒฝ์šฐ ์ถ”์ฒœ์ž๋Š” IAM ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด ํŒŒ์ดํ”„๋ผ์ธ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ˜ํ”Œ ์ถ”์ฒœ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • ์ด ์ถœ์‹œ ๋ฒ„์ „์—์„œ๋Š” Terraform ๋‚ด ๋ฃจํ”„๊ฐ€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Terraform ๋ชจ๋“ˆ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์˜คํ”ˆ์†Œ์Šค์ด๋ฉฐ, ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆ ์‚ฌ์šฉ๋ฒ•์— ๋งž์ถ”๋„๋ก ํŒŒ์‹ฑ ํ๋ฆ„์— ํ•„์š”ํ•œ ํŠน์ • ๊ฐ•ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์˜คํ”ˆ์†Œ์Šค Recommender Parser ์„œ๋น„์Šค ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•Œ๋ ค์ง„ IAM ๊ถŒ์žฅ์‚ฌํ•ญ ์ œํ•œ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์š”๊ฑด

  1. Google Cloud ํ”„๋กœ์ ํŠธ ๋‘ ๊ฐœ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ํ”„๋กœ์ ํŠธ ์„ ํƒ๊ธฐ ํŽ˜์ด์ง€๋กœ ์ด๋™

    • ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ํ˜ธ์ŠคํŒ…ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” build ํ”„๋กœ์ ํŠธ
    • ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” Google Cloud ๋ฆฌ์†Œ์Šค๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” test ํ”„๋กœ์ ํŠธ
  2. Verify that billing is enabled for your Google Cloud project.

  3. test ํ”„๋กœ์ ํŠธ์—์„œ Recommender ๋ฐ Compute Engine API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    Enable the APIs

  4. build ํ”„๋กœ์ ํŠธ์—์„œ Cloud Run, Firestore, Pub/Sub, Cloud Scheduler, IAM, CloudResourceManager API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    Enable the APIs

์ด ํŠœํ† ๋ฆฌ์–ผ์„ ๋งˆ์น˜๋ฉด ๋งŒ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜์—ฌ ๋น„์šฉ์ด ๊ณ„์† ์ฒญ๊ตฌ๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ญ์ œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ™˜๊ฒฝ ์„ค์ •ํ•˜๊ธฐ

  1. Google Cloud ์ฝ˜์†”์—์„œ build ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. Google Cloud ์ฝ˜์†”์—์„œ Cloud Shell๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud Shell๋กœ ์ด๋™

    Google Cloud ์ฝ˜์†” ํ•˜๋‹จ์—์„œ Cloud Shell ์„ธ์…˜์ด ์—ด๋ฆฌ๊ณ  ๋ช…๋ น์ค„ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Cloud Shell์€ Google Cloud CLI๊ฐ€ ์‚ฌ์ „ ์„ค์น˜๋œ ์…€ ํ™˜๊ฒฝ์œผ๋กœ, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ’์ด ์ด๋ฏธ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ์…˜์ด ์ดˆ๊ธฐํ™”๋˜๋Š” ๋ฐ ๋ช‡ ์ดˆ ์ •๋„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ด ํŠœํ† ๋ฆฌ์–ผ์˜ ๋ชจ๋“  ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์–ด์— Cloud Shell์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  3. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ build ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    export BUILD_PROJECT_ID=$DEVSHELL_PROJECT_ID
    
  4. test ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ ID๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•˜๊ณ  PROJECT-ID๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    export TEST_PROJECT_ID=PROJECT-ID
  5. ๋ฆฌ์ „ ๋ฐ ์˜์—ญ๊ณผ ๊ฐ™์ด ๊ฐ€์ด๋“œ ์ „๋ฐ˜์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์˜ ๊ธฐ๋ณธ ์„ค์ •์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” us-central1์„ ๊ธฐ๋ณธ ๋ฆฌ์ „์œผ๋กœ, us-central1-b๋ฅผ ๊ธฐ๋ณธ ์˜์—ญ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  6. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ด ํŠœํ† ๋ฆฌ์–ผ์˜ ๊ธฐ๋ณธ ๋ฆฌ์ „๊ณผ ์˜์—ญ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    gcloud config set compute/zone us-central1-b --project $BUILD_PROJECT_ID
    gcloud config set compute/zone us-central1-b --project $TEST_PROJECT_ID
    
  7. build ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    gcloud config set project $BUILD_PROJECT_ID
    
  8. build ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ์— ๋Œ€ํ•œ BUILD_PROJECT_NUMBER๋ผ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋งŒ๋“ค๊ธฐ

    export BUILD_PROJECT_NUMBER=$(gcloud projects describe $DEVSHELL_PROJECT_ID --format='value(projectNumber)')
    
  9. ์ด ํŠœํ† ๋ฆฌ์–ผ์˜ GitHub ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•ฉ๋‹ˆ๋‹ค.

Terraform ์ƒํƒœ์šฉ ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ

build ํ”„๋กœ์ ํŠธ์—์„œ Terraform ์ƒํƒœ ํŒŒ์ผ์„ ์ €์žฅํ•  Cloud Storage ๋ฒ„ํ‚ท์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud storage buckets create gs://recommender-tf-state-$BUILD_PROJECT_ID \
  --project=${BUILD_PROJECT_ID} --location=us-central1

GitHub ์ €์žฅ์†Œ ๋งŒ๋“ค๊ธฐ

์ƒ˜ํ”Œ IaC ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•  GitHub ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  1. ์ƒˆ ๋น„๊ณต๊ฐœ GitHub ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด IAC-REPO-NAME ์ €์žฅ์†Œ๋Š” ์ด ํŠœํ† ๋ฆฌ์–ผ์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ IaC ์ €์žฅ์†Œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ํด๋ก ๋œ ์ €์žฅ์†Œ์˜ sample-iac ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ์„ GitHub ๊ณ„์ •์œผ๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.

    1. Cloud Shell์—์„œ sample-iac ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  GitHub๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.

      cp -r recommender-iac-pipeline-nodejs-tutorial/sample-iac $HOME
      
    2. ์ƒˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™

      cd $HOME/sample-iac
      
    3. ๋กœ์ปฌ ๋จธ์‹ ์—์„œ ์ €์žฅ์†Œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

      git init
      
    4. IAC-REPO-NAME์„ ์›๊ฒฉ ์ €์žฅ์†Œ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  IAC-REPO-NAME ๋ฐ GITHUB-ACCOUNT๋ฅผ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

      git remote add origin https://github.com/GITHUB-ACCOUNT/IAC-REPO-NAME
    5. ์ด ์ €์žฅ์†Œ์˜ ํŒŒ์ผ์— ์žˆ๋Š” ์ž๋ฆฌํ‘œ์‹œ์ž๋ฅผ test ํ”„๋กœ์ ํŠธ ID์™€ Terraform Cloud Storage ๋ฒ„ํ‚ท ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

      sed -i "s|__PROJECT_ID__|${TEST_PROJECT_ID}|g" ./terraform.tfvars
      
      sed -i "s|__STATE_BUCKET_NAME__|recommender-tf-state-$BUILD_PROJECT_ID|g" ./backend.tf
      
    6. GitHub์— ์ถ”๊ฐ€, ์ปค๋ฐ‹, ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.

      git add .
      git commit -m "First Commit"
      git push origin master
      
    7. ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด GitHub ๊ณ„์ •์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

์ €์žฅ์†Œ์šฉ SSH ํ‚ค ์ƒ์„ฑ

GitHub์—์„œ IaC ์ €์žฅ์†Œ๋กœ SSH ํ‚ค ์ธ์ฆ์„ ์„ค์ •ํ•˜๊ณ  Cloud Storage์— ํ‚ค๋ฅผ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

  1. GitHub ์ €์žฅ์†Œ์šฉ SSH ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    1. SSH ํ‚ค ์Œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. your_email@example.com์„ GitHub ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Cloud Shell์—์„œ ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      ssh-keygen -t rsa -b 4096 -m PEM -C "your_email@example.com"
    2. 'ํ‚ค๋ฅผ ์ €์žฅํ•  ํŒŒ์ผ์„ ์ž…๋ ฅํ•˜์„ธ์š”' ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด Enter ํ‚ค๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ธฐ๋ณธ ํŒŒ์ผ ์œ„์น˜๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

    3. ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด Enter๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.

  2. ๋‹ค์šด๋กœ๋“œํ•œ SSH ํ‚ค๋ฅผ ์ €์žฅํ•  SSH-KEYS-DIR ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•ด ๋‘ก๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์œ„์น˜๋Š” $HOME/.ssh/์ž…๋‹ˆ๋‹ค.

  3. ์ƒ์„ฑํ•œ SSH ๊ณต๊ฐœ ํ‚ค๋ฅผ GitHub ์ €์žฅ์†Œ์— ๋ฐฐํฌ ํ‚ค๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    1. Cloud Shell์—์„œ ์ƒ์„ฑํ•œ SSH ๊ณต๊ฐœ ํ‚ค๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. SSH-KEYS-DIR๋ฅผ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

      cat SSH-KEYS-DIR/id_rsa.pub
    2. GitHub ๊ณ„์ •์—์„œ IAC-REPO-NAME ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    3. ์„ค์ • > ํ‚ค ๋ฐฐํฌ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    4. ๋ฐฐํฌ ํ‚ค ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋ณต์‚ฌํ•œ SSH ๊ณต๊ฐœ ํ‚ค๋ฅผ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค. ํ‚ค์˜ ์ œ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    5. '์“ฐ๊ธฐ ์•ก์„ธ์Šค ํ—ˆ์šฉ' ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

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

  4. Cloud Shell ์„ธ์…˜์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

  5. GitHub์šฉ known_hosts ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Cloud Shell ์„ธ์…˜์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ssh-keyscan github.com >> ~/.ssh/known_hosts
    
  6. build ํ”„๋กœ์ ํŠธ์— Cloud Storage ๋ฒ„ํ‚ท์„ ๋งŒ๋“ค๊ณ  SSH ํ‚ค์™€ known_hosts ํŒŒ์ผ์„ ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. SSH-KEYS-DIR๋ฅผ SSH ํ‚ค๋ฅผ ์ƒ์„ฑํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    gcloud storage buckets create gs://github-keys-$BUILD_PROJECT_ID --project=${BUILD_PROJECT_ID} --location=us-central1
    
    gcloud storage cp SSH-KEYS-DIR/id_rsa* gs://github-keys-$BUILD_PROJECT_ID
    gcloud storage cp SSH-KEYS-DIR/known_hosts gs://github-keys-$BUILD_PROJECT_ID
  7. GitHub์šฉ ๊ฐœ์ธ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํ† ํฐ์€ recommender-parser ์„œ๋น„์Šค๊ฐ€ pull ์š”์ฒญ, ์—…๋ฐ์ดํŠธ๋œ ์ฒดํฌ์ธ IaC ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” API ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ Git ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    1. GitHub ๊ณ„์ •์˜ ํŽ˜์ด์ง€ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ์žˆ๋Š” ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ํด๋ฆญํ•œ ํ›„ ์„ค์ •์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    2. ์™ผ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ๊ฐœ๋ฐœ์ž ์„ค์ •์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    3. ์™ผ์ชฝ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ๊ฐœ์ธ ์•ก์„ธ์Šค ํ† ํฐ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    4. ์ƒˆ ํ† ํฐ ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    5. ํ† ํฐ์— ์„ค๋ช…์ด ํฌํ•จ๋œ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

    6. ๋ฒ”์œ„๋ฅผ ์ €์žฅ์†Œ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    7. ํ† ํฐ ์ƒ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    8. ํด๋ฆฝ๋ณด๋“œ์— ํ† ํฐ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    9. Cloud Shell ์„ธ์…˜์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

      export GITHUB_PAT=personal-access-token-you-copied

Cloud Build ์„ค์ •

  1. IAC-REPO-NAME Git ์ €์žฅ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ Cloud Build์™€ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค.

    1. GitHub Marketplace์˜ Cloud Build ์•ฑ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    2. ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•˜์—ฌ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ์žˆ๋Š” Google Cloud Build๋กœ ์„ค์ •์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    3. ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด GitHub์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
    4. ์ €์žฅ์†Œ๋งŒ ์„ ํƒ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ์†Œ ์„ ํƒ ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ Cloud Build ์•ฑ์—์„œ IAC-REPO-NAME์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ๋งŒ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    5. ์„ค์น˜๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    6. Google Cloud์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

      ์Šน์ธ ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ์—ฌ๊ธฐ์— Google Cloud Build ์•ฑ์ด Google Cloud์— ์—ฐ๊ฒฐ๋˜๋„๋ก ์Šน์ธํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    7. Authorize Google Cloud Build by GoogleCloudBuild(GoogleCloudBuild๋กœ Google Cloud Build ์Šน์ธ)๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. Google Cloud Console๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.

    8. Google Cloud ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    9. ๋™์˜ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ณ  ๋‹ค์Œ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    10. ์ €์žฅ์†Œ ์„ ํƒ ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด IAC-REPO-NAME GitHub ์ €์žฅ์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    11. ์ €์žฅ์†Œ ์—ฐ๊ฒฐ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    12. ํŠธ๋ฆฌ๊ฑฐ ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ ์ •์˜๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

    13. ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ ๋นŒ๋“œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub์—์„œ ๋นŒ๋“œ ์‹คํ–‰์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  2. ๋ณต์‚ฌํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์—๋Š” cloudbuild.yaml ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ ํŒŒ์ผ์€ Cloud Build ์ž‘์—…์ด ํŠธ๋ฆฌ๊ฑฐ๋  ๋•Œ ์‹คํ–‰ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

    steps:
    - name: hashicorp/terraform:0.12.0
      args: ['init']
    - name: hashicorp/terraform:0.12.0
      args: ['apply', '-auto-approve']
    
  3. Cloud Build ์„œ๋น„์Šค ๊ณ„์ •์— ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ์„œ๋น„์Šค ๊ณ„์ •, ์—ฐ๊ฒฐ ์—ญํ• , ๊ฐ€์ƒ ๋จธ์‹ (Compute Engine ์ธ์Šคํ„ด์Šค)์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:$BUILD_PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role roles/compute.admin \
      --project $TEST_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:$BUILD_PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role roles/iam.serviceAccountAdmin \
      --project $TEST_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
    --member serviceAccount:$BUILD_PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
    --role roles/iam.securityAdmin \
    --project $TEST_PROJECT_ID
    
  4. Google Cloud ์ฝ˜์†”์—์„œ ํŠธ๋ฆฌ๊ฑฐ ํŽ˜์ด์ง€๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

  5. build ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  ์—ด๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  6. ํŠธ๋ฆฌ๊ฑฐ ์ •์˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    1. ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•œ ๋‹ค์Œ ์ˆ˜์ •์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. ๊ตฌ์„ฑ์—์„œ Cloud Build ๊ตฌ์„ฑ ํŒŒ์ผ(yaml ๋˜๋Š” json) ์˜ต์…˜์„ ์„ ํƒํ•˜๊ณ  ํ…์ŠคํŠธ ์ž…๋ ฅ๋ž€์— cloudbuild.yaml์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    3. ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  7. ๋นŒ๋“œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ํŠธ๋ฆฌ๊ฑฐ ๋ชฉ๋ก์˜ ํŠธ๋ฆฌ๊ฑฐ ํ•ญ๋ชฉ์—์„œ ์‹คํ–‰์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  8. tf-compute-1์ด๋ผ๋Š” Compute Engine ์ธ์Šคํ„ด์Šค์™€ Terraform Recommender Test๋ผ๋Š” ์„œ๋น„์Šค ๊ณ„์ •์ด ์ด์ „ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰ํ•œ Cloud Build ์ž‘์—…์œผ๋กœ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์— ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

recommender-parser Cloud Run ์„œ๋น„์Šค ๋ฐฐํฌ

  1. Cloud Shell์—์„œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•˜์—ฌ ๋งŒ๋“  ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    cd $HOME/recommender-iac-pipeline-nodejs-tutorial/parser-service
    
  2. Cloud Run ์„œ๋น„์Šค์— ๊ธฐ๋ณธ ๋ฆฌ์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก Google Cloud ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” us-central1 ๋ฆฌ์ „์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ง€์›๋˜๋Š” ๋‹ค๋ฅธ ๋ฆฌ์ „์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    gcloud config set run/region us-central1
    
  3. parser-service ๋””๋ ‰ํ„ฐ๋ฆฌ์—๋Š” recommender-parser ์„œ๋น„์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ˜ํ”Œ ํŽ˜์ด๋กœ๋“œ JSON์ด ๋ช‡ ๊ฐœ ์žˆ๋Š” ์Šคํ„ฐ๋ธŒ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ sed ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ด๋Ÿฌํ•œ JSON์˜ PROJECT_ID ์ž๋ฆฌํ‘œ์‹œ์ž๋ฅผ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ ID๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    sed -i "s|__PROJECT_ID__|${TEST_PROJECT_ID}|g" ./stub/iam.json
    sed -i "s|__PROJECT_ID__|${TEST_PROJECT_ID}|g" ./stub/vm.json
    
  4. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Docker ์ด๋ฏธ์ง€์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    export IMAGE=gcr.io/$BUILD_PROJECT_ID/recommender-parser:1.0
    
  5. ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  Container Registry์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    gcloud builds submit --tag $IMAGE .
    
  6. recommender-parser ์„œ๋น„์Šค์˜ ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ค์–ด ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‹ค๋ฅธ Google Cloud ์„œ๋น„์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. Cloud Run ์„œ๋น„์Šค์— ๋ณด๋‹ค ์„ธ๋ถ„ํ™”๋œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Run ์„œ๋น„์Šค ID๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    gcloud beta iam service-accounts create recommender-parser-sa \
      --description "Service account that the recommender-parser service uses to invoke other Google Cloud services" \
      --display-name "recommender-parser-sa" \
      --project $BUILD_PROJECT_ID
    
  7. recommender-parser ์„œ๋น„์Šค๋Š” ์•ž์—์„œ ๋งŒ๋“  Cloud Storage ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•œ GitHub SSH ํ‚ค์™€ Terraform ์ƒํƒœ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ •์„ Cloud Storage ๋ฒ„ํ‚ท์— ๊ตฌ์„ฑ์›์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    gcloud storage buckets add-iam-policy-binding gs://github-keys-$BUILD_PROJECT_ID \
      --member=serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/storage.objectUser
    
    gcloud storage buckets add-iam-policy-binding gs://recommender-tf-state-$BUILD_PROJECT_ID \
      --member=serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/storage.objectUser
    
  8. recommender-parser ์„œ๋น„์Šค์˜ ์„œ๋น„์Šค ๊ณ„์ •์— Firestore, Recommender, Service Usage API์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/datastore.user
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/recommender.iamAdmin
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/recommender.iamViewer
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/recommender.computeAdmin
    
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/serviceusage.serviceUsageConsumer
    
  9. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ recommender-parser๋ผ๋Š” Cloud Run ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. GITHUB-ACCOUNT๋ฅผ ์ด๋ฉ”์ผ์ด ์•„๋‹Œ GitHub ๊ณ„์ • ์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

    gcloud run deploy \
     --image=${IMAGE} \
     --no-allow-unauthenticated \
     --region us-central1 \
     --platform managed \
     --service-account recommender-parser-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
     --set-env-vars="GITHUB_ACCOUNT=github.com:GITHUB-ACCOUNT,GITHUB_PAT=${GITHUB_PAT},SSH_KEYS_BUCKET=github-keys-${BUILD_PROJECT_ID},TERRAFORM_STATE_BUCKET=recommender-tf-state-$BUILD_PROJECT_ID" \
     --project $BUILD_PROJECT_ID \
     recommender-parser

Firestore ์„ค์ •

  1. Google Cloud Console์˜ build ํ”„๋กœ์ ํŠธ์—์„œ Firestore ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ชจ๋“œ ์„ ํƒ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๊ธฐ๋ณธ ๋ชจ๋“œ ์„ ํƒ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ธฐ๋ณธ ์œ„์น˜๋กœ us-east1์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

recommender-parser ์„œ๋น„์Šค๋Š” ๋‹ค์Œ ๋ชฉ์ ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์”๋‹ˆ๋‹ค.

  • Recommender API์—์„œ ๊ฒ€์ƒ‰ํ•œ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.
  • ๊ถŒ์žฅ์‚ฌํ•ญ์ด ์ฒ˜๋ฆฌ๋˜๋ฉด ๊ฐ ์ฒ˜๋ฆฌ๋œ ๊ถŒ์žฅ์‚ฌํ•ญ์˜ ์ƒํƒœ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ SUCCEEDED ๋˜๋Š” FAILED๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด Recommender API๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ถŒ์žฅ์‚ฌํ•ญ์ด ๋ถˆ์™„์ „ํ•˜๊ฒŒ ๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ฉฑ๋“ฑ์„ฑ์„ ๊ฐ–๋„๋ก ํ•˜๋Š” ํ•ต์‹ฌ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

Cloud Scheduler ์ž‘์—… ์„ค์ •

  1. Cloud Scheduler ์ž‘์—…์ด recommender-parser ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    gcloud beta iam service-accounts create recommender-scheduler-sa \
      --description "Service Account used by Cloud Scheduler to invoke the recommender-parser service" \
      --display-name "recommender-scheduler-sa" \
      --project $BUILD_PROJECT_ID
    
  2. ์„œ๋น„์Šค ๊ณ„์ •์— Cloud Run ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” run/invoker ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

    gcloud beta run services add-iam-policy-binding recommender-parser \
    --member=serviceAccount:recommender-scheduler-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
    --role=roles/run.invoker \
    --region=us-central1
    
  3. recommender-service URL์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    gcloud beta run services list --platform managed --project $BUILD_PROJECT_ID
    

    Cloud Scheduler ์ž‘์—…์€ IAM ๊ถŒ์žฅ์‚ฌํ•ญ ํ•ญ๋ชฉ์„ ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ recommender-parser ์„œ๋น„์Šค์˜ /recommendation/iam ๊ฒฝ๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  VM ํฌ๊ธฐ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ /recommender/vm ๊ฒฝ๋กœ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

  4. Cloud Scheduler ์ž‘์—…์ด ํ˜ธ์ถœํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ์˜ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. RECOMMENDER-SERVICE-URL์„ ์ด์ „ ๋‹จ๊ณ„์—์„œ ๋ณต์‚ฌํ•œ recommender-service URL๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    export RECOMMENDER_ROUTE_TO_INVOKE_IAM=RECOMMENDER-SERVICE-URL/recommendation/iam

    ๊ฒฝ๋กœ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„์— URL์ด ์ด ์ƒ˜ํ”Œ URL๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    RECOMMENDER-SERVICE-URL/recommendation/iam
    
  5. recommender-iam-scheduler.๋ผ๋Š” Cloud Scheduler ์ž‘์—…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    • ๊ฐœ๋ฐœ์ž ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ ํƒ๋œ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    • IAC-REPO-NAME๋ฅผ ์ƒ์„ฑํ•œ GitHub ์ €์žฅ์†Œ์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ์€ ์„ธ ๊ฐ€์ง€ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • repo: GitHub ์ €์žฅ์†Œ ๋งŒ๋“ค๊ธฐ์—์„œ ๋งŒ๋“  GitHub ์ €์žฅ์†Œ IAC-REPO-NAME์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

    • projects: ์ด IaC GitHub ์ €์žฅ์†Œ๊ฐ€ ๋งคํ•‘๋˜๋Š” Google Cloud ํ”„๋กœ์ ํŠธ ID์˜ ๋ชฉ๋ก/๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” test ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

    • stub: ์—ญํ• ์˜ ๊ถŒํ•œ ํ•˜์œ„ ์ง‘ํ•ฉ์ด 60์ผ ๋™์•ˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  VM ํฌ๊ธฐ ๊ถŒ์žฅ์‚ฌํ•ญ์ด ์œ ์‚ฌํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ๊ฒฝ์šฐ ์ถ”์ฒœ์ž๋Š” IAM ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์‹œ ์ด ํŒŒ์ดํ”„๋ผ์ธ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก stub์„ true๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ ํด๋ก ํ•œ ์ €์žฅ์†Œ์— ์ œ๊ณต๋˜๋Š” ์ƒ˜ํ”Œ ์ถ”์ฒœ์ž ํŽ˜์ด๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    gcloud beta scheduler jobs create http recommender-iam-scheduler \
      --project $BUILD_PROJECT_ID \
      --time-zone "America/Los_Angeles" \
      --schedule="0 */3 * * *" \
      --uri=$RECOMMENDER_ROUTE_TO_INVOKE_IAM \
      --description="Scheduler job to invoke recommendation pipeline" \
      --oidc-service-account-email="recommender-scheduler-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com" \
      --headers="Content-Type=application/json" \
      --http-method="POST" \
      --message-body="{ \"repo\": \"IAC-REPO-NAME\", \"projects\": [\"$TEST_PROJECT_ID\"], \"location\": \"global\", \"stub\": true }"

์ถ”๊ฐ€ ๋‹จ๊ณ„

Cloud Build๋Š” ๋นŒ๋“œ ํ”„๋กœ์ ํŠธ์—์„œ Cloud Build API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ cloud-builds๋ผ๋Š” Pub/Sub ์ฃผ์ œ์— ๋นŒ๋“œ ์ •๋ณด๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ build ํ”„๋กœ์ ํŠธ์— cloud-builds ์ฃผ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    gcloud pubsub topics describe cloud-builds
    

    ์ฃผ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค์Œ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ BUILD-PROJECT-ID๋Š” ๋นŒ๋“œ ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.

    name: projects/BUILD-PROJECT-ID/topics/cloud-builds
    

    ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๋นŒ๋“œ ์•Œ๋ฆผ ๊ตฌ๋…์˜ ์•ˆ๋‚ด์— ๋”ฐ๋ผ ์ฃผ์ œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  2. Pub/Sub์ด recommender-parser ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    gcloud beta iam service-accounts create recommender-ci-subscription-sa \
      --description "Service Account used by Cloud Pub/Sub to push Cloud Build events to the recommender-parser service" \
      --display-name "recommender-ci-subscription-sa" \
      --project $BUILD_PROJECT_ID
    
  3. Pub/Sub ์„œ๋น„์Šค ๊ณ„์ •์€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  recommender-parser ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์—ญํ• ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/pubsub.publisher \
      --project $BUILD_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/pubsub.subscriber \
      --project $BUILD_PROJECT_ID
    
    gcloud projects add-iam-policy-binding $BUILD_PROJECT_ID \
      --member serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role roles/run.invoker \
      --project $BUILD_PROJECT_ID
    
  4. ์ƒ์„ฑํ•œ recommender-ci-subscription-sa ์„œ๋น„์Šค ๊ณ„์ •์„ invoker ์—ญํ• ์ด ์žˆ๋Š” recommender-parser ์„œ๋น„์Šค์— ๊ตฌ์„ฑ์›์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    gcloud beta run services add-iam-policy-binding recommender-parser \
      --member=serviceAccount:recommender-ci-subscription-sa@$BUILD_PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/run.invoker --region=us-central1
    
  5. Google Cloud Console์—์„œ Pub/Sub๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  6. cloud-builds ์ฃผ์ œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  7. ๊ตฌ๋… ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  8. ๊ตฌ๋… ID์— recommender-service-build-events๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  9. ์ „์†ก ์œ ํ˜•์—์„œ ํ‘ธ์‹œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  10. ์—”๋“œํฌ์ธํŠธ์— /ci์—์„œ ์ถ”๊ฐ€๋œ recommender-service URL์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  11. ์ธ์ฆ ์‚ฌ์šฉ ์„ค์ •์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    1. ๋งŒ๋“  ์„œ๋น„์Šค ๊ณ„์ • recommender-ci-subscription-sa๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    2. ํ”„๋กฌํ”„ํŠธ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  12. ํ™•์ธ ๊ธฐํ•œ 60์ดˆ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  13. ๋‚˜๋จธ์ง€ ๊ธฐ๋ณธ๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  14. ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ ํ…Œ์ŠคํŠธ

์—ญํ• ์˜ ๊ถŒํ•œ ํ•˜์œ„ ์ง‘ํ•ฉ์ด 60์ผ ๋™์•ˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ถ”์ฒœ์ž๋Š” IAM ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. VM ํฌ๊ธฐ ๊ถŒ์žฅ์‚ฌํ•ญ์€ ์œ ์‚ฌํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์š”์ฒญ ์‹œ ์ด ํŒŒ์ดํ”„๋ผ์ธ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ํŠœํ† ๋ฆฌ์–ผ์— ํด๋ก ๋œ ์ €์žฅ์†Œ์— ์ œ๊ณต๋œ stub ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ œ๊ณต๋œ ์ƒ˜ํ”Œ ๊ถŒ์žฅ์‚ฌํ•ญ JSON ํŽ˜์ด๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด recommender-parser๊ฐ€ Recommender API ์—”๋“œํฌ์ธํŠธ์— ์ˆ˜ํ–‰ํ•œ API ํ˜ธ์ถœ์„ ์ œ์™ธํ•˜๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์„ ํ…Œ์ŠคํŠธํ•˜์—ฌ ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉ๋œ ๊ถŒ์žฅ์‚ฌํ•ญ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  1. Google Cloud ์ฝ˜์†”์—์„œ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋กœ ์ด๋™ํ•˜์—ฌ ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ•ญ๋ชฉ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    1. ๋จธ์‹  ์œ ํ˜•์ด g1-small์ธ tf-compute-1์ด๋ผ๋Š” Compute Engine ์ธ์Šคํ„ด์Šค
    2. ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์˜ editor ์—ญํ• ๋กœ Terraform Recommender Test๋ผ๋Š” ์„œ๋น„์Šค ๊ณ„์ •
  2. build ํ”„๋กœ์ ํŠธ์˜ Cloud Scheduler ์ฝ˜์†” ํŽ˜์ด์ง€์—์„œ recommender-iam-scheduler ์ž‘์—…์— ๋Œ€ํ•œ ์ง€๊ธˆ ์‹คํ–‰์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ์ž‘์—…์„ ํด๋ฆญํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ๋ด…๋‹ˆ๋‹ค. recommender-parser ์„œ๋น„์Šค ๋กœ๊ทธ๋ฅผ ๋ณด๊ณ  ์„œ๋น„์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹จ๊ณ„๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ์„œ๋น„์Šค ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด GitHub IAC-REPO-NAME ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. recommender-parser ์„œ๋น„์Šค๊ฐ€ ์ž๋™์œผ๋กœ pull ์š”์ฒญ์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด pull ์š”์ฒญ์„ ๊ตฌ์„ฑํ•˜๋Š” ์ˆ˜์ •๋œ IaC ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  IaC ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋งŒ์กฑ์Šค๋Ÿฌ์šฐ๋ฉด pull ์š”์ฒญ ๋ณ‘ํ•ฉ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  5. pull ์š”์ฒญ์„ ๋ณ‘ํ•ฉํ•˜๋ฉด ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ ์ƒˆ ์ปค๋ฐ‹์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด test ํ”„๋กœ์ ํŠธ์˜ Google Cloud ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ˆ˜์ •์‚ฌํ•ญ์ด ์ถœ์‹œ๋˜๋Š” Cloud Build ์ž‘์—…์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. Cloud Build ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. Google Cloud ์ฝ˜์†”์—์„œ ์ƒํƒœ๋ฅผ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ณต๋œ ์ƒ˜ํ”Œ ํŽ˜์ด๋กœ๋“œ๋Š” ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฐฐํฌ ์‹œ ์—ญํ• ์ด editor์ธ Terraform Test ์„œ๋น„์Šค ๊ณ„์ •์ด viewer๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์‚ญ์ œ

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์‚ฌ์šฉํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋น„์šฉ์ด Google Cloud ๊ณ„์ •์— ์ฒญ๊ตฌ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด ๋งŒ๋“  ๋‘ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

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

ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

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

  • Google Cloud์— ๋Œ€ํ•œ ์ฐธ์กฐ ์•„ํ‚คํ…์ฒ˜, ๋‹ค์ด์–ด๊ทธ๋žจ, ๊ถŒ์žฅ์‚ฌํ•ญ ์‚ดํŽด๋ณด๊ธฐ. Cloud ์•„ํ‚คํ…์ฒ˜ ์„ผํ„ฐ ์‚ดํŽด๋ณด๊ธฐ
  • ๋ฌธ์„œ์—์„œ Google Cloud ์ •์ฑ… ์ธํ…”๋ฆฌ์ „์Šค ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ