IAM์œผ๋กœ ์•ก์„ธ์Šค ์ œ์–ด

์ด ํŽ˜์ด์ง€์—์„œ๋Š” Identity and Access Management(IAM) ์—ญํ• ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€์—์„œ ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ์„ค์ •ํ•˜๊ณ , gcloud functions ๋ช…๋ น์–ด ๋˜๋Š” Cloud Functions v2 API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  Google Cloud ํ”„๋กœ์ ํŠธ ๋ฐ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ˆ˜์ค€์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Cloud Run์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋ฐฐํฌํ•œ ๊ฒฝ์šฐ Cloud Run ์‚ฌ์ „ ์ •์˜ ์—ญํ• , ๊ฐœ๋ณ„ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ œ์–ด, ์„œ๋น„์Šค ๊ณต๊ฐœ, Cloud Run ํ˜ธ์ถœ์ž IAM์˜ ์กฐ์ง ์ •์ฑ… ๊ตฌ์„ฑ์— ๊ด€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ IAM์œผ๋กœ ์•ก์„ธ์Šค ์ œ์–ด ๋ฐ Cloud Run ์—ญํ• ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์‚ฌ์šฉ์ž ์•ก์„ธ์Šค ์ œ์–ด

IAM์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ํ”„๋กœ์ ํŠธ์— ํŒ€ ๊ตฌ์„ฑ์›์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

Cloud Run Functions๋Š” ๋‹ค์Œ ์—ญํ• ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ œ์–ด

์„œ๋น„์Šค ๊ณ„์ •์€ ํŠน์ˆ˜ํ•œ ์œ ํ˜•์˜Google Cloud ๊ณ„์ •์œผ๋กœ, ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ธ์ฆ ๋ฐ ์Šน์ธ๋˜์–ด์•ผ ํ•˜๋Š” ์ธ๊ฐ„์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž์˜ ID ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณ„์ • ์ค‘ ์ผ๋ถ€๋ฅผ Google์—์„œ ์ง์ ‘ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋ฉฐ ์ด๋ฅผ ์„œ๋น„์Šค ์—์ด์ „ํŠธ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Cloud Run Functions์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„ ๊ตฌ์„ฑ์› ID ์—ญํ• 
Compute Engine ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ • PROJECT_NUMBER-compute@developer.gserviceaccount.com ํŽธ์ง‘์ž
Google Cloud Functions ์„œ๋น„์Šค ์—์ด์ „ํŠธ service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com Google Cloud Functions ์„œ๋น„์Šค ์—์ด์ „ํŠธ
๊ธฐ์กด Cloud Build ์„œ๋น„์Šค ๊ณ„์ •1 PROJECT_NUMBER@cloudbuild.gserviceaccount.com Cloud Build ์„œ๋น„์Šค ๊ณ„์ •
Cloud Build ์„œ๋น„์Šค ๊ณ„์ • service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com Cloud Build ์„œ๋น„์Šค ์—์ด์ „ํŠธ
Google Container Registry ์„œ๋น„์Šค ์—์ด์ „ํŠธ service-PROJECT_NUMBER@containerregistry.iam.gserviceaccount.com Container Registry ์„œ๋น„์Šค ์—์ด์ „ํŠธ
Artifact Registry ์„œ๋น„์Šค ์—์ด์ „ํŠธ service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com Artifact Registry ์„œ๋น„์Šค ์—์ด์ „ํŠธ

๋Ÿฐํƒ€์ž„ ์„œ๋น„์Šค ๊ณ„์ •

๋Ÿฐํƒ€์ž„ ์‹œ Cloud Run Functions๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํŽธ์ง‘์ž ์—ญํ• ๋„ ์žˆ๋Š” Compute Engine ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ •(PROJECT_NUMBER-compute@developer.gserviceaccount.com)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„œ๋น„์Šค ๊ณ„์ •์˜ ์—ญํ• ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์ œํ•œํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ID๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ์„œ๋น„์Šค ๊ณ„์ • ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ด€๋ฆฌ ์„œ๋น„์Šค ๊ณ„์ •

ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์‚ญ์ œํ•˜๋Š” ๋™์•ˆ ํ”„๋กœ์ ํŠธ์—์„œ ๊ด€๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด Cloud Run Functions์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— Google Cloud Functions ์„œ๋น„์Šค ์—์ด์ „ํŠธ ์„œ๋น„์Šค ๊ณ„์ •(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ชจ๋“  ๋Ÿฐํƒ€์ž„์€ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋นŒ๋“œ์™€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ํ”„๋กœ๋น„์ €๋‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์„œ๋น„์Šค ๊ณ„์ •์—๋Š” ์ด์ „ ํ‘œ์— ๋‚˜์—ด๋œ ์—ญํ• ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Google Cloud Functions ์„œ๋น„์Šค ์—์ด์ „ํŠธ ์„œ๋น„์Šค ๊ณ„์ •

๊ธฐ๋ณธ์ ์œผ๋กœ Google Cloud Functions ์„œ๋น„์Šค ์—์ด์ „ํŠธ ์„œ๋น„์Šค ๊ณ„์ •(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)์—๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ cloudfunctions.serviceAgent ์—ญํ• ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ cloudfunctions.serviceAgent์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๊ถŒํ•œ์ž…๋‹ˆ๋‹ค.

๊ถŒํ•œ ์„ค๋ช…
roles/artifactregistry.admin Artifact Registry์—์„œ ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋นŒ๋“œ ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
roles/cloudbuild.builds.editor ์‚ฌ์šฉ์ž ํ”„๋กœ์ ํŠธ์—์„œ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Cloud Build๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
roles/cloudbuild.customworkers.builder Cloud Build ์ปค์Šคํ…€ ์ž‘์—…์ž์—์„œ ๋นŒ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
compute.globalOperations.get,
compute.networks.access,
vpcaccess.connectors.{get, use}
์†Œ๋น„์ž ํ”„๋กœ์ ํŠธ VPC์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•ฉ๋‹ˆ๋‹ค.
roles/eventarc.developer ํ•จ์ˆ˜์˜ Eventarc ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
firebasedatabase.instances.{get, update} Firebase ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋œ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
iam.serviceAccounts.{actAs, getAccessToken, signBlob} ๋Ÿฐํƒ€์ž„ ์„œ๋น„์Šค ๊ณ„์ • ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
iam.serviceAccounts.getOpenIdToken ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ์šฉ์ž ์ง€์ • ๊ถŒํ•œ์— ๋Œ€ํ•œ OpenID ํ† ํฐ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. OpenID ํ† ํฐ์€ IAM์ด ์‚ฌ์šฉ ์„ค์ •๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
pubsub.subscriptions ์‚ฌ์šฉ์ž ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ๋…์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
pubsub.topics ์‚ฌ์šฉ์ž ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์ œ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
roles/run.developer ํ•จ์ˆ˜์˜ Cloud Run ์„œ๋น„์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
storage.buckets.create,
storage.objects.{delete, get, create, list}
์‚ฌ์šฉ์ž ํ”„๋กœ์ ํŠธ์— ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์ •์˜๋œ IAM ์—ญํ• ์—์„œ ๋˜๋Š” ์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ „์ฒด ๊ถŒํ•œ ์ง‘ํ•ฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud iam roles describe roles/cloudfunctions.serviceAgent

ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ์—ญํ• ์„ ์ œ๊ฑฐํ•˜๊ณ  Cloud Functions ์„œ๋น„์Šค ์—์ด์ „ํŠธ ์—ญํ• ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด ์„œ๋น„์Šค ๊ณ„์ •์„ ๊ธฐ๋ณธ ์—ญํ• ๋กœ ์žฌ์„ค์ •ํ•˜์„ธ์š”.

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member serviceAccount:service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \
  --role roles/cloudfunctions.serviceAgent

๊ถŒํ•œ ์˜ค๋ฅ˜ ๋ฌธ์ œํ•ด๊ฒฐ

ํ”„๋กœ์ ํŠธ์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ฐฐํฌ, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ ๋˜๋Š” ์‹คํ–‰ ์‹œ์— ๊ถŒํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํŽธ์ง‘์ž ๋˜๋Š” ์†Œ์œ ์ž ์—ญํ• ์ด ์žˆ๋Š”์ง€ Cloud Functions ๊ฐœ๋ฐœ์ž ์—ญํ• ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€์—์„œ Cloud Functions ๊ฐœ๋ฐœ์ž ์—ญํ• ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ IAM ์„œ๋น„์Šค ๊ณ„์ • ์‚ฌ์šฉ์ž ์—ญํ• ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ํ˜„์žฌ ํ•จ์ˆ˜๋ณ„ ์ˆ˜์ค€์—์„œ๋Š” ์‹คํ–‰ ๊ถŒํ•œ๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

  2. Cloud Functions ์„œ๋น„์Šค ์—์ด์ „ํŠธ ์„œ๋น„์Šค ๊ณ„์ •(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)์— ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ Cloud Functions ์„œ๋น„์Šค ์—์ด์ „ํŠธ(cloudfunctions.serviceAgent) ์—ญํ• ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    ์ด ๊ณ„์ •์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด Console IAM ํŽ˜์ด์ง€์˜ ๊ถŒํ•œ ํƒญ์—์„œ Google ์ œ๊ณต ์—ญํ•  ๋ถ€์—ฌ ํฌํ•จ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. gcloud projects add-iam-policy-binding PROJECT_ID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. Pub/Sub ๋˜๋Š” Cloud Storage์™€ ๊ฐ™์€ ํŠธ๋ฆฌ๊ฑฐ ์†Œ์Šค์— ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ '๊ถŒํ•œ ๋ถ€์กฑ' ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ธ์ฆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ๋Ÿฐํƒ€์ž„ ์„œ๋น„์Šค ๊ณ„์ •์— ํ•จ์ˆ˜์—์„œ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ 2๋‹จ๊ณ„์™€ 3๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํฌ ์ค‘์— '์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ' ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์„œ๋น„์Šค ๊ณ„์ • PROJECT_ID@appspot.gserviceaccount.com์ด ํ”„๋กœ์ ํŠธ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ •์ด ์‚ญ์ œ๋œ ๊ฒฝ์šฐ ์ด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๋ ค๋ฉด ์„œ๋น„์Šค ๊ณ„์ • ์‚ญ์ œ ์ทจ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Cloud Run Functions ๋ฌธ์ œ ํ•ด๊ฒฐ๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

1 Cloud Run Functions๋Š” 2024๋…„ 7์›” ์ „์— ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ์—๋งŒ ๊ธฐ์กด Cloud Build ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.