LoginSignup
7
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-20

概要

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

まとめ

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

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2