Help us understand the problem. What is going on with this article?

GKEで起動したコンテナ内からgsutilを使用してGCS(Google Cloud Storage)にアクセスする方法

概要

GKE Cluster内のコンテナからGCSのBucket上にあるデータをダウンロードする仕組みが必要だったので、その時に行った設定を残します。

事前準備

以下の項目については、本題とは少しそれるため事前準備として記載します。

  • GCPアカウントのセットアップ(プロジェクトの作成)
  • gcloudのインストール、セットアップ
  • GKEクラスターの作成

  • IAM(以下の権限を付与)

    • Kuvernetes Enginne 管理者

セットアップ

サービスアカウントの作成

GCSにアクセス可能なサービスアカウントを作成し、ダウンロードします。
今回は雑に ストレージ管理者 権限をサービスアカウントに付与しました。

secretsの作成

ダウンロードしたサービスアカウントファイル(json)をkubernetesのsecretsに保管します。
secretsを作成することで、実際にはKubernetes Master内でリソースの永続化に使われる高信頼分散KVS(etcd)内に保管され、
GKE Cluster内のpodからリクエストがあれば参照できるようになっているようです。
secretsについては、こちらの解説が理解しやすかったです。

# 書式
$ kubectl create secret generic <secret名> --from-file=<etcd内に保存されるファイル名>=./<サービスアカウントのファイル名>

# 例)
$ kubectl create secret generic gcs-access-key --from-file=gcs-access.key=./hogehoge.json

# 確認
$ kubectl get secrets

# 詳細確認
$ kubectl decribe secrets <secret名>

認証処理

これで準備は整いました。
あとはsecretsに格納したetcdをmountして、gcloud authで認証すればGCSにアクセス可能です。
以下の例では、マニュフェストファイル内で先ほど作成したsecretsをmountさせます。
実際には平文で保存されているためか、復号化等の処理は不要なようです。

マニュフェストの準備

apiVersion: batch/v1
kind: Job
metadata:
  name: test
spec:
  template:
    metadata:
      name: test
    spec:
      volumes:
    # ボリュームにsecretsを指定
      - name: google-cloud-key
        secret:
          secretName: gcs-access-key
      containers:
      - name: test
        image: <イメージ名>
        args: ["echo", "ok"]
     # ボリュームにsecretsを指定
        volumeMounts:
        - name: google-cloud-key
          mountPath: /var/secrets/google
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/secrets/google/gcs-access.key
      restartPolicy: Never

補足

gsutilを使用するには、gcloud authで認証すれば大丈夫なんですが、
例えば、コンテナからgoogle-api-python-clientライブラリ等を使用して、
GCSにアクセスするにはGOOGLE_APPLICATION_CREDENTIALSを設定する必要があるようです。

実行スクリプトの準備

あとはコンテナ起動時に実行するスクリプトに以下のような処理を追加し、呼び出せば認証させることができます。
今回はDockerfileのENTORYPOINTを使用して以下のようなスクリプトを実行させました。
作りは

#!/bin/bash

auth_gcp () {
  gcloud auth activate-service-account --key-file=/var/secrets/google/gcs-access.key
}

fetch_data () {
  gsutil cp -r "${GCS_INPUT_DATA}" .
}

auth_gcp
fetch_data

まとめ

我流で実装してみましたが、他にいい方法があれば教えてください。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away