Google Cloudを使う開発に付きものの「認証情報」をどう扱うか
クラウドインフラで避けて通れない「認証」
Google Cloudに限った話ではないですが、クラウド上のリソースを操作する際にはなにがしかの認証情報が必要になります。
AWSなら最近はロールベースでの認証の方が主流かもですが、アクセスキーとシークレットアクセスキーで対応したりとか…そうなってくると管理が大変だったりもしますよね。
Google Cloudでも、例えば google-cloud-storage
や google-cloud-bigquery
といったライブラリを用いての開発を行う際に、ローカルで実行しようと思うと認証情報を用意しておく必要があります。
今回はその方法についてまとめます。
Google Cloudの認証情報の優先順位
Google Cloudでの認証情報の優先順位については公式ドキュメント「アプリケーションのデフォルト認証情報の仕組み」のページに記述があります。(Application Default Credentialsということで、ADCと略されています。)
順に見ていきます。
GOOGLE_APPLICATION_CREDENTIALS 環境変数
export GOOGLE_APPLICATION_CREDENTIALS=[認証情報ファイルのPath]
など走らせて、環境変数を設定するパターンです。
Workforce Identity / Workload Identity 連係情報構成ファイルを指定することもありますが、基本的には、「サービスアカウントを作って、キーをダウンロードしてここにパスを指定して…」みたいなことが多いと思います。
正直、私も昔はローカル開発時にはよくこれを使っていましたが、先ほどのドキュメントに
サービス アカウント キーはセキュリティ上のリスクをもたらすため、推奨されません。他の認証情報ファイル形式とは異なり、不正使用されたサービス アカウント キーは不正な行為者によって追加情報なしに使用される可能性があります。詳細については、サービス アカウント キーの使用と管理のベスト プラクティスをご覧ください。
と、コメントがあります。
端的に言うと、鍵のJSONファイル等が漏れたら追加のログイン検証(2FA等)が走るわけではないので漏洩リスクが高いのでオススメしませんということです。
となると、やはり使用は避けていきたいものですね。
gloud CLIで提供されるユーザー認証情報
今回紹介したかったのはこれです。
gcloud auth application-default login
というコマンドを実行してちゃんとログインできれば、認証情報が各OSの特定の場所(macOSなら $HOME/.config/gcloud/application_default_credentials.json
)に保存され、コードが走るようになる、ということです。
ちなみに、このコマンドで得られる認証情報はgcloudのCLIを使う上で欠かせないコマンドであろう gcloud auth login
によるgcloud CLI自体の認証情報とは異なるとのことです。 (gcloud CLI 認証情報 と ADC 認証情報のページより)
接続済みのサービスアカウント
これは主にCloud FunctionsやCloud Run等の環境で紐付いているサービスアカウントの権限を認証に利用する、ということになります。
本番へのデプロイ時は基本的にこの接続されているサービスアカウントの認証情報を利用することになると思います。
認証情報をCloud FunctionsやCloud Runのソース自体にファイルとして置くような形にしてしまっているコードなどは、先ほど述べたように非推奨な方法になっているので、どうしてもそうしなくてはいけないというシチュエーションを除いては避けておきたいところですね。
gcloud authコマンドのユースケース
このコマンドはGoogle Cloud環境に対してちょっとしたスクリプトとかを走らせるときに便利に使えます。
たとえば、特定のprefixに対応するGCSのデータを引っ張ってくるコードは下記のように書けると思いますが
from google.cloud import storage bucket_name = 'dummy-bucket' # GCS のバケット名 prefix = 'data/' # プレフィクス # GCS クライアントの初期化 storage_client = storage.Client(project=project_id) # GCS バケット内のファイルをリストアップ bucket = storage_client.bucket(bucket_name) blobs = storage_client.list_blobs(bucket_name, prefix=prefix) print([blob.name for blob in blobs])
このままだと認証情報が必要になるよね、というときに、先に
gcloud auth application-default login
を実行しておけば良い、というわけです。
まとめ
今回はTipsとして、ローカル環境でGoogle Cloudのリソースを操作する必要があるときに使える認証情報の格納コマンド gcloud auth application-default login
について紹介しました。
gcloud auth login
のほうは多くの人が使ったことがあると思いますが、 application-default
と間に入れておけば、開発時に便利に使えるコマンドに早変わりします。
この方法を知らないと、わざわざ毎回漏洩リスクを抱えつつサービスアカウントを作って鍵を作成して…みたいなことになりかねないので、ぜひ覚えておきたいコマンドですね。