Proxy 環境下な Bash on Ubuntu on Windows で Azure CLI

少々うろ覚えですが、備忘録も兼ねて。

#背景
##会社で Windows 10 & Ubuntu
私の会社では、各個人の PC は基本的に Win7 もしくは Win8.1 ですが、私のような新し物好きなんかは Win10 に入れ替えて利用しています。
とくに怒られることはありません。

Anniversary Update の適用はすぐにはやりませんでしたが、リリース1ヶ月後くらいには適用しました。
Ubuntu が使いたかったもので。

Win8.1 からはクライアント OS でも Hyper-V が容易に使えるので、VM 建てた方が楽じゃん？って、普通は考えますが、VM 用にリソースを割く必要があるのと、vSwitch 周りが面倒だったのと、cmd.exe で bash が使えることへの魅力で、Bash on Ubuntu on Windows が勝りました。

##強敵”Proxy”
Proxy がかなり難敵であるのは、みなさんもよくご存知でしょう。
なんと、私の会社は **認証 Proxy** なのでさらにさらに手強いのです。

幸いにも Bash on Ubuntu on Windows は Ubuntu 側の環境変数に設定するだけで上手いこと行きました。
詳細は後述。

##Azure PowerShell vs. Azure CLI
Windows OS なのに Azure CLI 使うのかよ、って Azure に精通してる方は感じるかと思います。
使ってみて思ったのは、**Azure PowerShell より直感的にコマンドを叩ける**こと。
PowerShell はコマンドの先頭に `New-xxx` とか `Get-xxx` とか入力しますけど、この後に続く肝心な部分が多くて覚えられないんですよね。
これが Azure CLI だと割と直感的に叩けるので覚えやすい。
対応してるリソースとかコマンドの量は圧倒的に PowerShell が勝りますが。

##環境
前置きが長くなりましたが、、、
まとめると、環境としては以下のような感じです。

- Windows 10 Anniversary Update 適用済
- Proxy 環境下（認証アリ）
- Azure をよく使う（Portal 然り PowerShell 然り）

Proxy に関しては認証アリナシはあまり関係ありません。
認証部分をどう入力するのか、ってところを押さえて頂ければ。

#Windows 10 で Bash on Ubuntu を使えるようにする
検索するとやり方が書かれた記事がたくさん出てきますので割愛します。

#Azure CLI を入れるための準備
##Proxy 設定
まずは Proxy の設定をしましょう。
これをやらないと話になりません。
Azure CLI はこれさえやっておけば動きます。

###認証ナシ
こちらは大丈夫でしょう。
割と定番な書き方ですね。

```bash:bash
export "http_proxy=http://<ProxyFQDN>:<ProxyPort>/"
export "https_proxy=http://<ProxyFQDN>:<ProxyPort>/"
```

###認証アリ
認証アリの場合、認証情報をサーバ情報の手前に書きます。
そして **@** をセパレーターとして使うのがポイントです。
Visual Studio Code なんかもこの書き方ですね。

```bash:bash
export "http_proxy=http://<ProxyUser>:<ProxyPassword>@<ProxyFQDN>:<ProxyPort>/"
export "https_proxy=http://<ProxyUser>:<ProxyPassword>@<ProxyFQDN>:<ProxyPort>/"
```

##Node.js のインストール
Azure CLI は npm パッケージなので Node.js は必須要件です。
しかし、ここ、結構ハマりました。
LTS 版 (v4.x) でないとちゃんと動きません。
まずは失敗談からご紹介します。

###失敗談 その1 - apt-get のパッケージ編
apt-get で普通に Node.js をインストールするとインストールされるのは v0.10.x です。
これでも Azure CLI はインストールできます。
Azure CLI も一見動いている様に見えます。が、一部正常な動作をしません。

**Storage への Blob のアップロード/ダウンロードができません。**

パブリッククラウドの Storage サービスは安いですから、割と使う人、多いのではないでしょうか。
しかし、使えないのです。エラーが吐かれます。

他にも使えない機能があるかも知れませんが、当時はアップロード/ダウンロードをしたかったので、他のは試していません。

###失敗談 その2 - Curl でインストール編
Node.js のダウンロードページへ行くと、パッケージマネージャからインストールする方法が書かれたページがあります。

> [パッケージマネージャを利用した Node.js のインストール](https://nodejs.org/ja/download/package-manager/)

ここに書かれている手順でインストールをしようとしたのですが、上手くいかない。

**理由1：Curl は環境変数の Proxy 設定を見に行かない。**
Curl の設定ファイルを弄る必要があるんですよね。
ずっと Windows を触ってきた人間としてはこの辺すらよくわかっていない。
しかも認証アリだと設定しても上手くいかない。
書き方の問題な気はしますが、当時は調べる時間も惜しかったので Curl のオプションで逃げました。

```bash:bash
curl -x "http://<ProxyFQDN>:<ProxyPort>/" -U "<ProxyUser>:<ProxyPassword>" -sL "https://deb.nodesource.com/setup_4.x" | sudo -E bash -
```

**追記**
curl の Proxy 設定をいろいろ検索したところ、下記の記事を多く見かけました。

```
$ vi /etc/curlrc

proxy-user = <ProxyUser>:<ProxyPassword>
proxy = http://<ProxyFQDN>:<ProxyPort>
```

これ、何度やってもダメでした。
いろいろ検索して見つけたのが、公式ドキュメント（日本語訳）。

> [Manual -- curl usage explained - 設定ファイル](http://www.hcn.zaq.ne.jp/___/unix/curl_manual.html#CONFIG-FILE)
> curl は起動時の際に，利用者のホームディレクトリから自動的に .curlrc 設定ファイルを読み込む（win32 システムにおいては _curlrc ）。

ホームディレクトリかい！！
というわけで、```~/.curlrc``` に下記内容を書いて保存。

```
proxy-user = <ProxyUser>:<ProxyPassword>
proxy = http://<ProxyFQDN>:<ProxyPort>
```

一旦 bash を閉じて、再度 bash を起動後、オプション無しで curl コマンドが成功しました。

なんだかんだ公式ドキュメントまんせーだな、と思った筆者であった。

**理由2：Ubuntu のバージョン的に NG**
上述の Curl を叩くとエラーが返ってきてインストールに失敗します。
エラーメッセージは下記。

```bash:bash
## Your distribution, identified as "trusty", is not currently supported, please contact NodeSource at https://github.com/nodesource/distributions/issues if you think this is incorrect or would like your distribution to be considered for support
```

「君が使ってるディストリビューション、今はサポートしてないよ。」
あ、はい。


じゃあどうやって Node.js インストールしたのよ？
ってなわけで本題へ戻ります。

###n package を使いましょう
参考にした記事はこちら。

> [Ubuntuに最新のNode.jsを難なくインストールする](http://qiita.com/seibe/items/36cef7df85fe2cefa3ea)

当記事には大変お世話になりました。（土下座

ひとまず普通に Node.js をインストールしましょう。
apt-get は環境変数の Proxy 設定を見に行きますので、Proxy 周りは気にしない。

```bash:bash
apt-get install -y nodejs npm
nodejs -v
```

バージョンは 0.10.x ですね？
では次に npm で n package をインストールしましょう。
npm も環境変数の Proxy 設定を見に行きます。安心。

```bash:bash
npm install -g n
n --version
```

そして肝心の Node.js LTS 版をインストールしましょう。
現在は v6.x になっています。
私は念のため v4.x で運用していますので、こちらも併せて紹介します。

```bash:bash
# 普通に LTS 版をインストール
n lts

# v4.x をインストール
n ls  # 4.x の最新バージョンを探す（現在は v4.6.1）
n 4.6.x
```

これだけです。
Node.js LTS 版がインストールされたか、確認しましょう。

```bash:bash
node -v
```

v0.10.x だと `nodejs -v` ですが、ほかのバージョンだと `node -v` になります。

Node.js インストール完了です！

参考にした記事には、v0.10.x の Node.js をアンインストールしていますが、アンインストールして若干トラブったので残した状態で運用しています。
`nodejs` と `node` とでコマンドが違いますし。
npm コマンドでは n package でインストールした Node.js の方が優先されるので問題ありません。

#Azure CLI のインストール
やっとインストールできますね。
こちらは簡単です。

```bash:bash
npm install -g azure-cli
```

インストールが終わったら動くか確認しましょう。
Azure CLI も環境変数の Proxy 設定を見に行きます。万歳。

```bash:bash
azure
```

初回実行時は Telemetry の送信を許諾するか否かのメッセージが出てきます。
`y` なり `n` なり入力しましょう。
ASCII で書かれた Azure のロゴが出てくれば完了です。

```bash:bash
info:             _    _____   _ ___ ___
info:            /_\  |_  / | | | _ \ __|
info:      _ ___/ _ \__/ /| |_| |   / _|___ _ _
info:    (___  /_/ \_\/___|\___/|_|_\___| _____)
info:       (_______ _ _)         _ ______ _)_ _
info:              (______________ _ )   (___ _ _)
info:
info:    Microsoft Azure: Microsoft's Cloud Platform
info:
info:    Tool version 0.10.6
```

Node.js v0.10.x でできなかったアップロード/ダウンロードができた時の感動が甦る・・・。

#あとがき
ちゃんと動く Azure CLI を触るまで、結構ハマりました。
いつか記事としてまとめようと思い、現在に至ります。

ちゃんと動いてから少々時間を経てしまいましたので、多々抜けてる部分がありそうな気がします。
当記事を見てインストールされた方で、抜けてる部分を発見したり、他の失敗談があったりしましたらコメントをください。