前回も触れましたが表題のSSH接続についてもうちょっと深く掘ってみました。
基本形(gcloudコマンドによるssh)
まずは gcloud auth login
まずは gcloud auth login
でログインしましょう。ブラウザで認証するアレですね。
これによってgcloudコマンドがgoogleアカウントに紐付けられます。
auth loginはしょっちゅうする必要は無くて、作業端末を再起動しても情報は残るようです。多分どこかのファイルに書かれるんでしょうね。
もうログイン済んでるはずって人は次のコマンドを試してみましょう。どんな状態になっているかを確認することができます。
$ gcloud config list
[core]
account = newgyu
disable_usage_reporting = False
project = upheld-caldron-XXX
user_output_enabled = True
gcloudコマンドでssh
$ gcloud compute ssh <インスタンス名> --zone <ゾーン名>
ipとかわからなくても自分のつけたインスタンス名でログインできるのが便利ですね。エフェメラルIPだと再起動するたびにIPが変わってしまうので地味に便利です。
--zoneは省略してもいいのですが、どうせ実行時に選択させられるのでコマンドで指定したほうがいいでしょう。
これで先ほどのauth loginしたユーザー(上記例だとnewgyu)でインスタンスにログインできます。このユーザーはsudo可能に設定されています。(AWSのec2-user相当ですね)
ssh鍵はgcloudコマンドによって~/.ssh/google_compute_engine
というファイル名で自動生成されます。
以上です。
事前にssh-keygenコマンドで鍵生成してアップロードとか必要ないのでちょっとした利用の時は至って簡単です。
自分で作った鍵を配置する
ちょっとした使用であればgcloudコマンドで便利に使えるのですが、本格的に使おうと思うと既存のssh鍵を使いたいということもありますよね。
また、gcloudコマンドは便利だけど普通にssh接続できないとAnsibleやcapistranoを使うときに困ってしまいますよね。
そんな時にはインスタンス生成時またはインスタンスの詳細画面で登録することができます。
この部分に、プロトコル 公開鍵 ユーザー名
という形式の文字列を貼ります。
ローカルマシンで、ssh-keygen -t rsa -C "ユーザー名"
で生成したコメント付きの公開鍵をペタッと貼ればOKです。
特筆すべきはユーザー名の部分に指定したユーザーをインスタンス内にuseraddしてくれます。
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyGROMaW4hatAblZpz4sC0VWKCg3rNFNz8B3ZTPqPpxZsZgzSdscIFnlPqSqspAacSOpLgeqMtM80yYB6unlSk9XAsa6woR4kQyIYB765ISo4nhJmfMYrYl3VJ0/HxlkbUez2WQnE6UJ1i4N6Er8wObvgUI0exaH+t+58B4eyrpOToYz7fd4ZqM3TLFpPKYAFyB8mLl1sPKkM1gijbRkiYx06h1tJRqPr5qEVV6BWYg37VLiU8HN7png50E+nB1D+T839h8dkVR6gEaw2UIT8GjWqebIDHFSov/ZtoxbH1pOIsPUm4/V8/uUVEiKmUlKv3M0zvZ+uClQS797Qjdt1V someuser@domain
として登録すればssh someuser@<インスタンスのIP>
でログインできます。
AWSだと一旦ec2-userでログインして、sudo useradd someuser
して、ssh-keygenして、sudoers登録して…というのが一発で出来てしまいます。
少々注意が必要なのはこの方法で作ったユーザーはsudo可能なので管理ユーザー的な位置づけで捉えておいたほうがいいでしょう。権限を絞ったユーザー作成は普通通り管理権のあるユーザーでuseraddして作りましょう。
ということでsshの鍵管理はかなり楽なGCEでした。