ํ™˜๊ฒฝ ์ •๋ณด

ํ™˜๊ฒฝ์€ API ํ”„๋ก์‹œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฉ๋ฆฌ๋œ ์ปจํ…์ŠคํŠธ ๋˜๋Š” '์ƒŒ๋“œ๋ฐ•์Šค'๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์กฐ์ง์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ์—์„œ๋Š” ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์ด ์ •์˜๋œ ์žฌ์ •์˜ ๊ตฌ์„ฑ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

namespace: my-namespace
org: my-organization
...
envs:
  - name: test
    serviceAccountPaths:
      synchronizer: "your_keypath/synchronizer-manager-service-account.json
      udca: "your_keypath/analytic-agent-service-account.json

  - name: prod
    serviceAccountPaths:
      synchronizer: "your_keypath/synchronizer-manager-service-account.json
      udca: "your_keypath/analytic-agent-service-account.json
...

๊ธฐ๋ณธ ๊ฒฝ๋กœ๊ฐ€ /foo1์ธ ํ”„๋ก์‹œ๊ฐ€ ํ™˜๊ฒฝ test์— ๋ฐฐํฌ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋ก์‹œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

curl -k https://api.example.com/foo1

์ด ํ˜ธ์ถœ์ด ์ธ๊ทธ๋ ˆ์Šค์— ๋„๋‹ฌํ•˜๋ฉด ์ธ๊ทธ๋ ˆ์Šค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” test ํ™˜๊ฒฝ๊ณผ ์—ฐ๊ฒฐ๋œ ๋ฉ”์‹œ์ง€ ํ”„๋กœ์„ธ์„œ๋กœ ์ด๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ foo1๋„ prod ํ™˜๊ฒฝ์— ๋ฐฐํฌ๋œ ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ ๋ณ„์นญ apiprod.mydomain.net์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋ก์‹œ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

curl -k https://apiprod.example.com/foo1

๊ทธ๋Ÿฌ๋ฉด ์ธ๊ทธ๋ ˆ์Šค๊ฐ€ ์ด ํ˜ธ์ŠคํŠธ์™€ ์—ฐ๊ฒฐ๋œ MP๋กœ ๋ผ์šฐํŒ…๋ฉ๋‹ˆ๋‹ค.

Antipattern: ๋ชจ๋“  ํ”„๋ก์‹œ๋ฅผ ํ•˜๋‚˜์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

๊ถŒ์žฅ์‚ฌํ•ญ: ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ณ  ๊ฐ ํ™˜๊ฒฝ์— ์ œํ•œ๋œ ์ˆ˜์˜ ํ”„๋ก์‹œ๋ฅผ ๋ฐฐํฌํ•˜์„ธ์š”.

ํ”„๋ก์‹œ ๋ฐฐํฌ ์ˆ˜ ์ œํ•œ

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

ํ™˜๊ฒฝ์— ๋ช‡ ๊ฐœ์˜ ํ”„๋ก์‹œ๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•˜๋‚˜์š”? ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€ ์ง‘ํ•ฉ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ ํ‘œ์—์„œ ๊ฐ ํ™˜๊ฒฝ์— ๋ฐฐํฌ๋œ ํ”„๋ก์‹œ์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ด์œ ์™€ ํ”„๋ก์‹œ ๋ฐฐํฌ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์•ˆ๋‚ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ คํ•  ๋ฌธ์ œ ์„ค๋ช…
๋ฉ”์‹œ์ง€ ํ”„๋กœ์„ธ์„œ ๋ถ€ํŒ… ์‹œ๊ฐ„ ๋ฉ”์‹œ์ง€ ํ”„๋กœ์„ธ์„œ(MP)์˜ ๋ถ€ํŒ…์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„๊ณผ ํ•ด๋‹น MP์— ๋ฐฐํฌ๋œ ํ”„๋ก์‹œ ์ˆ˜ ์‚ฌ์ด์—๋Š” ์ง์ ‘์ ์ธ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ ํ™•์žฅ Kubernetes ํ™˜๊ฒฝ์—์„œ ๋ถ€ํŒ… ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MP์— ๋ฐฐํฌ๋˜๋Š” ํ”„๋ก์‹œ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ํ™•์žฅ์ด๋‚˜ ๋‹ค์‹œ ๋งŒ๋“ค๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” MP๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๋” ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
ํ™•์žฅ ์„ฑ๋Šฅ ํ™˜๊ฒฝ์— ๋ฐฐํฌ๋œ ํ”„๋ก์‹œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๊ณ  ํ”„๋ก์‹œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์•„ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ž๋™ ํ™•์žฅ๋˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ํ™˜๊ฒฝ์˜ ๋ชจ๋“  ํ”„๋ก์‹œ๊ฐ€ ์ด ํ”„๋ก์‹œ์™€ ํ•จ๊ป˜ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ๋‹จ์ผ ํ”„๋ก์‹œ๊ฐ€ ํฌํ•จ๋œ ๋ณต์ˆ˜์˜ ํ”„๋ก์‹œ ํ™•์žฅ์ด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠธ๋ž˜ํ”ฝ ๋งŽ์€ ์ด์›ƒ ๋™์ผํ•œ ํ™˜๊ฒฝ์— ์—ฌ๋Ÿฌ ํ”„๋ก์‹œ๊ฐ€ ๋ฐฐํฌ๋˜์–ด ์žˆ๊ณ  ํ•˜๋‚˜์˜ ํ”„๋ก์‹œ๊ฐ€ ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜๋ฉด MP๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜๋Š” ๋™์•ˆ ํ™˜๊ฒฝ์˜ ๋ชจ๋“  ํ”„๋ก์‹œ๊ฐ€ ๋‹ค์šด๋ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์— ๋ฐฐํฌ๋œ ํ”„๋ก์‹œ ์ˆ˜๋ฅผ ์ œํ•œํ•˜์—ฌ ๋‹จ์ผ ํ”„๋ก์‹œ ๋น„์ •์ƒ ์ข…๋ฃŒ์˜ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๊ทธ๋ฃน ๋ฐ virtualhost

ํ™˜๊ฒฝ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๋ฉด ํ™˜๊ฒฝ์„ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ทธ๋ฃน ๋‚ด ํ™˜๊ฒฝ์€ ๋™์ผํ•œ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์„ค์น˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ ํ™˜๊ฒฝ์„ ํ•จ์ˆ˜, ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ ์ฃผ์†Œ, ๋ฆฌ์ „๋ณ„๋กœ ๋˜๋Š” ์›ํ•˜๋Š” ๋‹ค๋ฅธ ์ธก์ •ํ•ญ๋ชฉ์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์šฐํŒ…์€ ํ™˜๊ฒฝ ๊ทธ๋ฃน ํ˜ธ์ŠคํŠธ ์ด๋ฆ„, API ํ”„๋ก์‹œ ๊ธฐ๋ณธ ๊ฒฝ๋กœ, ํ™˜๊ฒฝ์˜ ์กฐํ•ฉ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ ๊ฐ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ๋Š” ํ™˜๊ฒฝ ๊ทธ๋ฃน ์ด๋ฆ„๊ณผ ํ•ด๋‹น ์ธ์ฆ์„œ๋งŒ ๋‚˜์—ดํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ์—์„œ๋Š” ์—ฌ๋Ÿฌ virtualhost๊ฐ€ ์ •์˜๋œ ์žฌ์ •์˜ ๊ตฌ์„ฑ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. virtualhost์˜ ์ด๋ฆ„์€ ํ™˜๊ฒฝ ๊ทธ๋ฃน ์ด๋ฆ„์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcp:
  region: us-central1
  projectID: hybrid-example

k8sCluster:
  name: apigee-hybrid
  region: us-central1

org: hybrid-example

instanceID: "my_hybrid_example"

virtualhosts:
  - name: group-1  # the name of an environment group
    sslCertPath: ./certs/keystore.pem
    sslKeyPath: ./certs/keystore.key

virtualhosts:
  - name: group-2
    sslCertPath: ./certs/keystore.pem
    sslKeyPath: ./certs/keystore.key
...

์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค