読者です 読者をやめる 読者になる 読者になる

uzullaがブログ

uzullaがブログです。

Google Compute Engine が便利で良かった件

gcp vps

先日のISUCONでは、Google Cloud Platform(以後GCP)のGoogle Compute Engine(以後GCE)が使われたわけですが、これが本当に便利だなーとおもったわけです。

cloud.google.com

初期登録のクレジットもあまっていますし*1、しばらくこれを仕事でも使うかな〜〜って思って使っていたら、これは大層便利だとおもったのでそのまとめです。私に対するカンペでもある。

しかし、GCPとかGCEとか全然名前がおぼえられない。Google…Compute…Cloud…、ちがう、それだとGCCだ…。

Google Compute Engine(GCE) はいわゆるEC2

GCEはいわゆるAWSのEC2です、EC2がわからない人は多分ここに来ないだろうから省略。違いは沢山ありますが、今回はgcloudコマンドの存在について書きたい。*2

AWS同様に、GCE以外にもGCPにはObject Storageなど色々あったりなかったりするんですが、省略。

gcloudがどう便利なのか

私は普段、100台サーバーを立てたりする事はほぼ無く、「あ〜っ、今すぐすごい早いLinuxインスタンスがほしい!」「三日間くらい、デモのために雑なウェブサーバーが必要だ!」そのような用途でクラウドをよく使います。

いままではVultrというVPSをつかっています。VultrはVultrですごい便利なので皆さん是非どうぞ、CLIが嫌いな人にはVultrのほうが簡単なWeb管理画面*3で済むので最高だと思います…まあ、最終的にはsshするんだが。

話がずれました。gcloudコマンドをつかうと、以下のような操作が簡単に可能です。

「こんなの別にコマンドでできなくてもいいじゃん、ウェブ管理画面でいいじゃん」って思うでしょう、私もそう思っていた。

初期設定、GCPのアカウントを作って、gcloudコマンドの用意

  • GCPにアカウントをつくって
  • gcloudコマンドをいれて
  • 管理画面をひらいて
  • プロジェクトを一個つくる

ここら辺はネットにいくらでもあるのでググろう。最近のやってみた系記事はQiitaで検索すると早いんじゃなかろうか。

gcloudに、ゾーンとプロジェクトを保存しておく

ゾーンはEC2のAZである(説明略)。プロジェクトは…プロジェクトである。AWSにはストレートに繋がる概念は無い気がする。AMIはアクセス範囲の制限だが、AWSで同様な形が必要なら、アカウントをもういっこ作ると思う(あるのかな?)。

案件毎でアカウントがとっちらかって行方不明になるAWSと違い、案件終了時にプロジェクトをドーンとけせば、内包されるインスタンスもディスクもスナップショットもEIPも全部まるっと消えてくれるので、AWSでよくあるインスタンス落とし忘れで破産だ!!!…とかなさそうなのは良い気がする。*4

# 一回だけやっておく
$ gcloud config set compute/zone asia-east1-c
$ gcloud config set project-A-1

インスタンスをつくる

私はインスタンス作成時にgcloudコマンド使わない。ウェブ画面(Google Developers Console https://console.developers.google.com/ )でポチポチしたほうが楽だから。

ただ、そんなヌルい私も、10個位サーバーをつくる必要にせまられる事もある。*5 そんな時、GCEでは「ポチポチめんどい…APIを…」とか考える必要がないのだ。

管理画面をポチポチした後、最後にCreateボタンをおさずに、その下の「同等のRESTまたはコマンドライン」のコマンドラインのリンクをクリックすれば、なんか以下みたいなのが出るではないか。これをコピペして実行すれば、ポチポチと同じ事ができる!

gcloud compute --project "project-A-1" instances create "work" --zone " asia-east1-c" --machine-type "n1-standard-1" --network "default" --maintenance-policy "MIGRATE" --scopes "https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write" --image "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/backports-debian-7-wheezy-v20150915" --boot-disk-size "10" --boot-disk-type "pd-standard" --boot-disk-device-name "work"

別にGoogleが開祖ではなかろうが、このスタイルは是非全世界が真似て欲しい。

これをエディタでホスト名とかだけ修正してベベベっと実行すれば、インスタンス名が違う10個のサーバーを用意することなど朝飯前だ。 自動化?そんなものは俺は知らん。*6

ここで一つポイントを挙げると「必要がないなら」サーバーインスタンスの名前をカッコヨクながったらしくつけない方が良い。タイプしやすさが重要だ。 test-web-server-001ではない。testで十分である、後で身に染みて解る。自分はworkとか、お客さんの名前とかつけている。っていうか1文字でもいいじゃないか。

一覧を見る

インスタンスを作ればもうブラウザを閉じてかまわない、あとはgcloudコマンドの方が早いからだ。

インスタンス一覧を見るのは簡単だ gcloud compute instances list というコマンドである。

$ gcloud compute instances list 
NAME ZONE         MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP     STATUS
work asia-east1-c n1-standard-1 true        10.240.0.2  104.***.***.*** RUNNING
test asia-east1-c n1-standard-1 true        10.240.0.3                  TERMINATED

たとえばこういう出力が出る。 すごい、必要な情報しかない。とにかく私たちがしりたいのはブラウザで開くための外部IPとSTATUSだろう。私にかぎればバカでかいJSONではない。ポチポチしなくてもここからコピペできるのだ、すごい。

しかし、皆さん簡単だというわりにはコマンドが長いと思っただろう。gcloudまでうてば、あとはtabで補完が効くのだが、aliasしよう。

alias glist="gcloud compute instances list"

$ glist
NAME ZONE         MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP     STATUS
work asia-east1-c n1-standard-1 true        10.240.0.2  104.***.***.*** RUNNING

ただ、私の知っている「スーパーGoogle Cloud Platformつかいこなしマン」であるところのlestrrat-sanは、操作をみているかぎり、まったくaliasしていなくて「マジか」ってなった。 私は凡人なので、aliasをそっと.bashrcなどに入れた。

sshする

gcloud compute ssh workと叩く。これもgshとかにaliasすれば、gsh workだけでよいだろう。

$ gcloud compute ssh work
Warning: Permanently added 'xxx.xxx.xxx.xxx' (RSA) to the list of known hosts.
Linux (none) 3.16.0-0.bpo.4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u3~bpo70+1 (2015-08-08) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Sep 30 06:47:05 2015 from xx.xx.xx.xx
uzulla@work:~$

これでいきなり自分のユーザー名でログインできたわけだ。

…多分説明しないと伝わらないが、ここはスゴくてキモい。「最初にこのコマンドを叩いた時、はじめてサーバーにuzullaという自分のアカウントが作られる」のである。

なんと、gcloudコマンドは、勝手にアカウントを追加して、ssh鍵を生成して、勝手にサーバーに公開鍵を登録して、あまつさえsudoerに追加するのだ、どうだまいったか。俺はまいった。

ちゃんと隅々まで見る人は、インスタンス作成時にssh鍵は登録できる事に気付くだろう*7、しかしあんなものはつかわなくてよいのだ。

どうだ、激烈に!キモチワルイ!!だろう!!! root?前述の通りsudoerに登録済みなのでsudo su すればよい!! サーバーに、事前に自分が登録されているか?なんてしったこっちゃないのである!

正直にいって、人によっては生理的に受け付けない設計だと思う。私も最初はうけつけなかった。しかしこれに慣れてしまうと…ああ…もう…。

もう一つのポイントとして、同一プロジェクトに登録されているユーザーにもこの権利がある*8。 つまり、自分が参加しているプロジェクトのGCEのサーバーなら、シュッとアカウントができるのだ!もう「貴方の公開鍵登録しておいたから」とかいわなくていい!!便利!!!最高!!!!やっぱキモい!!!!

このモードをオフにすることもできるのかもしれないが、郷には入れば郷に従えだ。 もはや「UID:500がwebで…」みたいなおじさんはダメなのだ、時代は変わっていくからしかたないのだ(言うほどか?)

色々作業する

気が済むまでインスタンスを使おう、省略する。

終了する

作業がおわればインスタンスを止める事になる。EC2同様に停止と削除があり、命令的にはstopとdeleteだ。 ただ、AWSと違いGCEではTERMINATEというステータスはSTOPという意味らしい。 どちらが英語的なニュアンスとしてただしいのかは私にはわからないが、TERMINATEされたものがstartできる事に違和感はある。

# stop
gcloud compute instances stop work
# start
gcloud compute instances start work
# delete Y/Nを聞かれる。
gcloud compute instances delete work

aliasすれば(以下略)

所で、他のVPSクラウドで私はstopをつかうことがあんまりない、なんかめんどいからだ。「なんか」という所は私の個人的な感覚なので異論は認める。

で、このgcloudコマンドのstop/start(と、list)の気軽さが非常によいな!と思っている。

AWSと比較になるが、GCEは小さいディスクならstop/startが本当に一瞬なのだ*9。思いついてから10〜20秒とかそういうオーダーである。IPもlistすればスッととれる。

停止中はディスク料金だけなので勿論お安い。1GBあたり$0.04なので、10GBなら月に50円とかそんな感じ。全然速度が変わるSSDにすると三倍で150円か。*10

ということで

alias gcp='gcloud compute copy-files'
alias glist='gcloud compute instances list'
alias gsh='gcloud compute ssh'
alias gup='gcloud compute instances start'
alias gdown='gcloud compute instances stop'

兎に角こんな感じのaliasにしておくと、本当に気軽にインスタンスを上げ下げしてsshでシュッとはいって作業出来て良い。 しかも停止しておけば月間で一台あたりせいぜい100円とかである。(起動できるDiskでなく、スナップショットとして保存しているかぎりは、さらに半額に!)

こんな手軽なVPS(ではないが)は初めてみたので、大変良いな!と思ってこのエントリを書いたのだった。

勿論、他のクラウドでそういうことができないという訳ではない。 「○○でもそういうことをやるツールがあるよ」というのはまあそうなんだ、しかしデフォルトが兎に角手間がないのが良いですね。 (自作してカスタマイズなんて、メールフォームしかつくらないようなPHPerには面倒なんだすまん!!!)

gcloudコマンドは本当に人が使うにはよく出来ていて、たとえば補完があったり、実行が同期的なのも実際に使うと良い、最初「コマンドのレスポンス遅い、すぐシェルにもどってほしい」なんて思っていたが、CLIだけで操作するなら同期で実行の結果がわかる方が助かるのだ*11

余談で値段

GCEは、激烈に安いということはない($300の初期クーポンはスゴイが)。AWSよりは安いっぽいが、格安VPSのほうがさらに安い。前述したVultrや、IDCフロンティアの月500円からのクラウドや、もうちょっとマシな性能で月1000円のConohaとかにはかなわない。

High Performance and Cheap Cloud Servers Deployment - Vultr.com

IDCFクラウド 料金表 | クラウドならIDCフロンティア

料金 / 日本 (東京) - 【ConoHa】スマート&パワフルなクラウドの新提案。ひと月900円から。

(ちなみに、これらのVPSは「最低契約期間がない」、クラウドっぽくつかえるものだから書いたので、あらゆるVPSを月額で比較してはいけない)

ただ、インスタンスをプリエンティブルモードとかいうヤツで起動すると、「最長24hしか起動できない&Googleの都合によっては1分で終了させられる」代わりに、1CPU3.75GBメモリというマットウなマシンが$0.0165/hourである。*12

これだと、仮につけっぱなしで月1400円くらいだろうか…しかし実際にはGoogleお母さんに勝手に終了させられるので、ウッカリつけっぱなしで課金がすごい!という事はないのである。昔のクラウドみたいに、バッツリ電源がおちるとデータが消える、ということも(あんまり*13)ないし、snapshotを取得してたてなおせば普通のインスタンスに(非プリエンティブに)する事も可能である。

とはいえ、プリエンティブルは本当にばっさり電源おとしてくれるし、運が悪いとインスタンスをあげた瞬間に落ちるので、これに頼るのもどうかとは思う。 (個人的には、ちょっとした確認作業や、テストとかで雑につかって、投げ捨てるみたいなのには良い)

余談 iOSアプリ

こうなると、「スマホであげたりさげたりしたい」という欲求が生まれるのは当然だろう。 まず、GCEの管理画面はMobile Safariならそれなりに操作できる。つまりほとんどフル操作をすることができるっぽい。ただ、けっこう細かい画面なので、最近視力が衰えた俺には大変である。まあ大変なだけなんだけど。

適当に「クラウドにはそういうツールないかな〜」ってツイットしてみたら、けんじおじさんに「それAWSにはあるよ」と聞いて、マジかそれは便利だなー、Googleもあるかなー…あった〜!ってなった。

Google Cloud Console

Google Cloud Console

  • Google, Inc.
  • 仕事効率化
  • 無料

たとえば、GCEインスタンスに対しては以下の事ができる

なんと、しれっとsshができる。このsshするというやつがやはり便利である、なんとvimがうごく!最高!やっぱりsshの鍵も自動転送で便利!!*15

たとえば…夜に徒歩10分のメシ屋に飯を食べに出かけていて「昨日私がこんなクソ機能もういらないって消すように指示した画面だけど、目の前のお客様が是非見たいっていうんだ。10分以内に見れるようにしてね!もしできなかったら常識的に考えて貴方の全責任で失注ってことで土下座にきてもらうし、そのときは機会損失の賠償額をお渡しします^^」みたいな電話がかかってくるのも頻繁にある事だ。すくなくとも俺にはある。

つまり、アワアワせずにサーバーを起動したりして、ちょっとしたコマンド(git checkoutとか、設定編集とか)がたたけて本当にハッピーですね。

「そんなのスマホに事前にsshクライアントをいれればいいじゃない?」って思うじゃん*16?でも、やっぱり事前にiPhoneにサーバー毎の接続情報や秘密鍵をいれておいたり、IPを別の画面からコピペしてきたり、そういうのをするのは面倒なんだよ…察してくれ頼む。

ちなみに、一部の人には気になるBlueToothキーボード対応だが、対応はしている。ただし、手元のキーボードではESCや、CTRLなどのコンビネーションキーはうまくうごかなかった*17。 まあ、iOSSSHアプリは大体同様なので、もうしかたないですね…*18

こうなるとスマホがさらに落とせないデバイスになっていくわけだが、そもそも(たとえば)みなさんgmailアプリがはいってる時点でいかんともしがたいな!がっはっは!あきらめよう!!!*19*20

まとめ

私「便利〜〜」 スゴイ人「フッザコめ、もっとこんないいものが世の中にはあるんだぜ」 私「なんだってギャー!!」

的な情報お待ちしております。

カンペ

alias gcp='gcloud compute copy-files'
alias gsh='gcloud compute ssh'
# ~/.ssh/configに書き出し
gcloud compute config-ssh
# ssh
gcloud compute ssh instance-name
# https://cloud.google.com/sdk/gcloud/reference/compute/ssh
gcloud compute ssh example-instance --ssh-flag="-L 13306:127.0.0.1:3306"
gcloud compute ssh example-instance --ssh-flag="-gD 1080"
# scp
gcloud compute copy-files instance-name:/file.tgz .
# インスタンス一覧、すごい便利
$ gcloud compute instances list
NAME              ZONE         MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP     STATUS
hoge-name         asia-east1-c n1-standard-1 true        10.240.0.4  130.211.255.216 RUNNING
isucon-ubuntu-3rd asia-east1-c n1-standard-1             10.240.0.2                  TERMINATED
ubuntu-test       asia-east1-c n1-standard-1 true        10.240.0.3  104.155.218.254 RUNNING
# インスタンス起動
gcloud compute instances start instance-name
gcloud compute instances stop instance-name
# スナップショット
gcloud compute disks snapshot source-instance-name --snapshot-names snapshot-name-`date +"%Y%m%d%H%M%S"`
# gcloud compute disks snapshot source-instance-name --snapshot-names isucon-ubuntu-3rd-`date +"%Y%m%d%H%M%S"` --zone asia-east1-c
# デフォルトゾーンとプロジェクトの指定
gcloud config set project project-id
gcloud config set compute/zone  asia-east1-c
# 設定確認
gcloud config list
# gcloud コマンド(Google Cloud SDK)インストール
# https://cloud.google.com/sdk/
$ curl https://sdk.cloud.google.com | bash
$ exec -l $SHELL # Restart your shell:
$ gcloud init
#スナップショットからサーバーを作成
## まずはDiskを作成
$ gcloud compute --project "isucon-practice-1070" disks create "hoge-name" --size "10" --zone "asia-east1-c" --source-snapshot "work-20151111" --type "pd-standard"
## instance を作成
gcloud compute --project "isucon-practice-1070" instances create "hoge-name" --zone "asia-east1-c" --machine-type "n1-standard-1" --network "default" --no-restart-on-failure --maintenance-policy "TERMINATE" --scopes "https://www.googleapis.com/auth/cloud-platform" --tags "http-server" --disk "name=hoge-name" "device-name=hoge-name" "mode=rw" "boot=yes" "auto-delete=yes"
(あるいは、--preemptible(安い代わりに死ぬやつ) をつける)
# インスタンス削除
$ gcloud compute instances delete hoge-name
# 非ルートディスク作成
https://cloud.google.com/compute/docs/disks/persistent-disks#creating_a_non-root_persistent_disk
$ gcloud compute disks create --size 200GB --type pd-ssd disk-name

デフォルトでは500GBのディスクが作られる。200GB以下だとパフォーマンスが落ちる。
--type を指定しないとpd-standard。

*1:初期登録で、$300のクレジットがもらえる、すごい

*2:AWSにもコマンドあるけど、こっちのほうが人が使うには出来が良い…ような…気がする

*3:AWSにせよGCEにせよ、Webの管理画面が結構重いが、Vultrは軽い。Prepaidで安心

*4:しかし、同様の形態である、Google Analyticsでは…「俺はもうこの案件かんけーねーのに、なんで延々と○○○キャンペーンみたいなののアクセス解析が一覧に出てくるんだ…検収放置されてるから連絡してもメールレスないし…ウゼェ…」みたいなのはあるかもしれない。個人の趣味によって差がありそう

*5:勿論まっさらなサーバー10台とかは無いけど「あのECサイト、お客さんにデモりたいから、明日までに25台よろ〜〜^^」みたいなオーダーを、さっと処理出来るという話である。

*6:ちなみに、この例はgcloudコマンド自体には「このやり方古くさいんじゃね?」と文句を言われるのがウケる。まあ動くから全然文句はない

*7:あれも、ssh鍵の最後のオプショナル部分をみてユーザー名を判定するという激烈な仕様だ

*8:勿論ACLはあるんだろうが「編集可能」などならば

*9:ちなみに、shutdown -r nowがやたらと早い

*10:ちなみに、容量やインスタンスによって性能が変わる、まあAWSでもにたような制限はある

*11:実は失敗してた、とか微妙だし、「終わったかな?」とか毎回詳細をコールしたくない

*12:更に下の、smallやmicroもあるけど、常時稼働させないなら誤差ですね

*13:ちゃんとshutdownが規定時間でおわれば

*14:残念ながら?インスタンスを新しく作る事まではできないっぽい

*15:しかし、日本語の入力は簡単にはできないっぽい、残念

*16:実際、promptというヤツが手元には入ってる。ところで、Coda for iOSが最近ほしいんだけど、評判が全然聞こえてこない

*17:BTをつないでもESCなどの修飾キーのパレットが画面から消えないのが不思議だったが、納得がいった

*18:ここらへん完全対応しているSSHアプリや、良い抜け道があれば知りたい…

*19:このアプリ、Dropboxみたいにアプリ内でパスコード設定できるようになってくれ頼む

*20:たとえ、パスコード連続ミスで初期化されるとしても、あまり信用しづらい