연결된 서비스 계정 변경


이 문서에서는 다른 서비스 계정을 사용하도록 기존 가상 머신(VM)을 구성하는 방법을 설명합니다. 서비스 계정은 승인된 API 호출을 수행하기 위해 일반적으로 애플리케이션 또는 컴퓨팅 워크로드에서 사용되는 특별한 종류의 계정입니다.

서비스 계정은 커스텀 애플리케이션과 같은 워크로드가 최종 사용자의 개입 없이 Google Cloud 리소스에 액세스해야 하는 시나리오에 필요합니다. 서비스 계정을 사용해야 하는 경우에 대한 자세한 내용은 서비스 계정 사용 권장사항을 참조하세요.

Google Cloud API를 호출해야 하는 애플리케이션이 있는 경우 애플리케이션 또는 워크로드가 실행 중인 VM에 사용자 관리형 서비스 계정을 연결하는 것이 좋습니다. 그런 다음 서비스 계정에 IAM 역할을 부여하면 서비스 계정 및 VM에서 실행되는 애플리케이션까지 Google Cloud 리소스에 액세스할 수 있습니다.

시작하기 전에

  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인하는 프로세스입니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음과 같이 Compute Engine에 인증하면 됩니다.

    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

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      로컬 개발 환경에서 이 페이지의 REST API 샘플을 사용하려면 gcloud CLI에 제공하는 사용자 인증 정보를 사용합니다.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      자세한 내용은 Google Cloud 인증 문서의 REST 사용 인증을 참조하세요.

필요한 역할

VM에서 서비스 계정을 구성하는 데 필요한 권한을 얻으려면 관리자에게 문의해서 VM 또는 프로젝트에 대한 Compute 인스턴스 관리자(v1)(roles/compute.instanceAdmin.v1) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

이 사전 정의된 역할에는 VM에서 서비스 계정을 구성하는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.

필수 권한

VM에서 서비스 계정을 구성하려면 다음 권한이 필요합니다.

  • compute.instances.setServiceAccount
  • compute.instances.stop
  • compute.instances.start

커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

개요

다음과 같이 VM의 서비스 계정을 구성하는 것이 좋습니다.

  1. Compute Engine 기본 서비스 계정을 사용하는 대신 새로운 사용자 관리 서비스 계정을 만들고 이 서비스 계정에 필요한 리소스 및 작업에 대해서만 IAM 역할을 부여합니다.
  2. VM에 서비스 계정을 연결합니다.
  3. VM에서 클라우드 플랫폼(https://www.googleapis.com/auth/cloud-platform) 범위를 설정합니다. 이렇게 하면 VM의 서비스 계정이 사용할 권한이 있는 Google Cloud API를 호출할 수 있습니다.
    • Google Cloud 콘솔을 사용하여 서비스 계정을 지정하는 경우 VM의 액세스 범위는 기본적으로 cloud-platform 범위로 지정됩니다.
    • Google Cloud CLI 또는 Compute Engine API를 사용하여 서비스 계정을 지정하는 경우 scopes 매개변수를 사용하여 액세스 범위를 설정할 수 있습니다.

서비스 계정 설정

사용자 관리 서비스 계정을 만들거나 Compute Engine 기본 서비스 계정을 사용할 수 있습니다. 사용자 관리형 서비스 계정이 권장됩니다.

선택한 서비스 계정에 대해 필요한 Identity and Access Management(IAM) 역할이 할당되었는지 확인합니다.

사용자 관리

사용자 관리 서비스 계정이 아직 없으면 서비스 계정을 만듭니다. 자세한 내용은 서비스 계정 설정을 참조하세요.

기본값

Compute Engine 기본 서비스 계정을 잘 알고 있으며 새 서비스 계정을 만드는 대신 기본 서비스 계정에서 제공하는 사용자 인증 정보를 사용할 경우 기본 서비스 계정에 IAM 역할을 부여할 수 있습니다.

기본 서비스 계정에 IAM 역할을 할당하기 전에 다음 사항에 유의하세요.

  • 기본 서비스 계정에 IAM 역할을 부여하면 기본 서비스 계정으로 실행되는 모든 VM이 영향을 받습니다. 예를 들어 기본 서비스 계정에 roles/storage.objectAdmin 역할을 부여하면 필수 액세스 범위의 기본 서비스 계정으로 실행되는 모든 VM에는 roles/storage.objectAdmin 역할에서 부여되는 권한이 있습니다. 마찬가지로 특정 역할을 생략하여 액세스를 제한하면 기본 서비스 계정으로 실행되는 모든 VM이 영향을 받습니다.

  • 조직 정책 구성에 따라 프로젝트에 대한 편집자 역할이 기본 서비스 계정에 자동으로 부여될 수 있습니다. iam.automaticIamGrantsForDefaultServiceAccounts 조직 정책 제약조건을 적용하여 자동 역할 부여를 중지하는 것이 좋습니다. 2024년 5월 3일 이후에 조직을 만든 경우 기본적으로 이 제약조건이 적용됩니다.

    자동 역할 부여를 중지한 경우 기본 서비스 계정에 부여할 역할을 결정한 후 직접 이러한 역할을 부여해야 합니다.

    기본 서비스 계정에 이미 편집자 역할이 있으면 편집자 역할을 권한이 더 낮은 역할로 바꾸는 것이 좋습니다. 서비스 계정 역할을 안전하게 수정하려면 정책 시뮬레이터를 사용하여 변경사항의 영향을 확인한 후 적절한 역할을 부여하고 취소합니다.

기본 서비스 계정에 IAM 역할을 부여하는 방법이 확실치 않은 경우 대신 새 사용자 관리 서비스 계정을 만들 수 있습니다.

서비스 계정 연결 및 액세스 범위 업데이트

VM의 서비스 계정과 액세스 범위를 변경하려면 VM을 일시적으로 중지해야 합니다.

서비스 계정이 VM과 다른 프로젝트에 있으면 다른 프로젝트의 리소스에 서비스 계정을 구성해야 합니다.

다음 방법 중 하나를 사용하여 VM에서 서비스 계정 및 액세스 범위를 변경합니다.

콘솔

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. 서비스 계정을 변경할 VM 인스턴스 이름을 클릭합니다.

  3. VM이 중지되지 않은 경우 중지를 클릭합니다. VM이 중지될 때까지 기다립니다.

  4. 수정을 클릭합니다.

  5. 서비스 계정 섹션까지 아래로 스크롤합니다.

  6. 드롭다운 목록에서 VM에 할당할 서비스 계정을 선택합니다.

    • 사용자 관리 서비스 계정을 선택하면 VM의 액세스 범위가 기본적으로 권장되는 cloud-platform 범위로 지정됩니다. 사용자 관리 서비스 계정에 다른 범위가 필요한 경우 gcloud CLI 또는 Compute Engine API를 사용하여 서비스 계정을 연결합니다.
    • Compute Engine 기본 서비스 계정을 선택한 경우 Google Cloud 콘솔에서 액세스 범위를 수정할 수 있습니다.
      • 범위를 변경하려면 액세스 범위 섹션에서 각 API에 액세스 설정을 선택하고 필요에 따라 적합한 범위를 설정합니다.
      • 권장 설정할 올바른 액세스 범위를 모른다면 모든 Cloud API에 대한 전체 액세스 허용을 선택한 후 서비스 계정에 IAM 역할을 설정하여 액세스를 제한해야 합니다.
  7. 저장을 클릭하여 변경사항을 저장합니다.

  8. 시작/재개를 클릭하여 VM을 다시 시작합니다.

gcloud

  1. instances stop 명령어를 사용하여 VM을 중지합니다. VM_NAME을 VM 인스턴스의 이름으로 바꿉니다.

    gcloud compute instances stop VM_NAME
    
  2. 서비스 계정을 연결합니다. 서비스 계정을 연결하려면 instances set-service-account 명령어를 사용하고 VM 이름, 서비스 계정 이메일, 원하는 범위를 지정합니다. 액세스 범위 설정에 대한 자세한 내용은 권장사항을 참조하세요.

    gcloud compute instances set-service-account VM_NAME \
      --service-account=SERVICE_ACCOUNT_EMAIL \
      --scopes=SCOPES
    

    다음을 바꿉니다.

    • SERVICE_ACCOUNT_EMAIL: 만든 서비스 계정의 이메일 주소입니다. 예를 들면 my-sa-123@my-project-123.iam.gserviceaccount.com입니다. 이메일 주소를 보려면 서비스 계정 나열을 참조하세요.

      VM에서 서비스 계정을 삭제하려면 --no-service-account 플래그를 사용합니다.

    • VM_NAME: VM 인스턴스의 이름입니다.

    • SCOPES: --scopes 플래그의 설명에 제공된 쉼표로 구분된 범위 URI 또는 별칭 목록입니다.

      VM의 모든 범위를 삭제하려면 대신 --no-scopes 플래그를 사용합니다.

    예를 들어 다음 명령어는 my-sa-123@my-project-123.iam.gserviceaccount.com 서비스 계정을 example-instance라는 VM에 할당하고, Compute Engine에 대한 읽기/쓰기 액세스 권한과 Cloud Storage에 대한 읽기 전용 액세스 권한을 허용하도록 VM의 액세스 범위를 설정합니다.

    gcloud compute instances set-service-account example-instance \
      --service-account=my-sa-123@my-project-123.iam.gserviceaccount.com \
      --scopes=compute-rw,storage-ro
    
  3. instances start 명령어를 사용하여 VM을 시작합니다. VM_NAME을 VM 인스턴스의 이름으로 바꿉니다.

    gcloud compute instances start VM_NAME
    

REST

  1. instances.stop 메서드를 사용해서 POST 요청을 수행하여 VM을 중지합니다.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop
    

    다음을 바꿉니다.

    • PROJECT_ID: VM이 있는 프로젝트입니다.
    • ZONE: VM이 있는 영역입니다.
    • VM_NAME: 중지할 VM의 이름입니다.
  2. setServiceAccount 메서드에 대해 POST 요청을 수행하여 서비스 계정을 연결합니다.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setServiceAccount
    
    {
      "email": "SERVICE_ACCOUNT_EMAIL",
      "scopes": [
        "SCOPE_URI",
        "SCOPE_URI",
        ...
      ]
    }
    

    다음을 바꿉니다.

    • PROJECT_ID: 이 요청의 프로젝트 ID입니다.
    • ZONE: 이 VM이 속한 영역입니다.
    • VM_NAME: VM의 이름입니다.
    • SERVICE_ACCOUNT_EMAIL: 만든 서비스 계정의 이메일 주소입니다. 예를 들면 my-sa-123@my-project-123.iam.gserviceaccount.com입니다. 이메일 주소를 보려면 서비스 계정 나열을 참조하세요.
    • SCOPE_URI: 필요한 범위 URI입니다.

    예를 들어 다음 요청에서는 서비스 계정 이메일 my-sa-123@my-project-123.iam.gserviceaccount.com을 사용하고 Cloud Storage와 BigQuery 범위를 설정합니다.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setServiceAccount
    
    {
      "email": "my-sa-123@my-project-123.iam.gserviceaccount.com",
      "scopes": [
        "https://www.googleapis.com/auth/bigquery",
        "https://www.googleapis.com/auth/devstorage.read_only"
      ]
    }
    
  3. instances.start 메서드를 사용해서 POST 요청을 구성하여 VM을 시작합니다.

    POST https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/start
    

    다음을 바꿉니다.

    • PROJECT_ID: VM이 있는 프로젝트입니다.
    • ZONE: VM이 있는 영역입니다.
    • VM_NAME: 시작할 VM의 이름입니다.

VM에 사용되는 서비스 계정 보기

프로젝트의 모든 서비스 계정을 보려면 서비스 계정 나열을 참조하세요.

VM에서 사용 중인 서비스 계정을 식별해야 하는 경우 다음 절차 중 하나를 완료합니다.

콘솔

  1. VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. 서비스 계정을 변경할 VM 인스턴스 이름을 클릭합니다.

  3. API 및 ID 관리 섹션으로 이동합니다. 이 섹션에는 VM에 사용되는 서비스 계정과 액세스 범위가 표시됩니다.

gcloud

gcloud compute instances describe 명령어를 실행합니다.

gcloud compute instances describe VM_NAME \
    --format json

출력은 다음과 비슷합니다.

{
  ...
  "serviceAccounts":[
      {
        "email":"123845678986-compute@developer.gserviceaccount.com",
        "scopes":[
            "https://www.googleapis.com/auth/devstorage.full_control"
        ]
      }
  ]
  ...
   }

VM에서 서비스 계정을 사용하지 않으면 serviceAccounts 속성이 없는 응답이 수신됩니다.

메타데이터 서버

VM 자체 내에서 메타데이터 서버를 쿼리합니다. http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/에 요청을 수행합니다.

user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" \
-H "Metadata-Flavor: Google"

인스턴스를 만들 때 서비스 계정을 한 개 이상 사용 설정한 경우 이 curl 명령어를 사용하면 다음과 비슷한 출력이 반환됩니다.

123845678986-compute@developer.gserviceaccount.com/
default/

인스턴스에서 서비스 계정을 사용하지 않으면 빈 응답이 수신됩니다.

권장사항

  • 서비스 계정 권한을 제한하고 서비스 계정 권한을 정기적으로 확인하여 최신 상태인지 확인합니다.
  • 서비스 계정은 신중하게 삭제합니다. 서비스 계정을 삭제하기 전에 중요한 애플리케이션이 해당 계정을 더 이상 사용하지 않는지 확인합니다. 서비스 계정이 사용 중인지 확실하지 않으면 삭제하는 대신 서비스 계정을 사용 중지하는 것이 좋습니다. 사용 중지된 서비스 계정은 필요한 경우 다시 사용할 수 있습니다.
  • 서비스 계정의 보안 위험을 완화합니다. 자세한 내용은 서비스 계정 작업 권장사항을 참조하세요.

다음 단계