0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

gcloudでアカウントを切り替えて使用するためのdockerを使った設定方法

Last updated at Posted at 2021-09-28

概要

dockerにgcloudの設定ファイルを作ることで、複数アカウントを切り替えてGCEインスタンスにsshできるようにする。
この方法でいつもsshしているが構築方法を忘れてしまったため、メモ書きを残す。

背景

日常的に複数のgoogleアカウントを使用しており、GCPのインスタンスにsshするときにアカウントを切り替える必要があるため。
ホストマシンに設定を直置きするのではなく、設定ファイルをdocker volumeに押し込んでしまえば、ホストを汚さずにgcloud CLIを使えるようにできる。

対象者

  • 複数のgoogleアカウントを使用している
  • ホストマシンに設定を直置きしたくない
  • ホストマシンにgcloud CLIをインストールしたくない

一応アカウントを1つしか使用していない場合でも有効な方法ではあります。
設定をdockerに置く必要がない方は、gcloud config setなどで良いと思います。

結論

まずは結論から。
結果的に↓のようなコマンドでgcloudコマンドを実行することになります。

docker volume create gcloud-sshkey-volume-user1
docker run -it -v gcloud-sshkey-volume-user1:/root/.ssh --name gcloud-config-user1 gcr.io/google.com/cloudsdktool/cloud-sdk gcloud auth login
docker run --rm -it --volumes-from gcloud-config-user1 gcr.io/google.com/cloudsdktool/cloud-sdk gcloud compute ssh

日本語にするとこんな感じです。

  1. ssh鍵を格納するためのvolumeを作成
  2. 上記volumeをマウントして認証情報を格納するためのコンテナを作成
  3. 上記コンテナからvolumeをマウントしてgcloudコマンドを実行

過程

まずは何も考えずに実行してみます。

docker run --rm -it gcr.io/google.com/cloudsdktool/cloud-sdk gcloud compute ssh --zone=us-west1-a --project myproject hoge@my-instance
WARNING: Could not open the configuration file: [/root/.config/gcloud/configurations/config_default].
ERROR: (gcloud.compute.ssh) You do not currently have an active account selected.
Please run:

  $ gcloud auth login

to obtain new credentials.

If you have already logged in with a different account:

    $ gcloud config set account ACCOUNT

to select an already authenticated account to use.

設定が見つからないから gcloud auth login を実行しろとのことです。

docker run --rm -it gcr.io/google.com/cloudsdktool/cloud-sdk gcloud auth login
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?response_type=code&..............

Enter verification code: ......................................................

You are now logged in as [username@gmail.com].
Your current project is [None].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID


To take a quick anonymous survey, run:
  $ gcloud survey

言われた通りに実行しました。さあ、改めてcompute ssh

docker run --rm -it gcr.io/google.com/cloudsdktool/cloud-sdk gcloud compute ssh --zone=us-west1-a --project myproject hoge@my-instance
WARNING: Could not open the configuration file: [/root/.config/gcloud/configurations/config_default].
ERROR: (gcloud.compute.ssh) You do not currently have an active account selected.
Please run:(以下省略)

結果は同じ。当たり前ですね、これで生成された設定ファイルはコンテナとともに消え去ってます。
では、どこにできているのかを見てみましょう。

docker run --rm -it gcr.io/google.com/cloudsdktool/cloud-sdk bash
root@08d9d117b493:/# gcloud auth login
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?...................

Enter verification code: ........................................

You are now logged in as [username@gmail.com].
Your current project is [None].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID


To take a quick anonymous survey, run:
  $ gcloud survey

root@08d9d117b493:~# ls -la ~/.config/gcloud
total 56
drwxr-xr-x 5 root root  4096 Sep 28 04:25 .
drwxr-xr-x 3 root root  4096 Sep 28 04:24 ..
-rw-r--r-- 1 root root    36 Sep 28 04:25 .last_survey_prompt.yaml
-rw------- 1 root root 12288 Sep 28 04:25 access_tokens.db
-rw-r--r-- 1 root root     7 Sep 28 04:25 active_config
-rw-r--r-- 1 root root     0 Sep 28 04:25 config_sentinel
drwxr-xr-x 2 root root  4096 Sep 28 04:25 configurations
-rw------- 1 root root 12288 Sep 28 04:25 credentials.db
-rw------- 1 root root     5 Sep 28 04:24 gce
drwxr-xr-x 3 root root  4096 Sep 28 04:25 legacy_credentials
drwxr-xr-x 3 root root  4096 Sep 28 04:24 logs

gcloudの設定は/root/.config/gcloudに保存されています。
なので、設定が消えないように/root/.config/gcloudにvolumeをマウントしましょう。

$ docker volume create gcloud-config-volume-user1
gcloud-config-volume-user1

gcloud-config-volume-user1 というvolumeを作成しました。
これをマウントして再度gcloud auth loginを行います。

% docker run --rm -it -v gcloud-config-volume-user1:/root/.config/gcloud gcr.io/google.com/cloudsdktool/cloud-sdk bash

root@ada340aff4ba:/# ls -la /root/.config/gcloud
total 16
drwxr-xr-x 3 root root 4096 Sep 28 06:42 .
drwxr-xr-x 3 root root 4096 Sep 28 06:42 ..
-rw-r--r-- 1 root root   37 Dec 15  2020 .last_survey_prompt.yaml
drwxr-xr-x 3 root root 4096 Sep 28 06:42 logs

root@ada340aff4ba:/# gcloud auth login
(省略)

root@ada340aff4ba:/# ls -la /root/.config/gcloud
total 56
drwxr-xr-x 5 root root  4096 Sep 28 06:44 .
drwxr-xr-x 3 root root  4096 Sep 28 06:42 ..
-rw-r--r-- 1 root root    37 Sep 28 06:44 .last_survey_prompt.yaml
-rw------- 1 root root 12288 Sep 28 06:44 access_tokens.db
-rw-r--r-- 1 root root     7 Sep 28 06:44 active_config
-rw-r--r-- 1 root root     0 Sep 28 06:44 config_sentinel
drwxr-xr-x 2 root root  4096 Sep 28 06:44 configurations
-rw------- 1 root root 12288 Sep 28 06:44 credentials.db
-rw------- 1 root root     5 Sep 28 06:44 gce
drwxr-xr-x 3 root root  4096 Sep 28 06:44 legacy_credentials
drwxr-xr-x 3 root root  4096 Sep 28 06:44 logs

root@ada340aff4ba:/# exit

設定ファイルを生成したところで、一旦コンテナを作り直してみましょう。

% docker run --rm -it -v gcloud-config-volume-user1:/root/.config/gcloud gcr.io/google.com/cloudsdktool/cloud-sdk bash

root@00ccfd7340e0:/# ls -la /root/.config/gcloud
total 56
drwxr-xr-x 5 root root  4096 Sep 28 06:44 .
drwxr-xr-x 3 root root  4096 Sep 28 06:47 ..
-rw-r--r-- 1 root root    37 Sep 28 06:44 .last_survey_prompt.yaml
-rw------- 1 root root 12288 Sep 28 06:44 access_tokens.db
-rw-r--r-- 1 root root     7 Sep 28 06:44 active_config
-rw-r--r-- 1 root root     0 Sep 28 06:44 config_sentinel
drwxr-xr-x 2 root root  4096 Sep 28 06:44 configurations
-rw------- 1 root root 12288 Sep 28 06:44 credentials.db
-rw------- 1 root root     5 Sep 28 06:44 gce
drwxr-xr-x 3 root root  4096 Sep 28 06:44 legacy_credentials
drwxr-xr-x 3 root root  4096 Sep 28 06:44 logs

作り直しても設定ファイルが消えていないことが分かります。
それでは、最初のgcloud compute sshにvolumeを追加してやり直してみましょう。

% docker run --rm -it -v gcloud-config-volume-user1:/root/.config/gcloud gcr.io/google.com/cloudsdktool/cloud-sdk gcloud compute ssh --zone=us-west1-a --project myproject hoge@my-instance
WARNING: The private SSH key file for gcloud does not exist.
WARNING: The public SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
This tool needs to create the directory [/root/.ssh] before being able
 to generate SSH keys.

Do you want to continue (Y/n)?  Y

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/google_compute_engine.
Your public key has been saved in /root/.ssh/google_compute_engine.pub.

(略)
hoge@my-instance ~ $

無事にログインできました!🎉
しかし、これではsshするたびに鍵を生成することになってしまいます。
そこで、/root/.sshもvolumeにしていきましょう。

% docker volume create gcloud-sshkey-volume-user1
gcloud-sshkey-volume-user1

% docker run --rm -it -v gcloud-config-volume-user1:/root/.config/gcloud -v gcloud-sshkey-volume-user1:/root/.ssh gcr.io/google.com/cloudsdktool/cloud-sdk gcloud compute ssh --zone=us-west1-a --project myproject hoge@my-instance

これでssh鍵を一度生成すれば、その後はすぐに接続できるようになりました。
ただ、これでは長すぎて手打ちするのはしんどいですね。
そこで、volume containerと呼ばれるものを使用して、少し簡潔にかけるようにしましょう。

  1. さきほど作成したssh鍵を持つvolumeをマウントしたコンテナでauth loginを行い、コンテナを削除しないで置いておく
  2. 上記のコンテナからvolumeをマウントして、gcloud CLIを使用する

という流れでやっていきます。

% docker run -it -v gcloud-sshkey-volume-user1:/root/.ssh --name gcloud-config-user1 gcr.io/google.com/cloudsdktool/cloud-sdk gcloud auth login

% docker run --rm -it --volumes-from gcloud-config-user1 gcr.io/google.com/cloudsdktool/cloud-sdk gcloud compute ssh

なぜこれでssh鍵の生成も要らず、auth loginも必要ないのかはdocker inspectでMountを確認してみると分かります。

まずは--rmオプションを削除してコンテナが破棄されないようにして、適当にgcloud-sdkという名前を付けて起動してみます。
その後、docker inspectでMountを確認しましょう。

% docker run --name gcloud-sdk --volumes-from gcloud-config-user1 gcr.io/google.com/cloudsdktool/cloud-sdk id

% docker inspect -f '{{json .Mounts}}' gcloud-sdk | jq
[
  {
    "Type": "volume",
    "Name": "xxxxxxxxxxxxxxxxx",
    "Source": "/var/lib/docker/volumes/xxxxxxxxxxxxxxxxx/_data",
    "Destination": "/root/.config",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  },
  {
    "Type": "volume",
    "Name": "gcloud-sshkey-volume-user1",
    "Source": "/var/lib/docker/volumes/gcloud-sshkey-volume-user1/_data",
    "Destination": "/root/.ssh",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  },
  {
    "Type": "volume",
    "Name": "zzzzzzzzzzzzzz",
    "Source": "/var/lib/docker/volumes/zzzzzzzzzzzzzz/_data",
    "Destination": "/root/.kube",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  }
]

実行中のコンテナでは3つのvolumeがマウントされていることが分かります。
まず、ssh鍵の生成が要らない件についてはgcloud-sshkey-volume-user1がマウントされているからですね。
そして、auth loginが要らない件は/root/.configがマウントされているからです。
これはどこから来ているかというと、gcloud-config-user1の volume container を作成したときに指定しているイメージのcloud-sdkVOLUME命令が指定されているからです。ソース

ということで、手打ちが現実的なレベルまで簡素化しつつdockerで完結できました。🚀

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?