서비스 계정으로 Cloud Platform 인증

이 가이드에서는 Google Cloud 서비스 계정을 만들고 Cloud Platform 서비스 인증을 위한 역할을 할당하고, GKE에서 실행되는 애플리케이션에서 서비스 계정 사용자 인증 정보를 사용하는 방법을 설명합니다.

이 예에서는 Cloud Pub/Sub가 사용되지만, 모든 Cloud Platform 서비스에 적용할 수 있습니다. 이 가이드의 애플리케이션 예는 서비스 계정을 사용하여 Cloud Pub/Sub에 인증하고 Python 기반 애플리케이션에서 Pub/Sub 항목에 게시된 메시지를 구독합니다.

목표

이 가이드에는 다음 단계가 포함됩니다.

  • 서비스 계정 생성 방법
  • 서비스 계정을 Cloud Pub/Sub에서 사용하기 위해 필요한 역할 할당 방법
  • 계정 키를 Kubernetes 보안 비밀로 저장하는 방법
  • 서비스 계정을 사용하여 애플리케이션을 구성 및 배포하는 방법

이 가이드에 사용된 샘플 애플리케이션은 Pub/Sub 항목을 구독하고 게시된 메시지를 표준 출력으로 인쇄합니다. 올바른 권한으로 애플리케이션을 구성하고, gcloud를 사용하여 메시지를 게시하고, 컨테이너의 출력 스트림을 조사하여 메시지가 올바르게 수신되었는지 확인해야 합니다.

서비스 계정을 사용하는 이유

컨테이너 클러스터의 각 노드는 Compute Engine 인스턴스입니다. 따라서 컨테이너 클러스터에서 실행되는 애플리케이션은 기본적으로 배포된 Compute Engine 인스턴스의 범위를 상속합니다.

Google Cloud Platform은 이름이 'Compute Engine 기본 서비스 계정'인 서비스 계정을 자동으로 만들고 GKE는 이를 생성되는 노드와 연결합니다. 프로젝트 구성 방법에 따라 기본 서비스 계정에 다른 Cloud Platform API를 사용할 수 있는 권한이 포함되거나 포함되지 않을 수 있습니다. GKE는 또한 일부 제한된 액세스 범위를 컴퓨팅 인스턴스에 할당합니다. 기본 서비스 계정의 권한을 업데이트하거나 컴퓨팅 인스턴스에 추가 액세스 범위를 할당하는 방식은 GKE에서 실행되는 포드에서 다른 Cloud Platform 서비스에 인증하는 방법으로 권장되지 않습니다.

GKE에서 실행되는 애플리케이션에서 Google Cloud Platform 서비스에 인증하기 위한 권장 방식은 고유한 서비스 계정을 만드는 것입니다. 이상적으로는 Cloud Platform API를 요청하는 각 애플리케이션에 대해 새로운 서비스 계정을 만들어야 합니다.

여러 애플리케이션에 서비스 계정을 개별적으로 사용할 때의 이점은 다음과 같습니다.

  • 애플리케이션이 수행하는 API 요청을 더 효과적으로 식별하고 감사할 수 있습니다.

  • 서비스 계정을 공유하고 모든 애플리케이션의 API 액세스를 한 번에 취소할 필요 없이 특정 애플리케이션의 키를 취소할 수 있습니다.

  • 서비스 계정의 사용자 인증 정보가 손상되는 보안 이슈가 발생할 경우 노출 범위를 줄일 수 있습니다.

시작하기 전에

다음 단계에 따라 Kubernetes Engine API를 사용 설정합니다.
  1. Google Cloud Platform 콘솔에서 Kubernetes Engine 페이지로 이동합니다.
  2. 프로젝트를 만들거나 선택합니다.
  3. API 및 관련 서비스가 사용 설정될 때까지 기다립니다. 몇 분 정도 걸릴 수 있습니다.
  4. 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

이 가이드에 사용된 다음 명령줄 도구를 설치합니다.

  • gcloud는 Kubernetes Engine 클러스터를 만들고 삭제하는 데 사용됩니다. gcloudGoogle Cloud SDK에 포함되어 있습니다.
  • kubectl은 Kubernetes Engine에서 사용되는 클러스터 조정 시스템인 Kubernetes를 관리하기 위해 사용됩니다. gcloud를 사용하여 kubectl을 설치할 수 있습니다.
    gcloud components install kubectl

gcloud 명령줄 도구의 기본값 설정

gcloud 명령줄 도구에서 프로젝트 IDCompute Engine 영역 옵션을 입력하는 시간을 절약하기 위해 기본값을 설정할 수 있습니다.
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

Pub/Sub API 사용

이 가이드에서는 샘플 애플리케이션이 Pub/Sub 항목의 메시지를 수신하기 위해 Pub/Sub API를 사용하므로, 프로젝트에서 Cloud Pub/Sub API를 사용 설정해야 합니다.

API 사용 설정

컨테이너 클러스터 만들기

이름이 pubsub-test인 컨테이너 클러스터를 만들어서 Pub/Sub 구독자 애플리케이션을 배포합니다.

gcloud container clusters create pubsub-test

1단계: Pub/Sub 항목 만들기

개발자가 배포하는 Pub/Sub 구독자 애플리케이션은 echo라는 Pub/Sub 항목에서 이름이 echo-read인 구독을 사용합니다. 애플리케이션을 배포하기 전에 이러한 리소스를 만듭니다.

gcloud pubsub topics create echo
gcloud pubsub subscriptions create echo-read --topic=echo

2단계: Pub/Sub 구독자 애플리케이션 배포

다음 단계에서는 Pub/Sub 항목에 게시된 메시지를 검색하기 위해 애플리케이션 컨테이너를 배포합니다. 이 애플리케이션은 Google Cloud Pub/Sub 클라이언트 라이브러리를 사용하여 Python으로 작성되었으며, GitHub에서 소스 코드를 찾을 수 있습니다.

다음 매니페스트 파일은 이 애플리케이션의 Docker 이미지의 단일 인스턴스를 실행하는 배포를 설명합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      containers:
      - name: subscriber
        image: gcr.io/google-samples/pubsub-sample:v1

이 매니페스트를 배포하려면 해당 머신에 pubsub.yaml로 다운로드하고, 다음을 실행합니다.

kubectl apply -f pubsub.yaml

애플리케이션이 배포되었으면 다음을 실행하여 포드를 쿼리합니다.

kubectl get pods -l app=pubsub
출력:
NAME                      READY     STATUS             RESTARTS   AGE
pubsub-2009462906-1l6bh   0/1       CrashLoopBackOff   1          30s

컨테이너가 시작되지 않고 CrashLoopBackOff 상태로 전환된 것을 볼 수 있습니다. 다음을 실행하여 포드에서 로그를 조사합니다.

kubectl logs -l app=pubsub
출력:
...
google.gax.errors.RetryError: GaxError(Exception occurred in retry method
that was not classified as transient, caused by <_Rendezvous of RPC that
terminated with (StatusCode.PERMISSION_DENIED, Request had insufficient
authentication scopes.) l10n-attrs-original-order="of,RPC,that,terminated,with,Request,had,insufficient,authentication">)

스택 추적 및 오류 메시지에는 애플리케이션에 Cloud Pub/Sub 서비스 쿼리 권한이 없는 것으로 표시됩니다.

3단계: 서비스 계정 사용자 인증 정보 만들기

GKE에서 실행되는 애플리케이션에 Google Cloud Platform 서비스에 대한 액세스 권한을 부여하려면 서비스 계정을 사용해야 합니다.

서비스 계정을 만들려면 GCP 콘솔에서 서비스 계정으로 이동하고 서비스 계정 만들기를 클릭합니다.

  1. 서비스 계정 이름을 지정합니다(예: pubsub-app).
  2. 역할 드롭다운에서 'Pub/Sub → 구독자'를 선택합니다.
  3. 키 만들기를 클릭하고 키 유형을 JSON으로 선택합니다.
  4. 만들기를 클릭합니다.

서비스 계정이 생성되었으면 서비스 계정의 사용자 인증 정보가 포함된 JSON 키 파일이 컴퓨터에 다운로드됩니다. 이 키 파일은 Cloud Pub/Sub API에 인증하도록 애플리케이션을 구성하기 위해 사용됩니다.

4단계: 사용자 인증 정보를 보안 비밀로 가져오기

Kubernetes는 컨테이너 클러스터 내에 사용자 인증 정보를 저장하고 이를 GKE에 직접 배포된 애플리케이션에서 사용할 수 있도록 보안 비밀 리소스 유형을 제공합니다.

JSON 키 파일을 이름이 pubsub-key인 보안 비밀로 저장하려면 다운로드된 서비스 계정 사용자 인증 정보 파일 경로를 사용해서 다음 명령어를 실행합니다.

kubectl create secret generic pubsub-key --from-file=key.json=PATH-TO-KEY-FILE.json

이 명령어는 GCP 콘솔에서 다운로드한 비공개 키 내용이 포함된 key.json 파일이 있는 pubsub-key라는 보안 비밀을 만듭니다. 보안 비밀을 만든 후에는 컴퓨터에서 키 파일을 삭제해야 합니다.

5단계: 보안 비밀로 애플리케이션 구성

애플리케이션에서 pubsub-key 보안 비밀을 사용하려면 배포 사양을 다음과 같이 수정해야 합니다.

  1. 보안 비밀을 사용하여 볼륨을 정의합니다.
  2. 애플리케이션 컨테이너에 보안 비밀 볼륨을 마운트합니다.
  3. 보안 비밀 볼륨 마운트에 있는 키 파일을 가리키도록 GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정합니다.

업데이트된 매니페스트 파일은 다음과 같습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      volumes:
      - name: google-cloud-key
        secret:
          secretName: pubsub-key
      containers:
      - name: subscriber
        image: gcr.io/google-samples/pubsub-sample:v1
        volumeMounts:
        - name: google-cloud-key
          mountPath: /var/secrets/google
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/secrets/google/key.json

이 매니페스트 파일은 애플리케이션에 사용자 인증 정보를 제공하기 위해 다음을 정의합니다.

  • pubsub-key라는 보안 비밀을 사용하는 google-cloud-key라는 볼륨

  • 컨테이너 내부의 /var/secrets/google 디렉토리에서 google-cloud-key를 사용할 수 있게 해 주는 볼륨 마운트

  • 보안 비밀이 컨테이너에 볼륨으로 마운트될 때 사용자 인증 정보를 포함하게 될 /var/secrets/google/key.json으로 설정된 GOOGLE_APPLICATION_CREDENTIALS 환경 변수

GOOGLE_APPLICATION_CREDENTIALS 환경 변수는 Google Cloud 클라이언트 라이브러리(이 경우에는 Python용 Cloud Pub/Sub 클라이언트)에서 자동으로 인식됩니다.

이 매니페스트를 배포하려면 해당 머신에 pubsub-with-secret.yaml로 다운로드하고, 다음을 실행합니다.

kubectl apply -f pubsub-with-secret.yaml

올바르게 배포되었으면 포드 상태가 Running으로 나열됩니다.

kubectl get pods -l app=pubsub
출력:
NAME                     READY     STATUS    RESTARTS   AGE
pubsub-652482369-2d6h2   1/1       Running   0          29m

6단계: Pub/Sub 메시지 수신 테스트

이제 애플리케이션이 구성되었으므로, echo라는 Pub/Sub 항목에 메시지를 게시합니다.

gcloud pubsub topics publish echo --message="Hello, world!"

몇 초 후 애플리케이션에서 메시지가 선택되고 출력 스트림으로 출력됩니다. 배포된 포드의 로그를 조사하려면 다음을 실행합니다.

kubectl logs -l app=pubsub
출력:
Pulling messages from Pub/Sub subscription...
[2017-06-19 12:31:42.501123] ID=130941112144812 Data=Hello, world!

서비스 계정 사용자 인증 정보를 사용하여 Pub/Sub API에 인증을 수행하도록 GKE에서 애플리케이션을 성공적으로 구성했습니다.

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

  1. Pub/Sub 구독 및 항목을 삭제합니다.

    gcloud pubsub subscriptions delete echo-read
    gcloud pubsub topics delete echo
  2. 컨테이너 클러스터를 삭제합니다.

    gcloud container clusters delete pubsub-test

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine 가이드