サービス アカウントを使用した 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 default service account」という名前のサービス アカウントが自動的に作成されます。GKE では、作成したノードにこのアカウントが関連付けられます。デフォルトのサービス アカウントに他の Cloud Platform API を使用する権限があるかどうかは、プロジェクトの構成方法によって異なります。また、GKE は、コンピューティング インスタンスにいくつかの限定的なアクセス スコープを割り当てます。GKE 上で実行されるポッドから他の Cloud Platform サービスに対して認証する方法として、デフォルト サービス アカウントの権限を更新することや、Compute インスタンスにアクセス スコープをさらに割り当てることはおすすめできません。

GKE で実行するアプリケーションから Google Cloud Platform サービスへの認証を行う方法として、独自のサービス アカウントを作成することをおすすめします。理想的には、Cloud Platform API へのリクエストを行うアプリケーションごとに新しいサービス アカウントを作成する必要があります。

異なるアプリケーションに対してサービス アカウントをそれぞれ別にする利点は次のとおりです。

  • 特定のアプリケーションが発行した API リクエストを識別しやすくなり、API リクエストの監査が容易になります。

  • 特定のアプリケーションのキーを取り消すことができます。1 つのサービス アカウントを共有していると、すべてのアプリケーションの API アクセスを一度に取り消さなければなりません。

  • セキュリティ インシデントが発生してサービス アカウントの認証情報が危険にさらされた場合に情報漏えいの範囲を小さくすることができます。

始める前に

次の手順で Kubernetes Engine API を有効にします。
  1. Google Cloud Platform Console で [Kubernetes Engine] ページにアクセスします。
  2. プロジェクトを作成または選択します。
  3. API と関連サービスが有効になるのを待ちます。これには数分かかることがあります。
  4. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

このチュートリアルで使用されている以下のコマンドライン ツールをインストールします。

  • Kubernetes Engine クラスタを作成および削除するには、gcloud を使用します。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 API を使用して Pub/Sub トピックからメッセージを受け取るため、プロジェクトで Cloud Pub/Sub API を有効にする必要があります。

APIを有効にする

コンテナ クラスタの作成

Pub/Sub サブスクライバー アプリケーションをデプロイするクラスタとして、pubsub-test という名前のコンテナ クラスタを作成します。

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 トピックにパブリッシュされたメッセージを受け取るアプリケーション コンテナをデプロイします。このアプリケーションは Python で Google Cloud Pub/Sub クライアント ライブラリを使用して記述されており、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 Console で [サービス アカウント] に移動し、[サービス アカウントを作成] をクリックします。

  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 Console からダウンロードした秘密鍵の内容が格納された 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 のチュートリアル