ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•ด ์•ก์„ธ์Šค๋ฅผ ๋ถ€์—ฌ, ๋ณ€๊ฒฝ, ์ทจ์†Œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

Google Cloud ์ฝ˜์†”, Google Cloud CLI, REST API ๋˜๋Š” Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • Enable the Resource Manager API.

    Enable the API

  • ์ธ์ฆ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    C#

    ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ด ํŽ˜์ด์ง€์˜ .NET ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•œ ํ›„ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. Install the Google Cloud CLI.

    2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ Google Cloud ์ธ์ฆ ๋ฌธ์„œ์˜ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ADC ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    Java

    ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ด ํŽ˜์ด์ง€์˜ Java ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•œ ํ›„ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. Install the Google Cloud CLI.

    2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ Google Cloud ์ธ์ฆ ๋ฌธ์„œ์˜ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ADC ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    Python

    ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ด ํŽ˜์ด์ง€์˜ Python ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด gcloud CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•œ ํ›„ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    1. Install the Google Cloud CLI.

    2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

      If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ Google Cloud ์ธ์ฆ ๋ฌธ์„œ์˜ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ADC ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

    REST

    ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ด ํŽ˜์ด์ง€์˜ REST API ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด gcloud CLI์— ์ œ๊ณตํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

      Install the Google Cloud CLI.

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ Google Cloud ์ธ์ฆ ๋ฌธ์„œ์˜ REST ์‚ฌ์šฉ์„ ์œ„ํ•œ ์ธ์ฆ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

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

ํ”„๋กœ์ ํŠธ, ํด๋” ๋˜๋Š” ์กฐ์ง์„ ๋งŒ๋“ค๋ฉด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์—ญํ• ์ด ์ž๋™์œผ๋กœ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ๋ณธ ์ •์ฑ…์„ ์ฐธ์กฐํ•˜์„ธ์š”.

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

ํ”„๋กœ์ ํŠธ, ํด๋” ๋˜๋Š” ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์œผ๋ ค๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ (ํ”„๋กœ์ ํŠธ, ํด๋” ๋˜๋Š” ์กฐ์ง)์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋‹ค์Œ IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”.

  • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ: ํ”„๋กœ์ ํŠธ IAM ๊ด€๋ฆฌ์ž(roles/resourcemanager.projectIamAdmin)
  • ํด๋”์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ: ํด๋” ๊ด€๋ฆฌ์ž(roles/resourcemanager.folderAdmin)
  • ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ: ์กฐ์ง ๊ด€๋ฆฌ์ž(roles/resourcemanager.organizationAdmin)
  • ๊ฑฐ์˜ ๋ชจ๋“  Google Cloud ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ: ๋ณด์•ˆ ๊ด€๋ฆฌ์ž(roles/iam.securityAdmin)

์ด๋Ÿฌํ•œ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์—๋Š” ํ”„๋กœ์ ํŠธ, ํด๋” ๋˜๋Š” ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ •ํ™•ํ•œ ๊ถŒํ•œ์„ ๋ณด๋ ค๋ฉด ํ•„์ˆ˜ ๊ถŒํ•œ ์„น์…˜์„ ํŽผ์น˜์„ธ์š”.

ํ•„์ˆ˜ ๊ถŒํ•œ

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

  • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๊ด€๋ฆฌ:
    • resourcemanager.projects.getIamPolicy
    • resourcemanager.projects.setIamPolicy
  • ํด๋”์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ:
    • resourcemanager.folders.getIamPolicy
    • resourcemanager.folders.setIamPolicy
  • ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๊ด€๋ฆฌ:
    • resourcemanager.organizations.getIamPolicy
    • resourcemanager.organizations.setIamPolicy

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

ํ˜„์žฌ ์•ก์„ธ์Šค ๋ณด๊ธฐ

Google Cloud ์ฝ˜์†”, gcloud CLI, REST API ๋˜๋Š” Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ, ํด๋” ๋˜๋Š” ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ IAM ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    IAM์œผ๋กœ ์ด๋™

  2. ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

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

  3. ์„ ํƒ์‚ฌํ•ญ: ์„œ๋น„์Šค ์—์ด์ „ํŠธ์— ๋Œ€ํ•œ ์—ญํ•  ๋ถ€์—ฌ๋ฅผ ๋ณด๋ ค๋ฉด Google์ œ๊ณต ์—ญํ•  ๋ถ€์—ฌ ํฌํ•จ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

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

    ๋ฆฌ์†Œ์Šค์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด get-iam-policy ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    ๋‹ค์Œ ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • RESOURCE_TYPE: ์•ก์„ธ์Šค๋ฅผ ๋ณด๋ ค๋Š” ๋ฆฌ์†Œ์Šค์˜ ์œ ํ˜•. projects, resource-manager folders, organizations ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • RESOURCE_ID: Google Cloud ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง ID์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ID๋Š” my-project์™€ ๊ฐ™์€ ์˜์ˆซ์ž์ž…๋‹ˆ๋‹ค. ํด๋” ๋ฐ ์กฐ์ง ID๋Š” 123456789012์™€ ๊ฐ™์€ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

    • FORMAT: ์ •์ฑ…์— ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ˜•์‹. json ๋˜๋Š” yaml์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • PATH: ์ •์ฑ…์— ๋Œ€ํ•œ ์ƒˆ ์ถœ๋ ฅ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ช…๋ น์–ด๋Š” my-project ํ”„๋กœ์ ํŠธ์˜ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๊ณ  ์ด๋ฅผ JSON ํ˜•์‹์œผ๋กœ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    gcloud projects get-iam-policy my-project --format=json > ~/policy.json

C#

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํด๋” ๋˜๋Š” ์กฐ์ง์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Java

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํด๋” ๋˜๋Š” ์กฐ์ง์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

import com.google.cloud.resourcemanager.v3.ProjectsClient;
import com.google.iam.admin.v1.ProjectName;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import java.io.IOException;

public class GetProjectPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";

    getProjectPolicy(projectId);
  }

  // Gets a project's policy.
  public static Policy getProjectPolicy(String projectId) throws IOException {
    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (ProjectsClient projectsClient = ProjectsClient.create()) {
      GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
              .setResource(ProjectName.of(projectId).toString())
              .build();
      return projectsClient.getIamPolicy(request);
    }
  }
}

Python

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

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

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํด๋” ๋˜๋Š” ์กฐ์ง์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

from google.cloud import resourcemanager_v3
from google.iam.v1 import iam_policy_pb2, policy_pb2


def get_project_policy(project_id: str) -> policy_pb2.Policy:
    """Get policy for project.

    project_id: ID or number of the Google Cloud project you want to use.
    """

    client = resourcemanager_v3.ProjectsClient()
    request = iam_policy_pb2.GetIamPolicyRequest()
    request.resource = f"projects/{project_id}"

    policy = client.get_iam_policy(request)
    print(f"Policy retrieved: {policy}")

    return policy

REST

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

Resource Manager API์˜ getIamPolicy ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • API_VERSION: ์‚ฌ์šฉํ•  API ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฐ ์กฐ์ง์— v1์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํด๋”์—๋Š” v2๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • RESOURCE_TYPE: ์ •์ฑ…์„ ๊ด€๋ฆฌํ•  ๋ฆฌ์†Œ์Šค ์œ ํ˜•. projects, folders, organizations ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • RESOURCE_ID: Google Cloudํ”„๋กœ์ ํŠธ, ์กฐ์ง, ํด๋” ID์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ID๋Š” my-project์™€ ๊ฐ™์€ ์˜์ˆซ์ž ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ํด๋” ๋ฐ ์กฐ์ง ID๋Š” 123456789012์™€ ๊ฐ™์€ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.
  • POLICY_VERSION: ๋ฐ˜ํ™˜ํ•  ์ •์ฑ… ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์š”์ฒญ์—๋Š” ์ •์ฑ… ๋ฒ„์ „ 3์ธ ์ตœ์‹  ์ •์ฑ… ๋ฒ„์ „์ด ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ •์ฑ… ๋ฒ„์ „ ์ง€์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

JSON ์š”์ฒญ ๋ณธ๋ฌธ:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.

์‘๋‹ต์—๋Š” ๋ฆฌ์†Œ์Šค์˜ ํ—ˆ์šฉ ์ •์ฑ…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:my-user@example.com"
      ]
    }
  ]
}

๋‹จ์ผ ์—ญํ•  ๋ถ€์—ฌ ๋˜๋Š” ์ทจ์†Œ

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

์ผ๋ฐ˜์ ์œผ๋กœ ์ •์ฑ… ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ 2๋ถ„ ์ด๋‚ด์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์‹œ์Šคํ…œ ์ „์ฒด์— ์ „ํŒŒ๋˜๋ ค๋ฉด 7๋ถ„ ์ด์ƒ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ ์ ˆํ•œ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ํ•„์š”ํ•˜๋ฉด ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ•  ์„ ํƒ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹จ์ผ ์—ญํ•  ๋ถ€์—ฌ

์ฃผ ๊ตฌ์„ฑ์›์— ๋‹จ์ผ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ IAM ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    IAM์œผ๋กœ ์ด๋™

  2. ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. ์—ญํ• ์„ ๋ถ€์—ฌํ•  ์ฃผ ๊ตฌ์„ฑ์›์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ด๋ฏธ ๋‹ค๋ฅธ ์—ญํ• ์ด ์žˆ๋Š” ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์ฃผ ๊ตฌ์„ฑ์›์ด ํฌํ•จ๋œ ํ–‰์„ ์ฐพ์•„ ํ•ด๋‹น ํ–‰์—์„œ ์ฃผ ๊ตฌ์„ฑ์› ์ˆ˜์ •์„ ํด๋ฆญํ•˜๊ณ  ๋‹ค๋ฅธ ์—ญํ•  ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

      ์„œ๋น„์Šค ์—์ด์ „ํŠธ์— ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด Google์ œ๊ณต ์—ญํ•  ๋ถ€์—ฌ ํฌํ•จ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ๊ธฐ์กด ์—ญํ• ์ด ์—†๋Š” ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ํด๋ฆญํ•œ ํ›„ ์ฃผ ๊ตฌ์„ฑ์›์˜ ์‹๋ณ„์ž๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: my-user@example.com).

  4. ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ ๋ถ€์—ฌํ•  ์—ญํ• ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ ํฌํ•จ๋œ ์—ญํ• ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  5. ์„ ํƒ์‚ฌํ•ญ: ์—ญํ• ์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  6. ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์—ญํ• ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

2๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์—์„œ ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Google Cloud ์ฝ˜์†”์—์„œ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋กœ ์ด๋™

  2. ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ๋‘ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. ์ •๋ณด ํŒจ๋„์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜์œผ๋ฉด ์ •๋ณด ํŒจ๋„ ํ‘œ์‹œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ํ›„ ๊ถŒํ•œ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ์—ญํ• ์„ ๋ถ€์—ฌํ•  ์ฃผ ๊ตฌ์„ฑ์›์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    • ์ด๋ฏธ ๋‹ค๋ฅธ ์—ญํ• ์ด ์žˆ๋Š” ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์ฃผ ๊ตฌ์„ฑ์›์ด ํฌํ•จ๋œ ํ–‰์„ ์ฐพ์•„ ํ•ด๋‹น ํ–‰์—์„œ ์ฃผ ๊ตฌ์„ฑ์› ์ˆ˜์ •์„ ํด๋ฆญํ•˜๊ณ  ๋‹ค๋ฅธ ์—ญํ•  ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    • ๋‹ค๋ฅธ ์—ญํ• ์ด ์•„์ง ์—†๋Š” ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์ฃผ ๊ตฌ์„ฑ์› ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•œ ํ›„ ์ฃผ ๊ตฌ์„ฑ์›์˜ ์‹๋ณ„์ž๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: my-user@example.com).

  5. ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ ๋ถ€์—ฌํ•  ์—ญํ• ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  6. ์„ ํƒ์‚ฌํ•ญ: ์—ญํ• ์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  7. ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•œ ๊ฐ ๋ฆฌ์†Œ์Šค์—์„œ ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์„ ํƒํ•œ ์—ญํ• ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. add-iam-policy-binding ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์—ญํ• ์„ ๋น ๋ฅด๊ฒŒ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์•„๋ž˜์˜ ๋ช…๋ น์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • RESOURCE_TYPE: ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•  ๋ฆฌ์†Œ์Šค ์œ ํ˜•์ž…๋‹ˆ๋‹ค. projects, resource-manager folders, organizations๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • RESOURCE_ID: Google Cloud ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง ID์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ID๋Š” my-project์™€ ๊ฐ™์€ ์˜์ˆซ์ž์ž…๋‹ˆ๋‹ค. ํด๋” ๋ฐ ์กฐ์ง ID๋Š” 123456789012์™€ ๊ฐ™์€ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

    • PRINCIPAL: ์ฃผ ๊ตฌ์„ฑ์›์ด๋‚˜ ๊ตฌ์„ฑ์›์˜ ์‹๋ณ„์ž๋กœ, ๋Œ€๊ฐœ PRINCIPAL_TYPE:ID ํ˜•์‹์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด user:my-user@example.com์ž…๋‹ˆ๋‹ค. PRINCIPAL์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ „์ฒด ๊ฐ’ ๋ชฉ๋ก์€ ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

      ์ฃผ ๊ตฌ์„ฑ์› ์œ ํ˜• user์˜ ๊ฒฝ์šฐ ์‹๋ณ„์ž์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์€ Google Workspace ๋„๋ฉ”์ธ์ด๋‚˜ Cloud ID ๋„๋ฉ”์ธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Cloud ID ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Cloud ID ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    • ROLE_NAME: ์ทจ์†Œํ•  ์—ญํ• ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ํ˜•์‹ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

      • ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• : roles/SERVICE.IDENTIFIER
      • ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ์ปค์Šคํ…€ ์—ญํ• : projects/PROJECT_ID/roles/IDENTIFIER
      • ์กฐ์ง ์ˆ˜์ค€ ์ปค์Šคํ…€ ์—ญํ• : organizations/ORG_ID/roles/IDENTIFIER

      ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์˜ ๋ชฉ๋ก์€ ์—ญํ•  ์ดํ•ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    • CONDITION: ์—ญํ•  ๋ฐ”์ธ๋”ฉ์— ์ถ”๊ฐ€ํ•  ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค. ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด None ๊ฐ’์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์กฐ๊ฑด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์กฐ๊ฑด ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    Linux, macOS ๋˜๋Š” Cloud Shell

    gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
        --member=PRINCIPAL --role=ROLE_NAME \
        --condition=CONDITION

    Windows(PowerShell)

    gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID `
        --member=PRINCIPAL --role=ROLE_NAME `
        --condition=CONDITION

    Windows(cmd.exe)

    gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID ^
        --member=PRINCIPAL --role=ROLE_NAME ^
        --condition=CONDITION

    ์‘๋‹ต์—๋Š” ์—…๋ฐ์ดํŠธ๋œ IAM ์ •์ฑ…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ ์—ญํ•  ์ทจ์†Œ

์ฃผ ๊ตฌ์„ฑ์›์˜ ๋‹จ์ผ ์—ญํ• ์„ ์ทจ์†Œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ IAM ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    IAM์œผ๋กœ ์ด๋™

  2. ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ทจ์†Œํ•˜๋ ค๋Š” ์ฃผ ๊ตฌ์„ฑ์›์ด ํฌํ•จ๋œ ํ–‰์„ ์ฐพ์œผ์„ธ์š”. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ํ–‰์—์„œ ์ฃผ ๊ตฌ์„ฑ์› ์ˆ˜์ •์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ์ทจ์†Œํ•˜๋ ค๋Š” ์—ญํ• ์˜ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ๋‹ค์Œ ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. ์‚ฌ์šฉ์ž์—๊ฒŒ์„œ ์—ญํ• ์„ ๋น ๋ฅด๊ฒŒ ์ทจ์†Œํ•˜๋ ค๋ฉด remove-iam-policy-binding ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    gcloud RESOURCE_TYPE remove-iam-policy-binding RESOURCE_ID 
    --member=PRINCIPAL --role=ROLE_NAME

    ๋‹ค์Œ ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • RESOURCE_TYPE: ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•  ๋ฆฌ์†Œ์Šค ์œ ํ˜•์ž…๋‹ˆ๋‹ค. projects, resource-manager folders, organizations๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • RESOURCE_ID: Google Cloud ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง ID์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ID๋Š” my-project์™€ ๊ฐ™์€ ์˜์ˆซ์ž์ž…๋‹ˆ๋‹ค. ํด๋” ๋ฐ ์กฐ์ง ID๋Š” 123456789012์™€ ๊ฐ™์€ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

    • PRINCIPAL: ์ฃผ ๊ตฌ์„ฑ์›์ด๋‚˜ ๊ตฌ์„ฑ์›์˜ ์‹๋ณ„์ž๋กœ, ๋Œ€๊ฐœ PRINCIPAL_TYPE:ID ํ˜•์‹์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด user:my-user@example.com์ž…๋‹ˆ๋‹ค. PRINCIPAL์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ „์ฒด ๊ฐ’ ๋ชฉ๋ก์€ ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

      ์ฃผ ๊ตฌ์„ฑ์› ์œ ํ˜• user์˜ ๊ฒฝ์šฐ ์‹๋ณ„์ž์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์€ Google Workspace ๋„๋ฉ”์ธ์ด๋‚˜ Cloud ID ๋„๋ฉ”์ธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Cloud ID ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Cloud ID ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    • ROLE_NAME: ์ทจ์†Œํ•  ์—ญํ• ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ํ˜•์‹ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

      • ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• : roles/SERVICE.IDENTIFIER
      • ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ์ปค์Šคํ…€ ์—ญํ• : projects/PROJECT_ID/roles/IDENTIFIER
      • ์กฐ์ง ์ˆ˜์ค€ ์ปค์Šคํ…€ ์—ญํ• : organizations/ORG_ID/roles/IDENTIFIER

      ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์˜ ๋ชฉ๋ก์€ ์—ญํ•  ์ดํ•ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ์˜ˆ๋ฅผ ๋“ค์–ด example-project ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด example-service-account@example-project.iam.gserviceaccount.com ์„œ๋น„์Šค ๊ณ„์ •์—์„œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ์ž ์—ญํ• ์„ ์ทจ์†Œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    gcloud projects remove-iam-policy-binding example-project 
    --member=serviceAccount:example-service-account@example-project.iam.gserviceaccount.com
    --role=roles/resourcemanager.projectCreator

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

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์—ญํ•  ๋ถ€์—ฌ ๋˜๋Š” ์ทจ์†Œ

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ์ฃผ ๊ตฌ์„ฑ์›์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๊ณ  ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Google Cloud ์ฝ˜์†”์—์„œ IAM ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    IAM์œผ๋กœ ์ด๋™

  2. ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  3. ์—ญํ• ์„ ์ˆ˜์ •ํ•  ์ฃผ ๊ตฌ์„ฑ์›์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    • ์ด๋ฏธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์—ญํ• ์ด ์žˆ๋Š” ์ฃผ ๊ตฌ์„ฑ์›์˜ ์—ญํ• ์„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์ฃผ ๊ตฌ์„ฑ์›์ด ํฌํ•จ๋œ ํ–‰์„ ์ฐพ์•„ ํ•ด๋‹น ํ–‰์—์„œ ์ฃผ ๊ตฌ์„ฑ์› ์ˆ˜์ •๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋‹ค๋ฅธ ์—ญํ•  ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

      ์„œ๋น„์Šค ์—์ด์ „ํŠธ์— ๋Œ€ํ•œ ์—ญํ• ์„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด Google์ œ๊ณต ์—ญํ•  ๋ถ€์—ฌ ํฌํ•จ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์—ญํ• ์ด ์—†๋Š” ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ํด๋ฆญํ•œ ํ›„ ์ฃผ ๊ตฌ์„ฑ์›์˜ ์‹๋ณ„์ž๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: my-user@example.com).

  4. ์ฃผ ๊ตฌ์„ฑ์›์˜ ์—ญํ• ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ธฐ์กด ์—ญํ• ์ด ์—†๋Š” ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์—ญํ•  ์„ ํƒ์„ ํด๋ฆญํ•œ ํ›„ ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ ๋ถ€์—ฌํ•  ์—ญํ• ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ์ถ”๊ฐ€ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ์—ญํ•  ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•œ ํ›„ ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ ๋ถ€์—ฌํ•  ์—ญํ• ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • ์ฃผ ๊ตฌ์„ฑ์›์˜ ์—ญํ•  ์ค‘ ํ•˜๋‚˜๋ฅผ ๋‹ค๋ฅธ ์—ญํ• ๋กœ ๋Œ€์ฒดํ•˜๋ ค๋ฉด ๊ธฐ์กด ์—ญํ• ์„ ํด๋ฆญํ•œ ๋‹ค์Œ ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ ๋ถ€์—ฌํ•  ๋‹ค๋ฅธ ์—ญํ• ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • ์ฃผ ๊ตฌ์„ฑ์› ์—ญํ•  ์ค‘ ํ•˜๋‚˜๋ฅผ ์ทจ์†Œํ•˜๋ ค๋ฉด ์ทจ์†Œํ•˜๋ ค๋Š” ๊ฐ ์—ญํ• ์˜ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    ์—ญํ• ์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—ญํ• ์˜ ์กฐ๊ฑด์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์—ญํ• ์˜ ์กฐ๊ฑด์„ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋ฐฉ์‹์œผ๋กœ ์—ฌ๋Ÿฌ ์—ญํ•  ๋ถ€์—ฌ ๋˜๋Š” ์ทจ์†Œ

์—ฌ๋Ÿฌ ์ฃผ ๊ตฌ์„ฑ์›์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์—ญํ• ์˜ ๋ถ€์—ฌ ๋ฐ ์ทจ์†Œ๊ฐ€ ํฌํ•จ๋œ ๋Œ€๊ทœ๋ชจ ์•ก์„ธ์Šค ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ฝ๊ธฐ-์ˆ˜์ •-์“ฐ๊ธฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

  1. getIamPolicy()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ˜„์žฌ ํ—ˆ์šฉ ์ •์ฑ…์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  2. ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋ฐฉ์‹์œผ๋กœ ํ—ˆ์šฉ ์ •์ฑ…์„ ์ˆ˜์ •ํ•˜์—ฌ ์ฃผ ๊ตฌ์„ฑ์› ๋˜๋Š” ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
  3. setIamPolicy()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

gcloud CLI, REST API ๋˜๋Š” Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ—ˆ์šฉ ์ •์ฑ…์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ •์ฑ… ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ 2๋ถ„ ์ด๋‚ด์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์‹œ์Šคํ…œ ์ „์ฒด์— ์ „ํŒŒ๋˜๋ ค๋ฉด 7๋ถ„ ์ด์ƒ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ—ˆ์šฉ ์ •์ฑ… ๊ฐ€์ ธ์˜ค๊ธฐ

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. ๋ฆฌ์†Œ์Šค์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด get-iam-policy ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    ๋‹ค์Œ ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • RESOURCE_TYPE: ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ๋ฆฌ์†Œ์Šค์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. projects, resource-manager folders, organizations ์ค‘ ํ•œ ๊ฐ€์ง€ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • RESOURCE_ID: Google Cloud ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง ID์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ID๋Š” my-project์™€ ๊ฐ™์€ ์˜์ˆซ์ž์ž…๋‹ˆ๋‹ค. ํด๋” ๋ฐ ์กฐ์ง ID๋Š” 123456789012์™€ ๊ฐ™์€ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

    • FORMAT: ํ—ˆ์šฉ ์ •์ฑ…์— ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค. json ๋˜๋Š” yaml์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • PATH: ํ—ˆ์šฉ ์ •์ฑ…์— ๋Œ€ํ•œ ์ƒˆ ์ถœ๋ ฅ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ช…๋ น์–ด๋Š” my-project ํ”„๋กœ์ ํŠธ์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๊ณ  ์ด๋ฅผ JSON ํ˜•์‹์œผ๋กœ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    gcloud projects get-iam-policy my-project --format json > ~/policy.json

C#

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํด๋” ๋˜๋Š” ์กฐ์ง์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Java

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํด๋” ๋˜๋Š” ์กฐ์ง์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

import com.google.cloud.resourcemanager.v3.ProjectsClient;
import com.google.iam.admin.v1.ProjectName;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import java.io.IOException;

public class GetProjectPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";

    getProjectPolicy(projectId);
  }

  // Gets a project's policy.
  public static Policy getProjectPolicy(String projectId) throws IOException {
    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (ProjectsClient projectsClient = ProjectsClient.create()) {
      GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
              .setResource(ProjectName.of(projectId).toString())
              .build();
      return projectsClient.getIamPolicy(request);
    }
  }
}

Python

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํด๋” ๋˜๋Š” ์กฐ์ง์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

from google.cloud import resourcemanager_v3
from google.iam.v1 import iam_policy_pb2, policy_pb2


def get_project_policy(project_id: str) -> policy_pb2.Policy:
    """Get policy for project.

    project_id: ID or number of the Google Cloud project you want to use.
    """

    client = resourcemanager_v3.ProjectsClient()
    request = iam_policy_pb2.GetIamPolicyRequest()
    request.resource = f"projects/{project_id}"

    policy = client.get_iam_policy(request)
    print(f"Policy retrieved: {policy}")

    return policy

REST

Resource Manager API์˜ getIamPolicy ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • API_VERSION: ์‚ฌ์šฉํ•  API ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฐ ์กฐ์ง์— v1์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํด๋”์—๋Š” v2๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • RESOURCE_TYPE: ์ •์ฑ…์„ ๊ด€๋ฆฌํ•  ๋ฆฌ์†Œ์Šค ์œ ํ˜•. projects, folders, organizations ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • RESOURCE_ID: Google Cloudํ”„๋กœ์ ํŠธ, ์กฐ์ง, ํด๋” ID์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ID๋Š” my-project์™€ ๊ฐ™์€ ์˜์ˆซ์ž ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ํด๋” ๋ฐ ์กฐ์ง ID๋Š” 123456789012์™€ ๊ฐ™์€ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.
  • POLICY_VERSION: ๋ฐ˜ํ™˜ํ•  ์ •์ฑ… ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์š”์ฒญ์—๋Š” ์ •์ฑ… ๋ฒ„์ „ 3์ธ ์ตœ์‹  ์ •์ฑ… ๋ฒ„์ „์ด ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ •์ฑ… ๋ฒ„์ „ ์ง€์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

JSON ์š”์ฒญ ๋ณธ๋ฌธ:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.

์‘๋‹ต์—๋Š” ๋ฆฌ์†Œ์Šค์˜ ํ—ˆ์šฉ ์ •์ฑ…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:my-user@example.com"
      ]
    }
  ]
}

์ ์ ˆํ•œ ์œ ํ˜•์˜ ํŒŒ์ผ๋กœ ์‘๋‹ต์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(json ๋˜๋Š” yaml).

ํ—ˆ์šฉ ์ •์ฑ… ์ˆ˜์ •

ํŠน์ • ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๊ฑฐ๋‚˜ ์ด ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์„ ์ทจ์†Œํ•˜๋ ค๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ๋ฐฉ์‹์œผ๋กœ ๋˜๋Š” ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ํ—ˆ์šฉ ์ •์ฑ…์˜ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ํ—ˆ์šฉ ์ •์ฑ…์˜ etag ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์ง€ ๋งˆ์„ธ์š”. etag ํ•„๋“œ๋Š” ํ—ˆ์šฉ ์ •์ฑ…์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋ฉด IAM์€ ์š”์ฒญ์— ์žˆ๋Š” etag ๊ฐ’์„ ๊ธฐ์กด etag์™€ ๋น„๊ตํ•˜๊ณ  ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ—ˆ์šฉ ์ •์ฑ…์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

ํ—ˆ์šฉ ์ •์ฑ…์ด ๋ถ€์—ฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ํ—ˆ์šฉ ์ •์ฑ…์—์„œ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ญํ•  ๋ฐ”์ธ๋”ฉ์˜ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  "role": "ROLE_NAME",
  "members": [
    "PRINCIPAL_1",
    "PRINCIPAL_2",
    ...
    "PRINCIPAL_N"
  ],
  "conditions:" {
    CONDITIONS
  }
}

์ž๋ฆฌํ‘œ์‹œ์ž์˜ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ROLE_NAME: ๋ถ€์—ฌํ•  ์—ญํ• ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ํ˜•์‹ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

    • ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• : roles/SERVICE.IDENTIFIER
    • ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ์ปค์Šคํ…€ ์—ญํ• : projects/PROJECT_ID/roles/IDENTIFIER
    • ์กฐ์ง ์ˆ˜์ค€ ์ปค์Šคํ…€ ์—ญํ• : organizations/ORG_ID/roles/IDENTIFIER

    ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์˜ ๋ชฉ๋ก์€ ์—ญํ•  ์ดํ•ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • PRINCIPAL_1, PRINCIPAL_2, ...PRINCIPAL_N: ์—ญํ• ์„ ๋ถ€์—ฌํ•  ์ฃผ ๊ตฌ์„ฑ์›์˜ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.

    ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ PRINCIPAL-TYPE:ID ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด user:my-user@example.com์ž…๋‹ˆ๋‹ค. PRINCIPAL์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ „์ฒด ๊ฐ’ ๋ชฉ๋ก์€ ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

    ์ฃผ ๊ตฌ์„ฑ์› ์œ ํ˜• user์˜ ๊ฒฝ์šฐ ์‹๋ณ„์ž์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์€ Google Workspace ๋„๋ฉ”์ธ์ด๋‚˜ Cloud ID ๋„๋ฉ”์ธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Cloud ID ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Cloud ID ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • CONDITIONS: ์„ ํƒ์‚ฌํ•ญ. ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜๋Š” ์‹œ์ ์„ ์ง€์ •ํ•˜๋Š” ๋ชจ๋“  ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

์—ญํ•  ๋ถ€์—ฌ

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

ํ•„์š”์— ๋”ฐ๋ผ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋  ๋•Œ๋งŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ ํ—ˆ์šฉ ์ •์ฑ…์— ํฌํ•จ๋œ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์ฃผ ๊ตฌ์„ฑ์›์„ ๊ธฐ์กด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

gcloud

์ฃผ ๊ตฌ์„ฑ์›์„ ๊ธฐ์กด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐ˜ํ™˜๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•ด์•ผ๋งŒ ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ—ˆ์šฉ ์ •์ฑ…์— ๋‹ค์Œ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์ด ํฌํ•จ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์„ธ์š”. ์ด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์€ ๋ณด์•ˆ ๊ฒ€ํ† ์ž ์—ญํ• (roles/iam.securityReviewer)์„ Kai์— ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com"
  ]
}

๋™์ผํ•œ ์—ญํ• ์„ Raha์— ๋ถ€์—ฌํ•˜๋ ค๋ฉด Raha์˜ ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž๋ฅผ ๊ธฐ์กด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

C#

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddMember(Policy policy, string role, string member)
    {
        var binding = policy.Bindings.First(x => x.Role == role);
        binding.Members.Add(member);
        return policy;
    }
}

Go

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

import (
	"fmt"
	"io"

	"google.golang.org/api/iam/v1"
)

// addMember adds a member to a role binding.
func addMember(w io.Writer, policy *iam.Policy, role, member string) {
	for _, binding := range policy.Bindings {
		if binding.Role != role {
			continue
		}
		for _, m := range binding.Members {
			if m != member {
				continue
			}
			fmt.Fprintf(w, "Role %q found. Member already exists.\n", role)
			return
		}
		binding.Members = append(binding.Members, member)
		fmt.Fprintf(w, "Role %q found. Member added.\n", role)
		return
	}
	fmt.Fprintf(w, "Role %q not found. Member not added.\n", role)
}

Java

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import java.util.ArrayList;
import java.util.List;

public class AddMember {
  public static void main(String[] args) {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();
    // TODO: Replace with your role.
    String role = "roles/existing-role";
    // TODO: Replace with your member.
    String member = "user:member-to-add@example.com";

    addMember(policy, role, member);
  }

  // Adds a member to a pre-existing role.
  public static Policy addMember(Policy policy, String role, String member) {
    List<Binding> newBindingsList = new ArrayList<>();

    for (Binding b : policy.getBindingsList()) {
      if (b.getRole().equals(role)) {
        newBindingsList.add(b.toBuilder().addMembers(member).build());
      } else {
        newBindingsList.add(b);
      }
    }

    // Update the policy to add the member.
    Policy updatedPolicy = policy.toBuilder()
            .clearBindings()
            .addAllBindings(newBindingsList)
            .build();

    System.out.println("Added member: " + updatedPolicy.getBindingsList());

    return updatedPolicy;
  }
}

Python

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

from google.iam.v1 import policy_pb2
from snippets.get_policy import get_project_policy
from snippets.set_policy import set_project_policy


def modify_policy_add_principal(
    project_id: str, role: str, principal: str
) -> policy_pb2.Policy:
    """Add a principal to certain role in project policy.

    project_id: ID or number of the Google Cloud project you want to use.
    role: role to which principal need to be added.
    principal: The principal requesting access.

    For principal ID formats, see https://cloud.google.com/iam/docs/principal-identifiers
    """
    policy = get_project_policy(project_id)

    for bind in policy.bindings:
        if bind.role == role:
            bind.members.append(principal)
            break

    return set_project_policy(project_id, policy)

REST

์ฃผ ๊ตฌ์„ฑ์›์„ ๊ธฐ์กด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐ˜ํ™˜๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•ด์•ผ๋งŒ ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ—ˆ์šฉ ์ •์ฑ…์— ๋‹ค์Œ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์ด ํฌํ•จ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์„ธ์š”. ์ด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์€ ๋ณด์•ˆ ๊ฒ€ํ† ์ž ์—ญํ• (roles/iam.securityReviewer)์„ Kai์— ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com"
  ]
}

๋™์ผํ•œ ์—ญํ• ์„ Raha์— ๋ถ€์—ฌํ•˜๋ ค๋ฉด Raha์˜ ์ฃผ ๊ตฌ์„ฑ์› ์‹๋ณ„์ž๋ฅผ ๊ธฐ์กด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

์ •์ฑ…์— ์•„์ง ํฌํ•จ๋˜์ง€ ์•Š์€ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ์ƒˆ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

gcloud

์ฃผ ๊ตฌ์„ฑ์›์— ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋Š” ์ƒˆ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ—ˆ์šฉ ์ •์ฑ…์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•ด์•ผ๋งŒ ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Compute ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ์ž ์—ญํ• (roles/compute.storageAdmin)์„ Raha์— ๋ถ€์—ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ํ•ด๋‹น ํ—ˆ์šฉ ์ •์ฑ…์˜ bindings ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

{
  "role": "roles/compute.storageAdmin",
  "members": [
    "user:raha@example.com"
  ]
}

C#

IAM์šฉ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ IAM ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM C# API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

IAM์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.


using System.Collections.Generic;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddBinding(Policy policy, string role, string member)
    {
        var binding = new Binding
        {
            Role = role,
            Members = new List<string> { member }
        };
        policy.Bindings.Add(binding);
        return policy;
    }
}

Java

IAM์šฉ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ IAM ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM Java API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

IAM์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.


import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import java.util.Collections;
import java.util.List;

public class AddBinding {
  public static void main(String[] args) {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your policy: GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();
    // TODO: Replace with your role.
    String role = "roles/role-to-add";
    // TODO: Replace with your members.
    List<String> members = Collections.singletonList("user:member-to-add@example.com");

    addBinding(policy, role, members);
  }

  // Adds a member to a role.
  public static Policy addBinding(Policy policy, String role, List<String> members) {
    Binding binding = Binding.newBuilder()
            .setRole(role)
            .addAllMembers(members)
            .build();

    // Update bindings for the policy.
    Policy updatedPolicy = policy.toBuilder().addBindings(binding).build();

    System.out.println("Added binding: " + updatedPolicy.getBindingsList());

    return updatedPolicy;
  }
}

Python

IAM์šฉ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ IAM ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM Python API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

IAM์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

def modify_policy_add_role(policy: dict, role: str, principal: str) -> dict:
    """Adds a new role binding to a policy."""

    binding = {"role": role, "members": [principal]}
    policy["bindings"].append(binding)
    print(policy)
    return policy

REST

์ฃผ ๊ตฌ์„ฑ์›์— ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋Š” ์ƒˆ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ—ˆ์šฉ ์ •์ฑ…์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•ด์•ผ๋งŒ ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Compute ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ์ž ์—ญํ• (roles/compute.storageAdmin)์„ Raha์— ๋ถ€์—ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ํ•ด๋‹น ํ—ˆ์šฉ ์ •์ฑ…์˜ bindings ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

{
  "role": "roles/compute.storageAdmin",
  "members": [
    "user:raha@example.com"
  ]
}

ํ™œ์„ฑํ™”๋œ API ์„œ๋น„์Šค์™€ ๊ด€๋ จ๋œ ์—ญํ• ๋งŒ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Compute Engine๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ Compute Engine์—๋งŒ ๊ด€๋ จ๋œ ์—ญํ• ์€ ๋ถ€์—ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ API ์‚ฌ์šฉ ๋ฐ ์‚ฌ์šฉ ์ค‘์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ”„๋กœ์ ํŠธ์— ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ๋•Œ, ํŠนํžˆ ์†Œ์œ ์ž(roles/owner) ์—ญํ• ์„ ๋ถ€์—ฌํ•  ๋•Œ ๊ณ ์œ ํ•œ ์ œ์•ฝ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ projects.setIamPolicy() ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์—ญํ•  ์ทจ์†Œ

์—ญํ• ์„ ์ทจ์†Œํ•˜๋ ค๋ฉด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์—์„œ ์ฃผ ๊ตฌ์„ฑ์›์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์—ญํ•  ๋ฐ”์ธ๋”ฉ์— ๋‹ค๋ฅธ ์ฃผ ๊ตฌ์„ฑ์›์ด ์—†์œผ๋ฉด ์ „์ฒด ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

gcloud

get-iam-policy ๋ช…๋ น์–ด์—์„œ ๋ฐ˜ํ™˜๋œ JSON ๋˜๋Š” YAML ํ—ˆ์šฉ ์ •์ฑ…์„ ์ˆ˜์ •ํ•ด ์—ญํ• ์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•ด์•ผ๋งŒ ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ ๊ตฌ์„ฑ์›์˜ ์—ญํ• ์„ ์ทจ์†Œํ•˜๋ ค๋ฉด ํ—ˆ์šฉ ์ •์ฑ…์˜ bindings ๋ฐฐ์—ด์—์„œ ์ฃผ ๊ตฌ์„ฑ์›์ด๋‚˜ ๋ฐ”์ธ๋”ฉ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

C#

IAM์šฉ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ IAM ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM C# API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

IAM์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy RemoveMember(Policy policy, string role, string member)
    {
        try
        {
            var binding = policy.Bindings.First(x => x.Role == role);
            if (binding.Members.Count != 0 && binding.Members.Contains(member))
            {
                binding.Members.Remove(member);
            }
            if (binding.Members.Count == 0)
            {
                policy.Bindings.Remove(binding);
            }
            return policy;
        }
        catch (System.InvalidOperationException e)
        {
            System.Diagnostics.Debug.WriteLine("Role does not exist in policy: \n" + e.ToString());
            return policy;
        }
    }
}

Go

IAM์šฉ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ IAM ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM Go API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

IAM์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

import (
	"fmt"
	"io"

	"google.golang.org/api/iam/v1"
)

// removeMember removes a member from a role binding.
func removeMember(w io.Writer, policy *iam.Policy, role, member string) {
	bindings := policy.Bindings
	bindingIndex, memberIndex := -1, -1
	for bIdx := range bindings {
		if bindings[bIdx].Role != role {
			continue
		}
		bindingIndex = bIdx
		for mIdx := range bindings[bindingIndex].Members {
			if bindings[bindingIndex].Members[mIdx] != member {
				continue
			}
			memberIndex = mIdx
			break
		}
	}
	if bindingIndex == -1 {
		fmt.Fprintf(w, "Role %q not found. Member not removed.\n", role)
		return
	}
	if memberIndex == -1 {
		fmt.Fprintf(w, "Role %q found. Member not found.\n", role)
		return
	}

	members := removeIdx(bindings[bindingIndex].Members, memberIndex)
	bindings[bindingIndex].Members = members
	if len(members) == 0 {
		bindings = removeIdx(bindings, bindingIndex)
		policy.Bindings = bindings
	}
	fmt.Fprintf(w, "Role %q found. Member removed.\n", role)
}

// removeIdx removes arr[idx] from arr.
func removeIdx[T any](arr []T, idx int) []T {
	return append(arr[:idx], arr[idx+1:]...)
}

Java

IAM์šฉ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ IAM ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM Java API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

IAM์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class RemoveMember {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();
    // TODO: Replace with your role.
    String role = "roles/existing-role";
    // TODO: Replace with your member.
    String member = "user:member-to-add@example.com";

    removeMember(policy, role, member);
  }

  // Removes member from a role; removes binding if binding contains no members.
  public static Policy removeMember(Policy policy, String role, String member) {
    // Creating new builder with all values copied from origin policy
    Policy.Builder policyBuilder = policy.toBuilder();

    // Getting binding with suitable role.
    Binding binding = null;
    for (Binding b : policy.getBindingsList()) {
      if (b.getRole().equals(role)) {
        binding = b;
        break;
      }
    }

    if (binding != null && binding.getMembersList().contains(member)) {
      List<String> newMemberList = new ArrayList<>(binding.getMembersList());
      // Removing member from a role
      newMemberList.remove(member);

      System.out.println("Member " + member + " removed from " + role);

      // Adding all remaining members to create new binding
      Binding newBinding = binding.toBuilder()
              .clearMembers()
              .addAllMembers(newMemberList)
              .build();

      List<Binding> newBindingList = new ArrayList<>(policyBuilder.getBindingsList());

      // Removing old binding to replace with new one
      newBindingList.remove(binding);

      // If binding has no more members, binding will not be added
      if (!newBinding.getMembersList().isEmpty()) {
        newBindingList.add(newBinding);
      }

      // Update the policy to remove the member.
      policyBuilder.clearBindings()
              .addAllBindings(newBindingList);
    }

    Policy updatedPolicy = policyBuilder.build();

    System.out.println("Exising members: " + updatedPolicy.getBindingsList());

    return updatedPolicy;
  }
}

Python

IAM์šฉ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ IAM ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ์€ IAM Python API ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

IAM์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

from google.iam.v1 import policy_pb2
from snippets.get_policy import get_project_policy
from snippets.set_policy import set_project_policy


def modify_policy_remove_principal(
    project_id: str, role: str, principal: str
) -> policy_pb2.Policy:
    """Remove a principal from certain role in project policy.

    project_id: ID or number of the Google Cloud project you want to use.
    role: role to revoke.
    principal: The principal to revoke access from.

    For principal ID formats, see https://cloud.google.com/iam/docs/principal-identifiers
    """
    policy = get_project_policy(project_id)

    for bind in policy.bindings:
        if bind.role == role:
            if principal in bind.members:
                bind.members.remove(principal)
            break

    return set_project_policy(project_id, policy, False)

REST

get-iam-policy ๋ช…๋ น์–ด์—์„œ ๋ฐ˜ํ™˜๋œ JSON ๋˜๋Š” YAML ํ—ˆ์šฉ ์ •์ฑ…์„ ์ˆ˜์ •ํ•ด ์—ญํ• ์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•ด์•ผ๋งŒ ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ ๊ตฌ์„ฑ์›์˜ ์—ญํ• ์„ ์ทจ์†Œํ•˜๋ ค๋ฉด ํ—ˆ์šฉ ์ •์ฑ…์˜ bindings ๋ฐฐ์—ด์—์„œ ์ฃผ ๊ตฌ์„ฑ์›์ด๋‚˜ ๋ฐ”์ธ๋”ฉ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

ํ—ˆ์šฉ ์ •์ฑ… ์„ค์ •

์—ญํ• ์„ ๋ถ€์—ฌํ•˜๊ณ  ์ทจ์†Œํ•˜๋„๋ก ํ—ˆ์šฉ ์ •์ฑ…์„ ์ˆ˜์ •ํ•œ ํ›„์—๋Š” setIamPolicy()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ •์ฑ…์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. ๋ฆฌ์†Œ์Šค์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋ ค๋ฉด ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด set-iam-policy ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

    ๋‹ค์Œ ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • RESOURCE_TYPE: ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋ ค๋Š” ๋ฆฌ์†Œ์Šค ์œ ํ˜•์ž…๋‹ˆ๋‹ค. projects, resource-manager folders, organizations ์ค‘ ํ•œ ๊ฐ€์ง€ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • RESOURCE_ID: Google Cloud ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง ID์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ID๋Š” my-project์™€ ๊ฐ™์€ ์˜์ˆซ์ž์ž…๋‹ˆ๋‹ค. ํด๋” ๋ฐ ์กฐ์ง ID๋Š” 123456789012์™€ ๊ฐ™์€ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.

    • PATH: ์ƒˆ ํ—ˆ์šฉ ์ •์ฑ…์ด ํฌํ•จ๋œ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

    ์‘๋‹ต์—๋Š” ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ๋ช…๋ น์–ด๋Š” policy.json์— ์ €์žฅ๋œ ํ—ˆ์šฉ ์ •์ฑ…์„ my-project ํ”„๋กœ์ ํŠธ์˜ ํ—ˆ์šฉ ์ •์ฑ…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    gcloud projects set-iam-policy my-project ~/policy.json

C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy SetPolicy(string projectId, Policy policy)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        return service.Projects.SetIamPolicy(new SetIamPolicyRequest
        {
            Policy = policy
        }, projectId).Execute();
    }
}

Java

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํด๋” ๋˜๋Š” ์กฐ์ง์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

import com.google.cloud.resourcemanager.v3.ProjectsClient;
import com.google.iam.admin.v1.ProjectName;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import com.google.protobuf.FieldMask;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class SetProjectPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";
    // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();

    setProjectPolicy(policy, projectId);
  }

  // Sets a project's policy.
  public static Policy setProjectPolicy(Policy policy, String projectId)
          throws IOException {

    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (ProjectsClient projectsClient = ProjectsClient.create()) {
      List<String> paths = Arrays.asList("bindings", "etag");
      SetIamPolicyRequest request = SetIamPolicyRequest.newBuilder()
              .setResource(ProjectName.of(projectId).toString())
              .setPolicy(policy)
              // A FieldMask specifying which fields of the policy to modify. Only
              // the fields in the mask will be modified. If no mask is provided, the
              // following default mask is used:
              // `paths: "bindings, etag"`
              .setUpdateMask(FieldMask.newBuilder().addAllPaths(paths).build())
              .build();

      return projectsClient.setIamPolicy(request);
    }
  }
}

Python

Resource Manager์— ์ธ์ฆํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Resource Manager์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํด๋” ๋˜๋Š” ์กฐ์ง์˜ ํ—ˆ์šฉ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ Resource Manager ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

from google.cloud import resourcemanager_v3
from google.iam.v1 import iam_policy_pb2, policy_pb2


def set_project_policy(
    project_id: str, policy: policy_pb2.Policy, merge: bool = True
) -> policy_pb2.Policy:
    """
    Set policy for project. Pay attention that previous state will be completely rewritten.
    If you want to update only part of the policy follow the approach read->modify->write.
    For more details about policies check out https://cloud.google.com/iam/docs/policies

    project_id: ID or number of the Google Cloud project you want to use.
    policy: Policy which has to be set.
    merge: The strategy to be used forming the request. CopyFrom is clearing both mutable and immutable fields,
    when MergeFrom is replacing only immutable fields and extending mutable.
    https://googleapis.dev/python/protobuf/latest/google/protobuf/message.html#google.protobuf.message.Message.CopyFrom
    """
    client = resourcemanager_v3.ProjectsClient()

    request = iam_policy_pb2.GetIamPolicyRequest()
    request.resource = f"projects/{project_id}"
    current_policy = client.get_iam_policy(request)

    # Etag should as fresh as possible to lower chance of collisions
    policy.ClearField("etag")
    if merge:
        current_policy.MergeFrom(policy)
    else:
        current_policy.CopyFrom(policy)

    request = iam_policy_pb2.SetIamPolicyRequest()
    request.resource = f"projects/{project_id}"

    # request.etag field also will be merged which means you are secured from collision,
    # but it means that request may fail and you need to leverage exponential retries approach
    # to be sure policy has been updated.
    request.policy.CopyFrom(current_policy)

    policy = client.set_iam_policy(request)
    return policy

REST

Resource Manager API์˜ setIamPolicy ๋ฉ”์„œ๋“œ๋Š” ์š”์ฒญ์˜ ์ •์ฑ…์„ ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์˜ ์ƒˆ ํ—ˆ์šฉ ์ •์ฑ…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • API_VERSION: ์‚ฌ์šฉํ•  API ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฐ ์กฐ์ง์— v1์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํด๋”์—๋Š” v2๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • RESOURCE_TYPE: ์ •์ฑ…์„ ๊ด€๋ฆฌํ•  ๋ฆฌ์†Œ์Šค ์œ ํ˜•. projects, folders, organizations ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • RESOURCE_ID: Google Cloudํ”„๋กœ์ ํŠธ, ์กฐ์ง, ํด๋” ID์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ID๋Š” my-project์™€ ๊ฐ™์€ ์˜์ˆซ์ž ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ํด๋” ๋ฐ ์กฐ์ง ID๋Š” 123456789012์™€ ๊ฐ™์€ ์ˆซ์ž์ž…๋‹ˆ๋‹ค.
  • POLICY: ์„ค์ •ํ•˜๋ ค๋Š” ์ •์ฑ…์˜ JSON ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ์ •์ฑ… ํ˜•์‹์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ •์ฑ… ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy

JSON ์š”์ฒญ ๋ณธ๋ฌธ:

{
  "policy": POLICY
}

์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.

์‘๋‹ต์—๋Š” ์—…๋ฐ์ดํŠธ๋œ ํ—ˆ์šฉ ์ •์ฑ…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

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

์ง์ ‘ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ

Google Cloud๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  Google ์ œํ’ˆ์˜ ์‹ค์ œ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•ด ๋ณด์„ธ์š”. ์‹ ๊ทœ ๊ณ ๊ฐ์—๊ฒŒ๋Š” ์›Œํฌ๋กœ๋“œ๋ฅผ ์‹คํ–‰, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” $300์˜ ๋ฌด๋ฃŒ ํฌ๋ ˆ๋”ง์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๋ฌด๋ฃŒ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ