Yandex.Cloud์—์„œ๋Š” 10๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 000 ๋ถ€

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์นœ๊ตฌ๋“ค!

* ์ด ๊ธฐ์‚ฌ๋Š” REBRAIN ๋ฐ Yandex.Cloud ๊ณต๊ฐœ ์›Œํฌ์ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋™์˜์ƒ์„ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋งํฌ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://youtu.be/cZLezUm0ekE

์ตœ๊ทผ Yandex.Cloud๋ฅผ ๋ผ์ด๋ธŒ๋กœ ์‚ฌ์šฉํ•ด ๋ณผ ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ธธ๊ณ  ์—ด์‹ฌํžˆ ์กฐ์‚ฌํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ„๋‹จํ•œ Wordpress ๋ธ”๋กœ๊ทธ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ์ฆ‰์‹œ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์ง€๋ฃจํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ฏผ ๋์— ์šฐ๋ฆฌ๋Š” ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„ ๋ชจ๋“œ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๋•์…˜ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๋ฐฐํฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” (๋ฟ๋งŒ ์•„๋‹ˆ๋ผ) ๋Œ€๋‹ค์ˆ˜์˜ ์˜จ๋ผ์ธ ๋น„์ฆˆ๋‹ˆ์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ์‚ฌ์šฉ์ž์™€ ๊ทธ๋“ค์˜ ํ–‰๋™์— ๋Œ€ํ•œ ์—„์ฒญ๋‚œ ์–‘์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ตœ์†Œํ•œ ํŠน์ • ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜จ๋ผ์ธ ๊ฒŒ์ž„์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ๋ฉˆ์ถ”๋Š” ๋ ˆ๋ฒจ๊ณผ ์žฅ๋‚œ๊ฐ์„ ์‚ญ์ œํ•˜๋Š” ํ†ต๊ณ„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ๊ตฌ๋งคํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์ดํŠธ๋ฅผ ๋– ๋‚˜๋Š” ์ด์œ (์•ˆ๋…•ํ•˜์„ธ์š”, Yandex.Metrica).

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ์˜ ์ด์•ผ๊ธฐ: golang์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๊ณ , kafka์™€ Rabbitmq์™€ yqs๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ , Clickhouse ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ž‘์„ฑํ•˜๊ณ , yandex datalens๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•œ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ ์ด ๋ชจ๋“  ๊ฒƒ์€ docker, terraform, gitlab ci ๋ฐ prometheus ํ˜•ํƒœ์˜ ์ธํ”„๋ผ ์ฆ๊ฑฐ์›€์œผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ‘์‹œ๋‹ค!

๋ชจ๋“  ๊ฒƒ์„ ํ•œ ๋ฒˆ์— ๊ตฌ์„ฑํ•  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ์ ์„ ์ฆ‰์‹œ ์˜ˆ์•ฝํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์‹œ๋ฆฌ์ฆˆ์˜ ์—ฌ๋Ÿฌ ๊ธฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์กฐ๊ธˆ :

1๋ถ€(๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). ์šฐ๋ฆฌ๋Š” ์†”๋ฃจ์…˜์˜ ์‚ฌ์–‘๊ณผ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  golang์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
2 ๋ถ€. ์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์ถœ์‹œํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๋กœ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.
3๋ถ€. ํŒŒ์ผ์ด ์•„๋‹Œ ๋ฒ„ํผ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ์•„๋ณด๊ณ  kafka, Rabbitmq ๋ฐ yandex ๋Œ€๊ธฐ์—ด ์„œ๋น„์Šค๋„ ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
4๋ถ€ Clickhouse ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฐฐํฌํ•˜๊ณ , ๋ฒ„ํผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ , datalens์—์„œ ์‹œ๊ฐํ™”๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
5๋ถ€ ์ „์ฒด ์ธํ”„๋ผ๋ฅผ ์ ์ ˆํ•œ ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค. gitlab ci๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ci/cd๋ฅผ ์„ค์ •ํ•˜๊ณ , prometheus ๋ฐ consul์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์„œ๋น„์Šค ๊ฒ€์ƒ‰์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

TK

๋จผ์ €, ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์–ป๊ณ  ์‹ถ์€์ง€ ์ฐธ์กฐ ์กฐ๊ฑด์„ ๊ณต์‹ํ™”ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ด์•ผ ํ•˜๋Š” events.kis.im(kis.im์€ ๋ชจ๋“  ๊ธฐ์‚ฌ์—์„œ ์‚ฌ์šฉํ•  ํ…Œ์ŠคํŠธ ๋„๋ฉ”์ธ)๊ณผ ๊ฐ™์€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
  2. ์ด๋ฒคํŠธ๋Š” {โ€œeventโ€: โ€œviewโ€, โ€œosโ€: โ€œlinuxโ€, โ€œbrowserโ€: โ€œchromeโ€}๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ json์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ๋Š” ํ•„๋“œ๋ฅผ ์กฐ๊ธˆ ๋” ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ด์ง€๋งŒ ํฐ ์—ญํ• ์„ ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์›ํ•œ๋‹ค๋ฉด protobuf๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์„œ๋น„์Šค๋Š” ์ดˆ๋‹น 10๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์šฐ๋ฆฌ ์†”๋ฃจ์…˜์— ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ˆ˜ํ‰ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋Œ€ํ•œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์•ž๋ถ€๋ถ„์„ ๋‹ค๋ฅธ ์ง€๋ฆฌ์  ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  5. ๊ฒฐํ•จ ํ—ˆ์šฉ. ์†”๋ฃจ์…˜์€ ์ถฉ๋ถ„ํžˆ ์•ˆ์ •์ ์ด์–ด์•ผ ํ•˜๋ฉฐ ์–ด๋–ค ๋ถ€ํ’ˆ์ด ๋–จ์–ด์ ธ๋„(๋ฌผ๋ก  ํŠน์ • ๊ฐœ์ˆ˜๊นŒ์ง€) ๊ฒฌ๋”œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ

์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ž‘์—…์„ ์œ„ํ•ด ํšจ์œจ์ ์ธ ํ™•์žฅ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ณ ์ „์ ์ธ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์˜ค๋žซ๋™์•ˆ ๋ฐœ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์€ ์šฐ๋ฆฌ ์†”๋ฃจ์…˜์˜ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Yandex.Cloud์—์„œ๋Š” 10๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 000 ๋ถ€

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ์€:

1. ์™ผ์ชฝ์—๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์Šค๋งˆํŠธํฐ์œผ๋กœ ์žฅ๋‚œ๊ฐ ๋ ˆ๋ฒจ์„ ์™„๋ฃŒํ•˜๊ฑฐ๋‚˜ ์ผ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์˜จ๋ผ์ธ ์ƒ์ ์—์„œ ์ฃผ๋ฌธ์„ ํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์žฅ์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘์— ์ง€์ •๋œ ๋Œ€๋กœ ์ด๋ฒคํŠธ๋Š” ์—”๋“œํฌ์ธํŠธ์ธ events.kis.im์œผ๋กœ ์ „์†ก๋˜๋Š” ๊ฐ„๋‹จํ•œ json์ž…๋‹ˆ๋‹ค.

2. ์ฒ˜์Œ ๋‘ ์„œ๋ฒ„๋Š” ๊ฐ„๋‹จํ•œ ๋ฐธ๋Ÿฐ์„œ์ด๋ฉฐ ์ฃผ์š” ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ง€์†์ ์œผ๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜์„ธ์š”. ์ด๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋…ธ๋“œ ๊ฐ„์— ๊ฐ€์ƒ IP๋ฅผ ์ „ํ™˜ํ•˜๋Š” keepalived ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • TLS๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, TLS๋ฅผ ์ข…๋ฃŒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ๋‹น์‚ฌ ์†”๋ฃจ์…˜์ด ๊ธฐ์ˆ  ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜๊ณ  ๋‘˜์งธ, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ ์•”ํ˜ธํ™”๋œ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์„ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ˆ˜์‹  ์š”์ฒญ์˜ ๊ท ํ˜•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ ๋‹จ์–ด๋Š” ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์‹คํŒจํ•œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ ๋ฐธ๋Ÿฐ์‹ฑ์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

3. ๋ฐธ๋Ÿฐ์„œ ๋‹ค์Œ์—๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. HTTP๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ณ , ์ „์†ก๋œ json์„ ๊ฒ€์ฆํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. ๋‹ค์ด์–ด๊ทธ๋žจ์€ kafka๋ฅผ ๋ฒ„ํผ๋กœ ํ‘œ์‹œํ•˜์ง€๋งŒ ๋ฌผ๋ก  ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ์„œ๋น„์Šค๋„ ์ด ์ˆ˜์ค€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ๊ธฐ์‚ฌ์—์„œ๋Š” Kafka, Rabbitmq ๋ฐ yqs๋ฅผ ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

5. ์šฐ๋ฆฌ ์•„ํ‚คํ…์ฒ˜์˜ ๋‘ ๋ฒˆ์งธ ์ง€์ ์€ ๋ง‰๋Œ€ํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์—ด ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Clickhouse์ž…๋‹ˆ๋‹ค. ์ด ์ˆ˜์ค€์—์„œ๋Š” ๋ฒ„ํผ์—์„œ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ ์ž์ฒด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ์‚ฌ 4 ์ฐธ์กฐ).

์ด ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋ ˆ์ด์–ด๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ‰์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ์ด์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€๋งŒ ๋” ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ์ƒํƒœ ๋น„์ €์žฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ฏ€๋กœ ์ด ์ž‘์—…์€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Kafka ์Šคํƒ€์ผ ๋ฒ„ํผ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ๋” ์ถ”๊ฐ€ํ•˜๊ณ  ์ฃผ์ œ์˜ ์ผ๋ถ€ ํŒŒํ‹ฐ์…˜์„ ์„œ๋ฒ„๋กœ ์ „์†กํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Clickhouse์—์„œ๋Š” ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค :) ์‹ค์ œ๋กœ ์„œ๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๊ธฐ์ˆ  ์‚ฌ์–‘์˜ ์„ ํƒ์  ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ง€๋ฆฌ์  ์œ„์น˜๋กœ ํ™•์žฅํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

Yandex.Cloud์—์„œ๋Š” 10๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 000 ๋ถ€

๊ฐ ์ง€๋ฆฌ์  ์œ„์น˜์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ Kafka๊ฐ€ ํฌํ•จ๋œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ 2๊ฐœ, kafka ๋…ธ๋“œ 3๊ฐœ ๋ฐ ํด๋ผ์šฐ๋“œ ๋ฐธ๋Ÿฐ์„œ(์˜ˆ: cloudflare)์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋…ธ๋“œ์˜ ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ์†Œ์Šค IP ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง€๋ฆฌ์  ์œ„์น˜๋ณ„๋กœ ์š”์ฒญ์˜ ๊ท ํ˜•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฏธ๊ตญ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋Š” ๋ฏธ๊ตญ ์„œ๋ฒ„์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„ํ”„๋ฆฌ์นด์˜ ๋ฐ์ดํ„ฐ๋Š” ์•„ํ”„๋ฆฌ์นด์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Kafka ์„ธํŠธ์˜ ๋ฏธ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋“  ์œ„์น˜์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋Ÿฌ์‹œ์•„์— ์žˆ๋Š” ์ค‘์•™ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ํ›„์† ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•ด Clickhouse์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. Yandex.Cloud๋ฅผ ํ”๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ

ํด๋ผ์šฐ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—๋Š” ์•ฝ๊ฐ„์˜ ์ธ๋‚ด์‹ฌ์„ ๊ฐ–๊ณ  ๋“ค์–ด์˜ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. golang์€ ๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ์„ ์œ„ํ•œ ์–ธ์–ด๋กœ์„œ ๋งค์šฐ ์ž˜ ์ž…์ฆ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œ ์‹œ๊ฐ„(์–ด์ฉŒ๋ฉด ๋ช‡ ์‹œ๊ฐ„)์„ ์†Œ๋น„ํ•œ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์€ ์ฃผ์š” ์‚ฌํ•ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ ๋‘ ๊ฐœ์˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋“ค์–ด์˜ค๋Š” http ์š”์ฒญ(-addr)์„ ์ˆ˜์‹ ํ•  ํฌํŠธ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•  kafka ์„œ๋ฒ„ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค(-kafka).

addr     = flag.String("addr", ":8080", "TCP address to listen to")
kafka    = flag.String("kafka", "127.0.0.1:9092", "Kafka endpointsโ€)

2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‚ฌ๋ผ๋งˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ([] github.com/Shopify/sarama) kafka ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ตœ๋Œ€ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋ชฉํ‘œ๋กœ ์ฆ‰์‹œ ์„ค์ •์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForLocal
config.Producer.Compression = sarama.CompressionSnappy
config.Producer.Return.Successes = true

3. ์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ธก์ •ํ•ญ๋ชฉ์„ ์ˆ˜์ง‘ํ•˜๋Š” Prometheus ํด๋ผ์ด์–ธํŠธ๋„ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์š”์ฒญ ์ˆ˜
  • ์š”์ฒญ ์‹คํ–‰ ์‹œ ์˜ค๋ฅ˜ ์ˆ˜(ํฌ์ŠคํŠธ ์š”์ฒญ ์ฝ๊ธฐ ๋ถˆ๊ฐ€๋Šฅ, json ๊นจ์ง, Kafka ์“ฐ๊ธฐ ๋ถˆ๊ฐ€๋Šฅ)
  • Kafka์— ๋ฉ”์‹œ์ง€๋ฅผ ์“ฐ๋Š” ์‹œ๊ฐ„์„ ํฌํ•จํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ ํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ฒ˜๋ฆฌํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์—”๋“œํฌ์ธํŠธ:

  • /status - ok๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์‚ด์•„ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Kafka ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ€์šฉ์„ฑ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • /metrics - ์ด URL์— ๋”ฐ๋ผ prometheus ํด๋ผ์ด์–ธํŠธ๋Š” ์ˆ˜์ง‘ํ•œ ์ธก์ •ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • /post๋Š” json์ด ํฌํ•จ๋œ POST ์š”์ฒญ์ด ์ „์†ก๋˜๋Š” ๊ธฐ๋ณธ ์—”๋“œํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ json์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ด๋ฉด Kafka ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์”๋‹ˆ๋‹ค.

์ฝ”๋“œ๊ฐ€ ์™„๋ฒฝํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์˜ˆ์•ฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค!). ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด์žฅ๋œ net/http ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๊ณ  ๋” ๋น ๋ฅธ fasthttp๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฒ„ํผ์—์„œ ํด๋ฆญํ•˜์šฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ „์†ก๋  ๋•Œ json ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ดํ›„ ๋‹จ๊ณ„๋กœ ์ด๋™ํ•˜์—ฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„๊ณผ CPU ๋ฆฌ์†Œ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ๊ฐœ๋ฐœ ์ธก๋ฉด ์™ธ์—๋„ ์šฐ๋ฆฌ๋Š” ์ฆ‰์‹œ ๋ฏธ๋ž˜ ์ธํ”„๋ผ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  Docker๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ ์ตœ์ข… Dockerfile์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์€ ์œ ์ผํ•œ ์ ์€ ์ปจํ…Œ์ด๋„ˆ์˜ ์ตœ์ข… ์ด๋ฏธ์ง€๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋‹จ๊ณ„ ์–ด์…ˆ๋ธ”๋ฆฌ์ž…๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„

์šฐ์„  ํšŒ์›๊ฐ€์ž…์„ ํ•˜์„ธ์š” cloud.yandex.ru. ํ•„์š”ํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ž…๋ ฅํ•œ ํ›„ ๊ณ„์ •์ด ์ƒ์„ฑ๋˜๊ณ  ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ • ๊ธˆ์•ก์˜ ๋ณด์กฐ๊ธˆ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๊ธฐ์‚ฌ์˜ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋ณด์กฐ๊ธˆ์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋“ฑ๋ก ํ›„์—๋Š” ๋ณ„๋„์˜ ํด๋ผ์šฐ๋“œ์™€ ๊ธฐ๋ณธ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ์—ฌ๊ธฐ์—์„œ ํด๋ผ์šฐ๋“œ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Yandex.Cloud์—์„œ ๋ฆฌ์†Œ์Šค ๊ด€๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Yandex.Cloud์—์„œ๋Š” 10๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 000 ๋ถ€

ํ•˜๋‚˜์˜ ๊ณ„์ •์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ผ์šฐ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํด๋ผ์šฐ๋“œ ๋‚ด๋ถ€์—์„œ ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“œ์„ธ์š”. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ค๋ช…์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. ๊ทธ๋Ÿฐ๋ฐ ์•„๋ž˜ ๋ณธ๋ฌธ์—์„œ ์ž์ฃผ ์–ธ๊ธ‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ธํ”„๋ผ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ค์ •ํ•  ๋•Œ ๋ฌธ์„œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋„์›€์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์›น ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ฝ˜์†” ์œ ํ‹ธ๋ฆฌํ‹ฐ์ธ yc๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ช…๋ น์œผ๋กœ ์„ค์น˜๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค(Linux ๋ฐ Mac OS์˜ ๊ฒฝ์šฐ).

curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash

๋‚ด๋ถ€ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๊ฐ€ ์ธํ„ฐ๋„ท์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฒฉ๋…ธํ•˜๋Š” ๊ฒฝ์šฐ ๋จผ์ € ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—ด๊ณ  ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‘ ๋ฒˆ์งธ๋กœ ๋ฃจํŠธ ๊ถŒํ•œ ์—†์ด ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Windows์šฉ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ง€์นจ์„ ๋”ฐ๋ฅด์„ธ์š”. ์—ฌ๊ธฐ์— ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‹คํ–‰ yc init์™„์ „ํžˆ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

vozerov@mba:~ $ yc init
Welcome! This command will take you through the configuration process.
Please go to https://oauth.yandex.ru/authorize?response_type=token&client_id= in order to obtain OAuth token.

Please enter OAuth token:
Please select cloud to use:
 [1] cloud-b1gv67ihgfu3bp (id = b1gv67ihgfu3bpt24o0q)
 [2] fevlake-cloud (id = b1g6bvup3toribomnh30)
Please enter your numeric choice: 2
Your current cloud has been set to 'fevlake-cloud' (id = b1g6bvup3toribomnh30).
Please choose folder to use:
 [1] default (id = b1g5r6h11knotfr8vjp7)
 [2] Create a new folder
Please enter your numeric choice: 1
Your current folder has been set to 'default' (id = b1g5r6h11knotfr8vjp7).
Do you want to configure a default Compute zone? [Y/n]
Which zone do you want to use as a profile default?
 [1] ru-central1-a
 [2] ru-central1-b
 [3] ru-central1-c
 [4] Don't set default zone
Please enter your numeric choice: 1
Your profile default Compute zone has been set to 'ru-central1-a'.
vozerov@mba:~ $

์›์น™์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ํด๋ผ์šฐ๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด oauth ํ† ํฐ์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•  ํด๋ผ์šฐ๋“œ์™€ ํด๋”๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ํด๋ผ์šฐ๋“œ ๋‚ด์— ์—ฌ๋Ÿฌ ๊ณ„์ •์ด๋‚˜ ํด๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ yc config profile create๋ฅผ ํ†ตํ•ด ๋ณ„๋„์˜ ์„ค์ •์œผ๋กœ ์ถ”๊ฐ€ ํ”„๋กœํ•„์„ ๋งŒ๋“ค๊ณ  ํ”„๋กœํ•„ ๊ฐ„์— ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋ฐฉ๋ฒ• ์™ธ์—๋„ Yandex.Cloud ํŒ€์€ ๋งค์šฐ ์ข‹์€ ๊ธ€์„ ์ผ์Šต๋‹ˆ๋‹ค. Terraform์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ ํด๋ผ์šฐ๋“œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๊ธฐ์‚ฌ์˜ ์ผ๋ถ€๋กœ ์ƒ์„ฑ๋  ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์„ค๋ช…ํ•˜๋Š” git ์ €์žฅ์†Œ๋ฅผ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/rebrainme/yandex-cloud-events/. ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์— ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฏ€๋กœ ๋กœ์ปฌ๋กœ ๋ณต์ œํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


vozerov@mba:~ $ git clone https://github.com/rebrainme/yandex-cloud-events/ events
Cloning into 'events'...
remote: Enumerating objects: 100, done.
remote: Counting objects: 100% (100/100), done.
remote: Compressing objects: 100% (68/68), done.
remote: Total 100 (delta 37), reused 89 (delta 26), pack-reused 0
Receiving objects: 100% (100/100), 25.65 KiB | 168.00 KiB/s, done.
Resolving deltas: 100% (37/37), done.
vozerov@mba:~ $ cd events/terraform/

Terraform์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ฃผ์š” ๋ณ€์ˆ˜๋Š” main.tf ํŒŒ์ผ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‚ด์šฉ์œผ๋กœ terraform ํด๋”์— private.auto.tfvars ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

# Yandex Cloud Oauth token
yc_token = ""
# Yandex Cloud ID
yc_cloud_id = ""
# Yandex Cloud folder ID
yc_folder_id = ""
# Default Yandex Cloud Region
yc_region = "ru-central1-a"
# Cloudflare email
cf_email = ""
# Cloudflare token
cf_token = ""
# Cloudflare zone id
cf_zone_id = ""

์ฝ˜์†” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ด๋ฏธ ๊ตฌ์„ฑํ–ˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” yc ๊ตฌ์„ฑ ๋ชฉ๋ก์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋กœ ๊ฐœ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒŒ์‹œํ•˜์ง€ ์•Š๋„๋ก private.auto.tfvars๋ฅผ .gitignore์— ์ฆ‰์‹œ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

private.auto.tfvars์—์„œ๋Š” DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ๋ณธ ๋„๋ฉ”์ธ events.kis.im์„ ์„œ๋ฒ„๋กœ ํ”„๋ก์‹œํ•˜๊ธฐ ์œ„ํ•ด Cloudflare์˜ ๋ฐ์ดํ„ฐ๋„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. cloudflare๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด main.tf์™€ ํ•„์š”ํ•œ dns ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” dns.tf ํŒŒ์ผ์—์„œ cloudflare ๊ณต๊ธ‰์ž์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”.

์šฐ๋ฆฌ ์ž‘์—…์—์„œ๋Š” ์›น ์ธํ„ฐํŽ˜์ด์Šค, ์ฝ˜์†” ์œ ํ‹ธ๋ฆฌํ‹ฐ, Terraform์ด๋ผ๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ๊ฒฐํ•ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ

์†”์งํžˆ ๋งํ•˜๋ฉด, ์ƒˆ ํด๋ผ์šฐ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋ณ„๋„์˜ ๋„คํŠธ์›Œํฌ์™€ 3๊ฐœ์˜ ์„œ๋ธŒ๋„ท(๊ฐ€์šฉ ์˜์—ญ๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ)์ด ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ด ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ž์ฒด ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Yandex.Cloud์—์„œ ๋„คํŠธ์›Œํฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์•„๋ž˜ ๊ทธ๋ฆผ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค(์†”์งํžˆ ๋‹ค์Œ์—์„œ ๊ฐ€์ ธ์˜ด). https://cloud.yandex.ru/docs/vpc/concepts/)

Yandex.Cloud์—์„œ๋Š” 10๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 000 ๋ถ€

๋”ฐ๋ผ์„œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐ ๊ฐ€์šฉ์„ฑ ์˜์—ญ์— ๋Œ€ํ•ด ์ž์ฒด ์ฃผ์†Œ ์ง€์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ธŒ๋„ท์ด ์ƒ์„ฑ๋˜๊ณ  ์ผ๋ฐ˜ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ๊ทธ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ํด๋ผ์šฐ๋“œ ๋ฆฌ์†Œ์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ€์šฉ์„ฑ ์˜์—ญ์— ์žˆ๋”๋ผ๋„ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋œ ๋ฆฌ์†Œ์Šค๋Š” ์™ธ๋ถ€ ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์„œ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์ด ๋งˆ๋ฒ•์€ ๋‚ด๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? Habrรฉ์— ๋Œ€ํ•ด ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค..

๋„คํŠธ์›Œํฌ ์ƒ์„ฑ์€ ์ €์žฅ์†Œ์˜ network.tf ํŒŒ์ผ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ•˜๋‚˜์˜ ๊ณตํ†ต ์‚ฌ์„ค ๋„คํŠธ์›Œํฌ ๋‚ด๋ถ€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚ด๋ถ€-a(172.16.1.0/24), ๋‚ด๋ถ€-b(172.16.2.0/24), ๋‚ด๋ถ€-c(172.16.3.0/24)์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ€์šฉ์„ฑ ์˜์—ญ์— XNUMX๊ฐœ์˜ ์„œ๋ธŒ๋„ท์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ).

Terraform์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

vozerov@mba:~/events/terraform (master) $ terraform init
... skipped ..

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_vpc_subnet.internal-a -target yandex_vpc_subnet.internal-b -target yandex_vpc_subnet.internal-c

... skipped ...

Plan: 4 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

yandex_vpc_network.internal: Creating...
yandex_vpc_network.internal: Creation complete after 3s [id=enp2g2rhile7gbqlbrkr]
yandex_vpc_subnet.internal-a: Creating...
yandex_vpc_subnet.internal-b: Creating...
yandex_vpc_subnet.internal-c: Creating...
yandex_vpc_subnet.internal-a: Creation complete after 6s [id=e9b1dad6mgoj2v4funog]
yandex_vpc_subnet.internal-b: Creation complete after 7s [id=e2liv5i4amu52p64ac9p]
yandex_vpc_subnet.internal-c: Still creating... [10s elapsed]
yandex_vpc_subnet.internal-c: Creation complete after 10s [id=b0c2qhsj2vranoc9vhcq]

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

์—„์ฒญ๋‚œ! ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ  ์ด์ œ ๋‚ด๋ถ€ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ƒ ๋จธ์‹  ์ƒ์„ฑ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋‘ ๊ฐœ์˜ ๊ฐ€์ƒ ๋จธ์‹ ๋งŒ ์ƒ์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ์ˆ˜์‹  ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  kafka๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด prometheus๋ฅผ ๊ตฌ์„ฑํ•  ๋˜ ๋‹ค๋ฅธ ๋จธ์‹ ์„ ์ƒ์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ƒ ๋จธ์‹ ์€ ansible์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ Terraform์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ตœ์‹  ๋ฒ„์ „์˜ ansible ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ansible galaxy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ์—ญํ• ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

vozerov@mba:~/events/terraform (master) $ cd ../ansible/
vozerov@mba:~/events/ansible (master) $ ansible-galaxy install -r requirements.yml
- cloudalchemy-prometheus (master) is already installed, skipping.
- cloudalchemy-grafana (master) is already installed, skipping.
- sansible.kafka (master) is already installed, skipping.
- sansible.zookeeper (master) is already installed, skipping.
- geerlingguy.docker (master) is already installed, skipping.
vozerov@mba:~/events/ansible (master) $

ansible ํด๋” ์•ˆ์—๋Š” ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ .ansible.cfg ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ssh-agent๊ฐ€ ์‹คํ–‰ ์ค‘์ด๊ณ  SSH ํ‚ค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Terraform์ด ์ƒ์„ฑ๋œ ๋จธ์‹ ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‚˜๋Š” OS X์—์„œ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. ์ด๋Ÿฐ ์ผ์ด ๋‹ค์‹œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด Terraform์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— env์— ์ž‘์€ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

vozerov@mba:~/events/terraform (master) $ export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

Terraform์ด ์žˆ๋Š” ํด๋”์—์„œ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_compute_instance.build -target yandex_compute_instance.monitoring -target yandex_compute_instance.kafka
yandex_vpc_network.internal: Refreshing state... [id=enp2g2rhile7gbqlbrkr]
data.yandex_compute_image.ubuntu_image: Refreshing state...
yandex_vpc_subnet.internal-a: Refreshing state... [id=e9b1dad6mgoj2v4funog]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

... skipped ...

Plan: 3 to add, 0 to change, 0 to destroy.

... skipped ...

๋ชจ๋“  ๊ฒƒ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉด(๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ž˜์•ผ๋งŒ ํ•จ) ์„ธ ๊ฐœ์˜ ๊ฐ€์ƒ ๋จธ์‹ ์ด ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  1. build - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๋จธ์‹ ์ž…๋‹ˆ๋‹ค. Docker๋Š” Ansible์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์„ค์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ชจ๋‹ˆํ„ฐ๋ง - ๋ชจ๋‹ˆํ„ฐ๋ง ๋จธ์‹  - ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค์™€ ๊ทธ๋ผํŒŒ๋‚˜๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ/๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ์ค€: admin/admin
  3. kafka๋Š” kafka๊ฐ€ ์„ค์น˜๋œ ์ž‘์€ ์‹œ์Šคํ…œ์œผ๋กœ ํฌํŠธ 9092์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋‘ ์ œ์ž๋ฆฌ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

vozerov@mba:~/events (master) $ yc compute instance list
+----------------------+------------+---------------+---------+---------------+-------------+
|          ID          |    NAME    |    ZONE ID    | STATUS  |  EXTERNAL IP  | INTERNAL IP |
+----------------------+------------+---------------+---------+---------------+-------------+
| fhm081u8bkbqf1pa5kgj | monitoring | ru-central1-a | RUNNING | 84.201.159.71 | 172.16.1.35 |
| fhmf37k03oobgu9jmd7p | kafka      | ru-central1-a | RUNNING | 84.201.173.41 | 172.16.1.31 |
| fhmt9pl1i8sf7ga6flgp | build      | ru-central1-a | RUNNING | 84.201.132.3  | 172.16.1.26 |
+----------------------+------------+---------------+---------+---------------+-------------+

๋ฆฌ์†Œ์Šค๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—์„œ IP ์ฃผ์†Œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์—์„œ๋Š” IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SSH๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Terraform์— ์—ฐ๊ฒฐ๋œ cloudflare ๊ณ„์ •์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ DNS ์ด๋ฆ„์„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜์„ธ์š”.
๊ทธ๋Ÿฐ๋ฐ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•  ๋•Œ ๋‚ด๋ถ€ IP์™€ ๋‚ด๋ถ€ DNS ์ด๋ฆ„์ด ์ œ๊ณต๋˜๋ฏ€๋กœ ์ด๋ฆ„์œผ๋กœ ๋„คํŠธ์›Œํฌ ๋‚ด์˜ ์„œ๋ฒ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ubuntu@build:~$ ping kafka.ru-central1.internal
PING kafka.ru-central1.internal (172.16.1.31) 56(84) bytes of data.
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=2 ttl=63 time=0.625 ms
^C
--- kafka.ru-central1.internal ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.625/0.931/1.238/0.308 ms

์ด๋Š” kafk๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์กฐ๋ฆฝ

ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋„ ์žˆ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‚จ์€ ๊ฒƒ์€ ์ด๋ฅผ ์กฐ๋ฆฝํ•˜๊ณ  ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๋นŒ๋“œ์—๋Š” ์ผ๋ฐ˜์ ์ธ Docker ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ๋กœ๋Š” Yandex-์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œ ๋จธ์‹ ์— ๋ณต์‚ฌํ•˜๊ณ  SSH๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธํ•œ ํ›„ ์ด๋ฏธ์ง€๋ฅผ ์–ด์…ˆ๋ธ”ํ•ฉ๋‹ˆ๋‹ค.

vozerov@mba:~/events/terraform (master) $ cd ..
vozerov@mba:~/events (master) $ rsync -av app/ [email protected]:app/

... skipped ...

sent 3849 bytes  received 70 bytes  7838.00 bytes/sec
total size is 3644  speedup is 0.93

vozerov@mba:~/events (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cd app
ubuntu@build:~/app$ sudo docker build -t app .
Sending build context to Docker daemon  6.144kB
Step 1/9 : FROM golang:latest AS build
... skipped ...

Successfully built 9760afd8ef65
Successfully tagged app:latest

์ ˆ๋ฐ˜์˜ ์ „ํˆฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  kafka๋กœ ์ „์†กํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ubuntu@build:~/app$ sudo docker run --name app -d -p 8080:8080 app /app/app -kafka=kafka.ru-central1.internal:9092</code>

ะก ะปะพะบะฐะปัŒะฝะพะน ะผะฐัˆะธะฝะบะธ ะผะพะถะฝะพ ะพั‚ะฟั€ะฐะฒะธั‚ัŒ ั‚ะตัั‚ะพะฒั‹ะน event ะธ ะฟะพัะผะพั‚ั€ะตั‚ัŒ ะฝะฐ ะพั‚ะฒะตั‚:

<code>vozerov@mba:~/events (master) $ curl -D - -s -X POST -d '{"key1":"data1"}' http://84.201.132.3:8080/post
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 13 Apr 2020 13:53:54 GMT
Content-Length: 41

{"status":"ok","partition":0,"Offset":0}
vozerov@mba:~/events (master) $

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋…น์Œ ์„ฑ๊ณต๊ณผ ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋œ ํŒŒํ‹ฐ์…˜์˜ ID ๋ฐ ์˜คํ”„์…‹์„ ๋‚˜ํƒ€๋‚ด๋Š” ์‘๋‹ต์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ•ด์•ผ ํ•  ์ผ์€ Yandex.Cloud์— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ธ ์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Registry.tf ํŒŒ์ผ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_container_registry.events

... skipped ...

Plan: 1 to add, 0 to change, 0 to destroy.

... skipped ...

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

oauth ํ† ํฐ, iam ํ† ํฐ ๋˜๋Š” ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ธ์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ค๋ช…์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://cloud.yandex.ru/docs/container-registry/operations/authentication. ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ณ„์ •์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_iam_service_account.docker -target yandex_resourcemanager_folder_iam_binding.puller -target yandex_resourcemanager_folder_iam_binding.pusher

... skipped ...

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

์ด์ œ ๋‚จ์€ ๊ฒƒ์€ ์ด์— ๋Œ€ํ•œ ํ‚ค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

vozerov@mba:~/events/terraform (master) $ yc iam key create --service-account-name docker -o key.json
id: ajej8a06kdfbehbrh91p
service_account_id: ajep6d38k895srp9osij
created_at: "2020-04-13T14:00:30Z"
key_algorithm: RSA_2048

์ €์žฅ์†Œ ID์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›๊ณ  ํ‚ค๋ฅผ ์ „์†กํ•œ ํ›„ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

vozerov@mba:~/events/terraform (master) $ scp key.json [email protected]:
key.json                                                                                                                    100% 2392   215.1KB/s   00:00

vozerov@mba:~/events/terraform (master) $ ssh 84.201.132.3 -l ubuntu

ubuntu@build:~$ cat key.json | sudo docker login --username json_key --password-stdin cr.yandex
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
ubuntu@build:~$

์ด๋ฏธ์ง€๋ฅผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์—…๋กœ๋“œํ•˜๋ ค๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ID๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ yc ์œ ํ‹ธ๋ฆฌํ‹ฐ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

vozerov@mba:~ $ yc container registry get events
id: crpdgj6c9umdhgaqjfmm
folder_id:
name: events
status: ACTIVE
created_at: "2020-04-13T13:56:41.914Z"

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋ฏธ์ง€์— ์ƒˆ ์ด๋ฆ„์„ ํƒœ๊ทธํ•˜๊ณ  ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

ubuntu@build:~$ sudo docker tag app cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
ubuntu@build:~$ sudo docker push cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
The push refers to repository [cr.yandex/crpdgj6c9umdhgaqjfmm/events]
8c286e154c6e: Pushed
477c318b05cb: Pushed
beee9f30bc1f: Pushed
v1: digest: sha256:1dd5aaa9dbdde2f60d833be0bed1c352724be3ea3158bcac3cdee41d47c5e380 size: 946

์ด๋ฏธ์ง€๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

vozerov@mba:~/events/terraform (master) $ yc container repository list
+----------------------+-----------------------------+
|          ID          |            NAME             |
+----------------------+-----------------------------+
| crpe8mqtrgmuq07accvn | crpdgj6c9umdhgaqjfmm/events |
+----------------------+-----------------------------+

๊ทธ๋Ÿฐ๋ฐ Linux ์‹œ์Šคํ…œ์— yc ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

yc container registry configure-docker

๋„์ปค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์šฐ๋ฆฌ๋Š” ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์œผ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๋Š” ๋ฏธ๋ž˜ ์„œ๋น„์Šค์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ƒ๊ฐํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค.
  2. ์šฐ๋ฆฌ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” golang์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
  3. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ˆ˜์ง‘ํ•˜์—ฌ ๊ฐœ์ธ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋ถ€์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ถ€๋ถ„์—์„œ๋Š” ํฅ๋ฏธ๋กœ์šด ๋‚ด์šฉ์œผ๋กœ ๋„˜์–ด๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์œผ๋กœ ์ถœ์‹œํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๋กœ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „ํ™˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค!

์ด ์ž๋ฃŒ๋Š” ๊ณต๊ฐœ ์›Œํฌ์ˆ REBRAIN ๋ฐ Yandex.Cloud์˜ ๋น„๋””์˜ค ๋…นํ™”์— ์žˆ์Šต๋‹ˆ๋‹ค. Yandex Cloud์—์„œ๋Š” ์ดˆ๋‹น 10๊ฐœ์˜ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค. https://youtu.be/cZLezUm0ekE

์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ์— ์˜จ๋ผ์ธ์œผ๋กœ ์ฐธ์—ฌํ•˜๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ์งˆ๋ฌธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ์—ฐ๊ฒฐํ•˜์„ธ์š”. REBRAIN์˜ ์ฑ„๋„ DevOps.

์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฃผ์ตœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ฃผ์‹  Yandex.Cloud์— ํŠน๋ณ„ํžˆ ๊ฐ์‚ฌ์˜ ๋ง์”€์„ ์ „ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์—๊ฒŒ ๋งํฌ - https://cloud.yandex.ru/prices

ํด๋ผ์šฐ๋“œ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์ธํ”„๋ผ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ž์œ ๋กญ๊ฒŒ ์š”์ฒญ์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.

์ถ”์‹ : ์šฐ๋ฆฌ๋Š” ํ•œ ๋‹ฌ์— 2๋ฒˆ์˜ ๋ฌด๋ฃŒ ๊ฐ์‚ฌ๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ์•„๋งˆ๋„ ๊ท€ํ•˜์˜ ํ”„๋กœ์ ํŠธ๋„ ๊ทธ ์ค‘ ํ•˜๋‚˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€