Azure の勉強をしていて、なんとなくコマンドラインでVMをデプロイできたらかっこいいなと思ったのでやってみました。
上のリンクは Microsoft が公開している Github 上のチュートリアルみたいなもののようですが、そのままの内容では分かりづらかったり、うまく行かないところがあったので、もう少し詳しく書いてみます。
事前知識
必要となりそうな知識を超簡単にまとめておきます。私も Azure についてはまだまだ勉強中なので、間違いや表現が不適切な部分がたくさんあると思います。
まず、Azure にはVMのデプロイを自動化するために Azure Resource Manager Template (ARM Template) というものがあります。これはJSON形式のファイルで、どのリージョンのどのリソースグループにどんなユーザ名でどんなOSを使ってVMを作るかといったことを事細かに指定することができます。自分で一から書くこともできると思いますが、そんな人はあまりいないと思います。多くの場合は他の人が作ったものをダウンロードして加工したり、既存のVMから ARM テンプレートをダウンロードして加工したり、というのが一般的な使い方なのではないかと勝手に想像しています。
この記事では、上のリンクにあるように、Microsoft が Github で公開しているテンプレートを使う事にします。
そして、このテンプレートを実行する方法は、たぶん色々あるのだと思いますが、この記事ではポータル上の Azure CLI で実行してみたいと思います。他にもローカルマシンにインストールした Azure CLI からとか、ポータル上の「テンプレート機能」でも行けるかも?と思いますが、この辺りは未検証です。
実践する内容のざっくりまとめ
そんなわけで、この記事では以下のような前提で Linux VM をデプロイします。
・Azure ポータルから Azure CLI を使う
・Ubuntu の VM をデプロイする(Microsoft の ARM テンプレートを使う)
・VM へのログイン方式はパスワードではなく SSH キーによる認証を使う
・私が使っているPCはWindows 10
・デプロイされた VM に Putty という SSH クライアントで接続検証する
とにかくやってみる
上のリンクに基づいて、やってみましょう。
Azure CLI (Cloud Shell) を開く
最初は、ポータル上で Azure CLI を開く必要があります。場所が分かりにくいですが、以下の場所にコマンドラインっぽいボタンがあります。
で、上のボタンを押すと、初めて使う場合は以下のように聞かれます。
これは、シェルプログラムを保存するための領域が必要で、そのためにストレージアカウントを用意する必要があるよ、という事なんだと思います。で、ファイルを保存するとその容量に応じて課金されるよ、とも言っているようです。まあ、シェルスクリプトの容量なんて知れているので、別にそんなに気にせず「Create storage」で良いと思います。いやなら後で全部消せばいいです。
で、次に初めて使う場合は「bash」にするか「Powershell」にするかを聞かれると思います。私の環境はではもう設定してしまったのでスクリーンショットを撮ることができませんでした。ここではBash を選択します。後からいつでも変更できます。
この設定が終わるとプロンプトが表示されます。これは Azure ポータル内で出てきます。
次に、上のチュートリアルからコマンドをコピーします(下の画面のように、コピーボタンでOK)。
貼り付ける
すると、以下のように入力待ちの状態になる。
上の画面では作成するリソースグループの名前を聞かれているので、適当に入力します。
そのあと、順番に以下の項目が聞かれます。
VMをデプロイするリージョン→適当に入力
プロジェクト名→リソースの名前を付けるのに使われます。VM の名前だったり、VNET の名前だったりに使われます。
ユーザ名→適当にユーザ名を適当に決める
SSH public key → ふぁ!?????
となり、SSH public key のところで試合終了(Ctrl + C で中止)です。
SSH public key とは ? (SSH の公開鍵認証で使う公開鍵のこと)
SSH public key について、知っている人は飛ばしてもらって大丈夫です。私はここで少し苦戦しました。AWS でも Azure でも、Linux のVMを運用する時は、多くの場合 SSH キーによる認証が推奨されます。パスワード認証しかやったことない、と言う人はこれを機にぜひSSH キーによる認証に挑戦して欲しいです。
ここで、SSH キーによる認証というのをかなり簡単に(適当に)私が知る範囲で説明してみます。
SSH キーによる認証と書きましたが、もう少し攻めて公開鍵認証と表現することにします。で、公開鍵認証では、通信の内容を暗号化するために、あらかじめ公開鍵と秘密鍵を生成しておきます。この鍵のペアはかなり特殊で、どちらで暗号化しても、対となる鍵でしか復号することができません。なので、公開鍵で暗号化した文字列は、秘密鍵を使わないと復号できません。同様に、秘密鍵を使って暗号化した内容は公開鍵でしか復号できません。暗号化する時に使った鍵では復号することができないのです。特殊です。そんな物、もはや鍵と表現して良いのか分かりません。SSHの公開鍵による認証の手続きはかなり複雑で、ここでは詳しく書けない(私の技術的にムリ)なのですが、この特殊な鍵のペアを使うと安全に通信することができます。
で、この公開鍵認証を使うために(多くの場合)サーバ側に公開鍵を入れておき、クライアント側は秘密鍵を保存しておきます。そうすると、Putty などの SSH クライアントソフトが勝手にSSH認証をやってくれます。
ちなみに、公開鍵とか秘密鍵とか言っていますが、両者は機能的な差がありません。鍵ペア生成のプロセスで生成された二つの鍵のうち、秘密に取り扱う方を秘密鍵と呼び、一般に公開する方を公開鍵と便宜上の呼び名をつけているに過ぎません。
ここで話を戻して、先ほどのコマンドでデプロイする時に聞かれた「ssh public key」とは、つまり公開鍵認証で使う公開鍵を求められているということになります。
さて、かなり雑な説明でしたが、実際に公開鍵認証を使うための準備をしてみましょう。
まず、「鍵ペアをどのように生成するか」ですが、結論から言うとどうやっても良いです。鍵ペアを生成するコマンドは広く知られているので、それが使えればどうやってもいい(はず)です。
強いて言うなら、なるべく秘密鍵がインターネット上に晒されない方法で、やたらに秘密鍵をどこかにコピーとか移動とかしなくて良い方法が望ましいと思います。
ここでは、Azure ポータルで生成する方法を使ってみます。この方法ではポータル上で鍵ペアを生成し、秘密鍵の方は生成した時に1回ダウンロードできるのみなので、秘密鍵の秘匿性はそれなりに保たれるのではないかと思います。
Security Admin role は名前からすると他のユーザへのRead 権限を与えられる権限を持っているように見えるが、そんなことはない。この role はsecurity policy の閲覧や変更ができるのみ。
Azure ポータルで SSH キーペアを生成する
ポータルの上部にある検索バーに「ssh key」などと入れると、以下のように候補が出るので選択します。
次に出てくる画面で「作成」ボタンを押し、必要な情報を入力します。
すると、以下のようなダイアログが出るので、ダウンロードの方を選びます。
ここでダウンロードしたファイルが秘密鍵です。大切に保管しましょう。ファイル名は*.pemとなっています。この秘密鍵は、後でSSHクライアントからVMにログインする時に使うので、pem ファイルはここ、と覚えておきましょう。
公開鍵の方も以下のように生成されています。この公開鍵は何度も使うかもしれないので、テキストエディタかなんかで保存しておいた方がいいかもです。
これで ssh public key の準備ができました。
もう一度 Azure CLI でコマンド入力
それでは、もう一度 Azure CLI に戻ってコマンドを入力しましょう。
以下のように、SSH public key (公開鍵) も入力して、いざ Enter !
だめでした。
こんなエラーメッセージが出てきました。
Unable to retrieve url https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/101-vm-sshkey/azuredeploy.json
どうも、Github に登録されているテンプレートファイルを取得できないようです。
実際に取得先のURLにブラウザにアクセスしてみても、404 エラーとなります。
おそらく、正しいURLが変わったのでしょう。
仕方がないので英語サイトの方に行ってみると、確かに変わっていました。
正しくは以下のようです。
https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/quickstarts/microsoft.compute/vm-sshkey/azuredeploy.json
というか、いっそのこと全部英語サイトのほうからコピーした方が早いので、以下のURLからどうぞ。
上のリンクに飛んで、↓のようなボタンでコピーすれば良さそうです。
Azure CLI から3度目の挑戦
今度こそ、というわけで英語サイトにあるスクリプトをコピーしてそのまま使ってみます。
今度はうまくいきました。1分くらいすると以下のように処理が終了します。
作成されたVMのIPアドレスが表示されています。
VM にアクセスしてみる
というわけで、さっそくVMにアクセスしてみます。
VMにアクセスするには、SSH 公開鍵認証方式を使う必要があります。
ここでは、SSH クライアントである Putty に秘密鍵を登録した上でアクセスする必要があります。
ここで、Putty に秘密鍵を登録して使うには、ひと手間加えてやる必要があります。
実は、上で鍵のペアを作った時に生成されたファイルは pem という形式なのですが、Putty では使うことができません。Putty では ppk という形式を使うので、pem → ppk に変換してやる必要があります。
pem → ppk に変換
pem → ppk に変換するにはPuttyに付属している puttygen.exe を使う必要があります。Putty がインストールされているなら、インストールフォルダに入っていると思います。
もしなかったら、以下のリンクからダウンロードすることができます。
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
このページに飛んでputtygen.exe を検索して64-bit x86版をDLすれば良いと思います
puttygen.exe を起動したら、Loadボタンを押し、上で作った*.pem ファイルを読み込みます。
読み込むと同時に、処理が完了します。
上のダイアログで案内されているように、「Save private key」を押して秘密鍵を適当なところに保存しておきます。ファイルの拡張子は *.ppk となっています。
※保存する時「Are you sure you want to save this key without a passphrase to protect it?」と聞かれるのでYes(パスフレーズを設定しない)を選択しましょう。
putty に秘密鍵を設定してアクセスする
長い道のりでしたが、ようやくVMにアクセスする準備ができました。
いつものようにPuttyを立ち上げ、対象のVMのIPアドレスを指定しておきます。
今回は公開鍵認証を使うので、秘密鍵を putty に登録します。登録は、以下のように「Auth」の項目から「Private key file for authentication」のところで、先ほど作成した*.ppk ファイルを指定します。
Putty 不慣れな人のための注意:この後、接続するには、左側の一覧から一度「Session」を選択する必要があります。
接続すると、ユーザ名を聞かれるので上で指定したユーザ名を入力すると、パスワード入力無しでログインすることができます。良かった!
後片付け
最後に、作成したリソースをポータルから削除しておきましょう。この辺もCLIでやれればいいですが、まだ修業が足りないですね。
コメント