AKS ๋ฐ EKS์—์„œ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด ์‚ฌ์šฉ ์„ค์ •

์ด ์ฃผ์ œ์—์„œ๋Š” AKS ๋ฐ EKS ํ”Œ๋žซํผ์—์„œ Apigee Hybrid ์„ค์น˜์— ๋Œ€ํ•ด ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

GKE์— ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ GKE์—์„œ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์‚ฌ์šฉ ์„ค์ •์˜ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

๊ฐœ์š”

์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Google Cloud ์™ธ๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์™ธ๋ถ€ ID ๊ณต๊ธ‰์—…์ฒด์˜ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Google Cloud Platform ์„œ๋น„์Šค ๊ณ„์ •์„ ๊ฐ€์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฐœ์š”๋Š” ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด ์‚ฌ์šฉ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด ์„ค์ •

Apigee Hybrid์— ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•œ ํ›„ Apigee Hybrid ์„ค์น˜์— ๊ธฐ๋Šฅ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

์ด ์•ˆ๋‚ด์—์„œ๋Š” ์ด๋ฏธ Apigee Hybrid ์„ค์น˜๋ฅผ ์„ค์ •ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. IAM ์„œ๋น„์Šค ๊ณ„์ •๊ณผ Kubernetes ์„œ๋น„์Šค ๊ณ„์ •์€ ์ดˆ๊ธฐ ์„ค์น˜ ์ค‘์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Apigee Hybrid ์„ค์น˜ ๊ฐœ์š”๋Š” ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

AKS์— ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ OpenID Connect(OIDC) ๋ฐœ๊ธ‰๊ธฐ๊ด€์„ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด์—์„œ OpenID Connect ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ํด๋Ÿฌ์Šคํ„ฐ์˜ JSON ์›น ํ‚ค ์ง‘ํ•ฉ(JWKS)์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ

  1. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ gcloud ๊ตฌ์„ฑ์ด Google Cloud ํ”„๋กœ์ ํŠธ ID๋กœ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    gcloud config get project
  2. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ˜„์žฌ gcloud ๊ตฌ์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    gcloud config set project PROJECT_ID
  3. ๋ณด์•ˆ ํ† ํฐ ์„œ๋น„์Šค API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ ํ† ํฐ ์„œ๋น„์Šค API๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    gcloud services list --enabled --project PROJECT_ID | grep sts.googleapis.com

    API๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

    ์ฝ˜์†”

    Enable the Security Token Service API.

    Enable the API

    ๋ช…๋ น์ค„

    ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    gcloud services enable sts.googleapis.com --project PROJECT_ID
  4. ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ๋ฐ ๊ณต๊ธ‰์—…์ฒด ๋งŒ๋“ค๊ธฐ

    ํ•„์š”ํ•œ ์—ญํ• 

    ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์œผ๋ ค๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋‹ค์Œ IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”.

    ์—ญํ•  ๋ถ€์—ฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ์ปค์Šคํ…€ ์—ญํ• ์ด๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋˜๋Š” IAM ์†Œ์œ ์ž(roles/owner) ๊ธฐ๋ณธ ์—ญํ• ์—๋Š” ID ์ œํœด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ถŒํ•œ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ๋ณธ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜์ง€ ๋ง์•„์•ผ ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋˜๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ถ€์—ฌํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

    ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€๊ณผ ๊ณต๊ธ‰์—…์ฒด๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. AKS ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐœ๊ธ‰๊ธฐ๊ด€ URL์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      AKS

      az aks show -n NAME -g RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv

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

      • NAME: ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
      • RESOURCE_GROUP: ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ์†Œ์Šค ๊ทธ๋ฃน์ž…๋‹ˆ๋‹ค.

      ์ด ๋ช…๋ น์–ด๋Š” ๋ฐœ๊ธ‰๊ธฐ๊ด€ URL์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„ ์ค‘ ํ•˜๋‚˜์—์„œ ๋ฐœ๊ธ‰๊ธฐ๊ด€ URL์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

      ๋ช…๋ น์–ด๊ฐ€ ๋ฐœ๊ธ‰๊ธฐ๊ด€ URL์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด OIDC ๋ฐœ๊ธ‰๊ธฐ๊ด€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ์„ค์ •ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      EKS

      aws eks describe-cluster --name NAME --query "cluster.identity.oidc.issuer" --output text
      

      NAME์„ ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

      ์ด ๋ช…๋ น์–ด๋Š” ๋ฐœ๊ธ‰๊ธฐ๊ด€ URL์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„ ์ค‘ ํ•˜๋‚˜์—์„œ ๋ฐœ๊ธ‰๊ธฐ๊ด€ URL์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

      ๊ธฐํƒ€ Kubernetes

      1. Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐํ•˜๊ณ  `kubectl`์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐœ๊ธ‰๊ธฐ๊ด€ URL์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
        kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
        

        ๋‹ค์Œ ๋‹จ๊ณ„ ์ค‘ ํ•˜๋‚˜์—์„œ ๋ฐœ๊ธ‰๊ธฐ๊ด€ URL์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    2. ์„ ํƒ์‚ฌํ•ญ: OIDC ๋ฐœ๊ธ‰๊ธฐ๊ด€์—์„œ ๊ณต๊ฐœ์ ์œผ๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ JSON ์›น ํ‚ค ์„ธํŠธ(JWKS)๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
      kubectl get --raw /openid/v1/jwks > cluster-jwks.json
      

      OIDC ์ œ๊ณต์—…์ฒด๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด CURL ๋ช…๋ น์–ด๋กœ ์ œ๊ณต์—…์ฒด URL์— ์•ก์„ธ์Šคํ•˜์—ฌ 200 ์‘๋‹ต์„ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    3. ์ƒˆ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
      gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
                  

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

      • POOL_ID: ํ’€์˜ ๊ณ ์œ  ID
      • DISPLAY_NAME: (์„ ํƒ์‚ฌํ•ญ) ํ’€์˜ ์ด๋ฆ„
      • DESCRIPTION: (์„ ํƒ์‚ฌํ•ญ) ์„ ํƒํ•œ ํ’€์— ๋Œ€ํ•œ ์„ค๋ช…. (์ด ์„ค๋ช…์€ ํ’€ ID์— ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋•Œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.)

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      gcloud iam workload-identity-pools create my-wi-pool --display-name="My workload pool" --description="My workload pool description"
    4. ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ๊ณต๊ธ‰์—…์ฒด๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. OIDC ๋ฐœ๊ธ‰๊ธฐ๊ด€์—์„œ ๊ณต๊ฐœ์ ์œผ๋กœ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ์ง€ ๋˜๋Š” ๊ณต๊ฐœ์ ์œผ๋กœ ์•ก์„ธ์Šค ๋ถˆ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ œ๊ณต์—…์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

      ๊ณต๊ฐœ์ ์œผ๋กœ ์•ก์„ธ์Šค ๊ฐ€๋Šฅ

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

      gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --attribute-mapping="google.subject=assertion.sub"

      ๊ณต๊ฐœ์ ์œผ๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Œ

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

        gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --jwks-file="cluster-jwks.json" \
        --attribute-mapping="google.subject=assertion.sub"

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

      • WORKLOAD_PROVIDER_ID: ์„ ํƒํ•œ ๊ณ ์œ  ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ๊ณต๊ธ‰์—…์ฒด ID
      • POOL_ID: ์•ž์—์„œ ๋งŒ๋“  ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ID
      • ISSUER: ์ด์ „์— ํ™•์ธํ•œ ๋ฐœ๊ธ‰๊ธฐ๊ด€ URL.

      attribute-mapping="google.subject=assertion.sub"๋Š” Kubernetes ์ฃผ์ฒด๋ฅผ IAM ์ฃผ์ฒด์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

Google Cloud ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” Kubernetes ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋ ค๋ฉด ๋จผ์ € ๊ฐ IAM ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ IAM ์„œ๋น„์Šค ๊ณ„์ •('Google ์„œ๋น„์Šค ๊ณ„์ •'์ด๋ผ๊ณ ๋„ ํ•จ)์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
    gcloud iam service-accounts list --project PROJECT_ID

    ๋‹ค์Œ IAM ์„œ๋น„์Šค ๊ณ„์ •์˜ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ํ”„๋กœ๋•์…˜

    ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@my_project_id.iam.gserviceaccount.com     False
    apigee-mart          apigee-mart@my_project_id.iam.gserviceaccount.com          False
    apigee-metrics       apigee-metrics@my_project_id.iam.gserviceaccount.com       False
    apigee-runtime       apigee-runtime@my_project_id.iam.gserviceaccount.com       False
    apigee-synchronizer  apigee-synchronizer@my_project_id.iam.gserviceaccount.com  False
    apigee-udca          apigee-udca@my_project_id.iam.gserviceaccount.com          False
    apigee-watcher       apigee-watcher@my_project_id.iam.gserviceaccount.com       False
    

    ๋น„ํ”„๋กœ๋•์…˜

    ๋น„ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    
  2. ์ด์ „ ๋ชฉ๋ก์— ์žˆ๋Š” ๊ฐ IAM ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก Apigee Hybrid๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    ์ฝ”๋“œ

    gcloud iam workload-identity-pools create-cred-config \
      projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
      --service-account=SERVICE_ACCOUNT_EMAIL \
      --credential-source-file=/var/
      --credential-source-type=text \
      --output-file=SERVICE_ACCOUNT_NAME-credential-configuration.json
      

    ์˜ˆ

    gcloud iam workload-identity-pools create-cred-config \
      projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider \
      --service-account=apigee-cassandra@myhybridporg.iam.gserviceaccount.com \
      --credential-source-file=/var/
      --credential-source-type=text \
      --output-file=apigee-cassandra-credential-configuration.json
      

    ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • PROJECT_NUMBER: ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ. ํ”„๋กœ์ ํŠธ ID๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • POOL_ID: ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์˜ ID
    • WORKLOAD_PROVIDER_ID: ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ๊ณต๊ธ‰์—…์ฒด์˜ ID
    • SERVICE_ACCOUNT_EMAIL: Kubernetes ServiceAccount์—์„œ IAM ์„œ๋น„์Šค ๊ณ„์ • ๊ฐ€์žฅ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•œ ๊ฒฝ์šฐ ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ

    ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด [Cloud ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ](/apis/docs/cloud-client-libraries), gcloud CLI, Terraform์—์„œ ๋‹ค์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์™ธ๋ถ€ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์œ„์น˜
    • ์‚ฌ์šฉํ•  ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ๋ฐ ๊ณต๊ธ‰์—…์ฒด
    • ๊ฐ€์žฅํ•  ์„œ๋น„์Šค ๊ณ„์ •

    ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก Apigee Hybrid ๊ตฌ์„ฑ

    1. ๊ฐ ์ถœ๋ ฅ ํŒŒ์ผ(SERVICE_ACCOUNT_NAME-credential-configuration.json)์„ ๋‹ค์Œ ์ฐจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ(๋˜๋Š” ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ)์— ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ ๋‹จ๊ณ„์—์„œ ๋งŒ๋“  ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

      ํ”„๋กœ๋•์…˜

      ์„œ๋น„์Šค ๊ณ„์ • Apigee Helm ์ฐจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ
      apigee-cassandra apigee-datastore/
      apigee-mart apigee-org/
      apigee-metrics apigee-telemetry/
      apigee-runtime apigee-env/
      apigee-synchronizer apigee-env/
      apigee-udca apigee-org/
      apigee-env/
      apigee-watcher apigee-org/

      ๋น„ํ”„๋กœ๋•์…˜

      ์„œ๋น„์Šค ๊ณ„์ • Apigee Helm ์ฐจํŠธ
      apigee-non-prod apigee-datastore/
      apigee-telemetry/
      apigee-org/
      apigee-env/
    2. ํด๋Ÿฌ์Šคํ„ฐ์˜ ์žฌ์ •์˜ ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ „์—ญ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

      ์ฝ”๋“œ

      gcp:
        workloadIdentity:
          enabled: false # must be set to false to use Workload Identity Federation
        federatedWorkloadIdentity:
          enabled: true
          audience: "AUDIENCE"
          credentialSourceFile: "/var/run/service-account/token"
      

      ์˜ˆ

      gcp:
        workloadIdentity:
          enabled: false
        federatedWorkloadIdentity:
          enabled: true
          audience: "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider"
          credentialSourceFile: "/var/run/service-account/token"
      

      ์—ฌ๊ธฐ์—์„œ AUDIENCE๋Š” ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ๊ณต๊ธ‰์—…์ฒด์˜ ํ—ˆ์šฉ๋˜๋Š” ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ audience: ๋ผ๋Š” ์šฉ์–ด๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž ์žฌ๊ณ ๊ฐ ๊ฐ’์€ ๊ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

      ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ƒ˜ํ”Œ apigee-udca-credential-configuration.json ํŒŒ์ผ์—์„œ

      {
        "universe_domain": "googleapis.com",
        "type": "external_account:,"
        "audience": "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider",
        "subject_token_type": "urn:ietf:params:oauth: token-type:jwt",
        "token_url": "https://sts.googleapis.com/v1/token",
        "service
        "impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/apigee-udca@myhybridproject.iam.gserviceaccount.com:generateAccessToken",
        "credential_source": {
          "file": "/var/run/service-account/token",
          "format": {
            "type": "text"
          }
        }
      }

      ์ž ์žฌ๊ณ ๊ฐ ๊ฐ’์€ //iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider์ž…๋‹ˆ๋‹ค.

    3. ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๊ตฌ์„ฑ์š”์†Œ์— ๋Œ€ํ•œ ์žฌ์ •์˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜์— ๋”ฐ๋ผ ์ธ์ฆ์„œ ํŒŒ์ผ, Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€, Vault ์•ˆ๋‚ด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

      ์ธ์ฆ์„œ ํŒŒ์ผ

      serviceAccountPath ๊ฐ’์„ ํ•ด๋‹น IAM ์„œ๋น„์Šค ๊ณ„์ •์˜ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ์†Œ์Šค ํŒŒ์ผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ๋Š” ์ฐจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      envs:
      - name: ENVIRONMENT_NAME
        serviceAccountPaths:
          synchronizer: apigee-synchronizer-credential-configuration.json
          runtime: apigee-runtime-credential-configuration.json
          udca: apigee-udca-credential-configuration.json
      
      mart:
        serviceAccountPath: apigee-mart-credential-configuration.json
      
      connectAgent:
        serviceAccountPath: apigee-mart-credential-configuration.json
      
      metrics:
        serviceAccountPath: apigee-metrics-credential-configuration.json
      
      udca:
        serviceAccountPath: apigee-udca-credential-configuration.json
      
      watcher:
        serviceAccountPath: apigee-watcher-credential-configuration.json
      

      K8s ๋ณด์•ˆ ๋น„๋ฐ€

      1. ๊ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ์†Œ์Šค ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
        kubectl create secret -n APIGEE_NAMESPACE generic SECRET_NAME --from-file="client_secret.json=CREDENTIAL_CONFIGURATION_FILE"

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

        kubectl create secret -n apigee generic udca-workoad-identity-secret --from-file="client_secret.json=./apigee-udca-credential-configuration.json"
      2. serviceAccountRef์˜ ๊ฐ’์„ ์ƒˆ ๋ณด์•ˆ ๋น„๋ฐ€๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
        udca:
          serviceAccountRef: udca-workoad-identity-secret
        

      Vault

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

      SAKEY=$(cat .apigee-udca-credential-configuration.json); kubectl -n APIGEE_NAMESPACE exec vault-0 -- vault kv patch secret/apigee/orgsakeys udca="$SAKEY"

      ์ž์„ธํ•œ ๋‚ด์šฉ์€ Storing service account keys in Hashicorp Vault๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    4. helm upgrade ๋ช…๋ น์–ด๋กœ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฐ ๊ตฌ์„ฑ์š”์†Œ์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

      Vault ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค๋ฅผ ์—…๋ฐ์ดํŠธํ•œ ๊ฒฝ์šฐ apigee-operator ์ฐจํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

      helm upgrade operator apigee-operator/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      

      ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋‚˜๋จธ์ง€ ์ฐจํŠธ๋Š” ๋‹ค์Œ ์ˆœ์„œ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

      helm upgrade datastore apigee-datastore/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      
      helm upgrade telemetry apigee-telemetry/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      
      helm upgrade $ORG_NAME apigee-org/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      

      ๊ฐ ํ™˜๊ฒฝ์˜ apigee-env ์ฐจํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋งค๋ฒˆ $ENV_RELEASE_NAME ๋ฐ ENV_NAME์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

      helm upgrade $ENV_RELEASE_NAME apigee-env/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        --set env=$ENV_NAME \
        -f overrides.yaml
      

      ๊ตฌ์„ฑ์š”์†Œ ๋ฐ ํ•ด๋‹น ์ฐจํŠธ ๋ชฉ๋ก์€ Apigee Hybrid Helm ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

    Kubernetes ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ

    1. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ์„œ๋น„์Šค ๊ณ„์ •์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.
      kubectl get sa -n APIGEE_NAMESPACE
    2. ๋‹ค์Œ ํ‘œ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ์—ฐ๊ฒฐ๋œ IAM ์„œ๋น„์Šค ๊ณ„์ •์„ ๊ฐ€์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์„ธ์Šค ๊ถŒํ•œ์„ Kubernetes ์„œ๋น„์Šค ๊ณ„์ •์— ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํ‘œ์—๋Š” ๊ธฐ๋ณธ Apigee IAM ์„œ๋น„์Šค ๊ณ„์ • ์ด๋ฆ„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ์„œ๋น„์Šค ๊ณ„์ • ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น IAM ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
      Kubernetes ์„œ๋น„์Šค ๊ณ„์ • IAM ์„œ๋น„์Šค ๊ณ„์ •
      ์กฐ์ง ์ˆ˜์ค€ Kubernetes ์„œ๋น„์Šค ๊ณ„์ •
      apigee-connect-agent-ORG_NAME-ORG_HASH_ID apigee-mart
      apigee-mart-ORG_NAME-ORG_HASH_ID apigee-mart
      apigee-metrics-apigee-telemetry apigee-metrics
      apigee-open-telemetry-collector-apigee-telemetry apigee-metrics
      apigee-udca-ORG_NAME-ORG_HASH_ID apigee-udca
      apigee-watcher-ORG_NAME-ORG_HASH_ID apigee-watcher
      ํ™˜๊ฒฝ ์ˆ˜์ค€ Kubernetes ์„œ๋น„์Šค ๊ณ„์ •
      apigee-runtime-ORG_NAME-ENV_NAME-ENV_HASH_ID apigee-runtime
      apigee-synchronizer-ORG_NAME-ENV_NAME-ENV_HASH_ID apigee-synchronizer
      Cassandra ๋ฐฑ์—… ๋ฐ ๋ณต์›(์‚ฌ์šฉ ์„ค์ •๋œ ๊ฒฝ์šฐ)
      apigee-cassandra-backup-sa apigee-cassandra
      apigee-cassandra-restore-sa apigee-cassandra

      ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      • ORG_NAME: ์กฐ์ง ์ด๋ฆ„์˜ ์ฒ˜์Œ 15์ž์ž…๋‹ˆ๋‹ค.
      • ORG_HASH_ID: ์ „์ฒด ์กฐ์ง ์ด๋ฆ„์˜ ๊ณ ์œ ํ•œ ํ•ด์‹œ ID์ž…๋‹ˆ๋‹ค.
      • ENV_NAME: ํ™˜๊ฒฝ ์ด๋ฆ„์˜ ์ฒ˜์Œ 15์ž์ž…๋‹ˆ๋‹ค.
      • ENV_HASH_ID: ์กฐ์ง ๋ฐ ํ™˜๊ฒฝ ์ด๋ฆ„์˜ ๊ณ ์œ ํ•œ ํ•ด์‹œ ID์ž…๋‹ˆ๋‹ค.

      ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      • apigee-connect-agent-myhybridorg-123abcd
      • apigee-runtime-myhybridorg-prodenv-234bcde

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

      gcloud iam service-accounts add-iam-policy-binding \
        IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MAPPED_SUBJECT" \
          --role=roles/iam.workloadIdentityUser

      ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      • IAM_SA_NAME: ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
      • PROJECT_ID: Apigee ์กฐ์ง๊ณผ ์—ฐ๊ฒฐ๋œ ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.
      • PROJECT_NUMBER: ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์„ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
      • POOL_ID: ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ID์ž…๋‹ˆ๋‹ค.
      • MAPPED_SUBJECT: google.subject์— ๋งคํ•‘ํ•œ ID ํ† ํฐ์˜ ํด๋ ˆ์ž„์—์„œ ๊ฐ€์ ธ์˜จ Kubernetes ServiceAccount์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด google.subject=assertions.sub๋ฅผ ๋งคํ•‘ํ–ˆ๊ณ  ID ํ† ํฐ์— "sub": "system:serviceaccount:default:my-kubernetes-serviceaccount"๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด MAPPED_SUBJECT๋Š” system:serviceaccount:default:my-kubernetes-serviceaccount์ž…๋‹ˆ๋‹ค.

    ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด ๋ฐ ๊ถŒ์žฅ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด ์‚ฌ์šฉ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์„ธ์š”.