サイト「Go から Azure 仮想マシンをデプロイする」をやってみた

サイト「[Go 開発者向けの Azure | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/developer/go/)」の「クイックスタート」の「[Go から Azure 仮想マシンをデプロイする | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-qs-vm)」をmacOS上にて実際に動作させてみました。

## 前提条件

本文中にて、IDなど具体的な値や項目は日本語テキストに置き換えたり省略してあります。

## [Azure Cloud Shell を起動する](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-qs-vm#launch-azure-cloud-shell)

私はAzure Cloud Shellを使用せず、ローカルにAzure CLIをインストールして動作させました。

Azure CLIのインストール手順は、次の記事にて投稿しています。

- [Azure SDK for Goのセットアップ（macOS編） - Azure CLI](https://qiita.com/qt-luigi/items/37eabe4757d241fdef93#azure-cli)

Azure CLIのバージョンを確認します。本チュートリアルでは2.0.28以降が必要です。

```zsh
% az version
{
  "azure-cli": "2.17.1",
  "azure-cli-core": "2.17.1",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## [Azure SDK for Go のインストール](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-qs-vm#install-the-azure-sdk-for-go)

Goのバージョンを確認します。Azure SDK for Goでは1.8（Azure Stack プロファイルだと1.9）以降が必要です。

```zsh
% go version
go version go1.15.6 darwin/amd64
```

Azure SDK for Goの最新版を取得＆更新します。

```zsh
% go get -u -d github.com/Azure/azure-sdk-for-go/...
```

## [サービス プリンシパルの作成](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-qs-vm#create-a-service-principal)

### Azureへのログイン

作成コマンドを実行する前に、Azureにログインしておく必要があります。

ログインしているかどうか確認します。

```zsh
% az account show
```

ログインしていない場合に表示されるメッセージ

```zsh
Please run 'az login' to setup account.
```

ログインしている場合に表示されるメッセージ

```json
{
  "environmentName": "環境名",
  "homeTenantId": "テナントID",
  "id": "サブスクリプションID",
  ...
  "user": {
    "name": "メールアドレス",
    "type": "user"
  }
}
```

ログインしていない場合は、ログインします。Webブラウザーが起動してAzureへのログインが促されます。Azureアカウントとパスワードを入力してログインします。

```zsh
% az login
The default web browser has been opened at https://login.microsoftonline.com/common/oauth2/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`.
You have logged in. Now let us find all the subscriptions to which you have access...
```

ログインに成功すると、Webブラウザーではドキュメントサイトに遷移し、ターミナルではログイン情報が出力されます。Webブラウザーを閉じて大丈夫です。

```json
[
  {
    "cloudName": "クラウド名",
    "homeTenantId": "テナントID",
    "id": "サブスクリプションID",
    ...
    "user": {
      "name": "メールアドレス",
      "type": "user"
    }
  }
]
```

### サービス プリンシパルの作成

サービス プリンシパルの作成して、ファイル「quickstart.auth」に格納します。

```zsh
% az ad sp create-for-rbac --sdk-auth > quickstart.auth
```

quickstart.authの内容を確認します。

```zsh
% cat quickstart.auth 
{
  "clientId": "クライアントID",
  "clientSecret": "クライアントシークレット",
  "subscriptionId": "サブスクリプションID",
  "tenantId": "テナントID",
  ...
}
```

### サービス プリンシパルの設定

環境変数「AZURE_AUTH_LOCATION」に「quickstart.auth」のファイルパスを設定します。

```zsh
% export AZURE_AUTH_LOCATION=/Users/ユーザー名/quickstart.auth
```

環境変数に値が格納されていることを確認します。

```zsh
% echo $AZURE_AUTH_LOCATION                              
/Users/ユーザー名/quickstart.auth
```

## [コードの入手](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-qs-vm#get-the-code)

サンプル コードの入手は、ドキュメント通りです。

```zsh
% go get -u -d github.com/azure-samples/azure-sdk-for-go-samples/quickstarts/deploy-vm/...
```

## [コードの実行](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-qs-vm#running-the-code)

サンプル コードのディレクトリーに移動します。

```zsh
% cd $GOPATH/src/github.com/azure-samples/azure-sdk-for-go-samples/quickstarts/deploy-vm
```

ディレクトリーの内容は次の通りです。

```zsh
% ls -1
README.md
main.go
vm-quickstart-params.json
vm-quickstart-template.json
```

私の場合、サンプル コードを実行する前に、取得したAzure SDK for Goとサンプルのコード群で正常にコンパイルできるか確認しました。

```zsh
% go build main.go 
```

main.goファイルにはmain()関数が含まれているため、コンパイルすると実行バイナリー「main」ファイルが生成されます。

```zsh
% ls -1
README.md
main
main.go
vm-quickstart-params.json
vm-quickstart-template.json
```

ドキュメントの方法でサンプル コードを実行する場合は、次の通りです。

```zsh
% go run main.go
```

作成された実行バイナリーを実行する場合は、次の通りです。

```zsh
% ./main
```

実行ログが出力されます。

```zsh
2021/01/10 14:38:43 Created group: GoVMQuickstart
2021/01/10 14:38:43 Starting deployment: VMDeployQuickstart
2021/01/10 14:39:49 Completed deployment VMDeployQuickstart: Succeeded
2021/01/10 14:39:49 Log in with ssh: quickstart@IPアドレス, password: パスワード
```

上記の結果は、２回目の実行で得られたものです。

１回目の時は、２行目の「Starting deployment」で数分待たされたため、[Ctrl]+[C]で停止しました。

どうやら2行目では、Marketplaceから仮想マシンを取得していたようで、そのせいで時間がかかっていたようです。

**この後、４行目の情報を使いますので、誤ってターミナルを閉じたりしないように。**

### 各構成要素の作成を確認

学習も兼ねて、各構成要素が作成されたかどうかは「[Azure ポータル](https://portal.azure.com/)」にログインして、目視にて確認しました。

- リソース グループ
- サービス プリンシパル
- 仮想マシン
- 仮想ネットワーク

### 仮想マシンにログイン

仮想マシンが作成されたかどうか、実行ログの４行目の値を使って、SSH接続で仮想マシンにログインしてみます。途中にpasswordを聞枯れるのでパスワードを入力して[Enter]キーを押下してください。

```zsh
% ssh quickstart@IPアドレス
The authenticity of host 'IPアドレス (IPアドレス)' can't be established.
ECDSA key fingerprint is SHA256:SHA256値.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'IPアドレス' (ECDSA) to the list of known hosts.
quickstart@IPアドレス's password: パスワード
Welcome to Ubuntu 16.04.7 LTS (GNU/Linux 4.15.0-1098-azure x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.

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

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
```

仮想マシンにてumaneコマンドを実行してみます。

```zsh
quickstart@QuickstartVM:~% uname -a
Linux QuickstartVM 4.15.0-1098-azure #109~16.04.1-Ubuntu SMP Wed Sep 30 18:53:14 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
```

ローカルマシンはmacOSであり、Linuxの仮想マシンが作成されていることが確認できます。

### 仮想マシンからログアウト

仮想マシンからログアウトします。

```zsh
quickstart@QuickstartVM:~% exit
logout
Connection to IPアドレス closed.
```

## [クリーンアップしています](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-qs-vm#cleaning-up)

### リソース グループの削除

対象のリソース グループが存在していることを確認します。

```zsh
% az group list --output table
Name                               Location       Status
---------------------------------  -------------  ---------
GoVMQuickstart                     eastus         Succeeded
```

リソース グループの削除を実行します。

```zsh
% az group delete -n GoVMQuickstart
```

対象のリソース グループが削除されていることを確認します。

```zsh
% az group list --output table 
Name                               Location       Status
---------------------------------  -------------  ---------
```

### サービス プリンシパルの削除

ファイル「quickstart.auth」にて、項目「clientId」の値「クライアントID」をコピーします。

```zsh
% cat ~/quickstart.auth 
{
  "clientId": "クライアントID",
  ...
}
```

環境変数「CLIENT_ID_VALUE」にclientIdの値を設定します。

```zsh
% export AZURE_AUTH_LOCATION=クライアントID
```

環境変数に値が格納されていることを確認します。

```zsh
% echo $CLIENT_ID_VALUE                                      
クライアントID
```

サービス プリンシパルの削除を実行します。

```zsh
% az ad sp delete --id ${CLIENT_ID_VALUE}
Removing role assignments
```

## [コードの詳細](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-qs-vm#code-in-depth) 以降

- ソース コード：[azure-sdk-for-go-samples/quickstarts/deploy-vm at master · Azure-Samples/azure-sdk-for-go-samples · GitHub](https://github.com/Azure-Samples/azure-sdk-for-go-samples/tree/master/quickstarts/deploy-vm)

ソース コードには一通り目を通し、ココこそ力を入れて解説しようかと思ったのですが、公式ドキュメントのコード解説が詳しいので、出番なし！（素晴らしい！）