【やってみた】Azureチュートリアル：ARMテンプレートのデプロイ

# サマリ
Azure公式ドキュメントにある、
「チュートリアル:初めての ARM テンプレートを作成してデプロイする」をやってみました。

# 背景


[昨年の自分の記事](https://qiita.com/san_bay3/items/17c995ee99a097fa527e)で
AWSの１０分間チュートリアルをやってから早半年、、

クラウド学習から遠ざかっていたので、
今度はAzureのチュートリアルを一つピックアップしてやってみました。
（一貫性のなさがすごい）

# ゴール

以下の公式ドキュメントに記載のチュートリアルを最後までやりきる

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-tutorial-create-first-template?tabs=azure-powershell



# 対象読者
- Azureを触ってみたいがとっかかりがなく触れていない方
- 自分（備忘のため）

# 前提
必須：Azure環境（今回AzurePortalにログインした後からの手順なので、Azureの環境がない方は別記事などでまずは事前準備いただく必要があります）
推奨：Azure、特にARMに関する知識（自分もまだFundamentalsを勉強中で全然知識ないです）

# 環境
- 作業PCのOS：Window10 Home
- Azure CLI：2.59.0

# 手順

## そもそもARMとは
公式ページによると以下とのことです。
Azureのリソースの管理やそれらをデプロイするためのサービスということですね（そのまま

> Azure Resource Manager は、Azure のデプロイおよび管理サービスです。

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/overview

## そもそもARMテンプレートとは
こちらも公式ページを貼り付けます。

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/templates/overview

アジャイル開発における課題等も色々書いてあるのですが、
ようはIaC（Infrastructure as Code）を実現するためのテンプレートということですね（強引）
以下の通り、AzureではJSON形式で定義するようです。

> Azure ソリューション用にインフラストラクチャをコードとして実装するには、Azure Resource Manager テンプレート (ARM テンプレート) を使用します。 テンプレートは JavaScript Object Notation (JSON) ファイルであり、プロジェクトのインフラストラクチャと構成が定義されています。

今回はそのテンプレートのサンプルをデプロイしてみようということですね。

## 手順実施
ざっくりイメージをつかんだところで手順に移ります。

基本的に冒頭でも張り付けた[公式ドキュメント](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-tutorial-create-first-template?tabs=azure-powershell)の通り進めます。

### エディタの準備
まずは事前の準備として、

>  テンプレートを作成するには、適切な JSON エディターが必要です。 Visual Studio Code と Azure Resource Manager Tools 拡張機能をお勧めします。

とのことです。
Visual Studio Codeは手元にあったのですが、
ARM Toolsの拡張機能がなかったのでインストールすることにしました。

アクティビティバーの機能拡張のところで検索してみると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/2b87d650-de4e-c8d9-7f7d-b525a6e4b858.png)

一番上にそれらしいものが出ました。
こちらをインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/635d371f-9d28-facf-9813-17931f66842e.png)

行けました。

### コマンドライン環境の準備

> テンプレートをデプロイするには、Azure PowerShell または Azure Command-Line Interface (CLI) も必要です。 Azure CLI を使用する場合は、バージョン 2.37.0 以降が必要です。

とのことで、こちらもAzure初心者としては準備が必要なので対応します。

Azure Powershell か Azure CLIのどちらかが必要ですが、
どっちがいいのかよくわかりません。（おい

公式ドキュメントおよび記事をピックアップしました。

https://learn.microsoft.com/ja-jp/cli/azure/get-started-tutorial-0-before-you-begin

https://az-start.com/azure-cli-vs-azure-powershell/

詳しいことはよくわかりませんが、
なんとなくAzure CLIの方が直感的そうなので今回はこちらにすることにします。
（ちなみに今回のチュートリアルの手順には両方の手順が載っているのでよほど業務上指定がある等の理由がなければどちらでもいいかと思います。）

Azure CLIのインストールも公式に手順があるのでこちらを参考に進めていきます。

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/236318fe-1c35-f6a8-2b7a-80b4fadae29b.png)

msiファイルを実行します。

License Agreementが出るので、ノールックでチェックしInstallを選択（おい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/f6dc2bcd-0067-ee5f-0e4d-b03d3fcb88a1.png)

Finishで完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/2da717cf-8389-768a-2ea2-ea57d257d5f1.png)

これでどうやらWindowsのPowerShellまたはコマンドプロンプトでazコマンドが使えるようになっていること…
本当か…！？

…

![cap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/ed883d8b-87fa-f2bb-49a1-c142b90e391b.png)

![cap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/99dd2c79-848a-e7e9-f34c-25cfba0debea.png)

ほんまや～！

ということで次に行きたいのですが、公式ドキュメント曰く、
コマンドのタブ補完をできるようにしておいた方がいいということで

`notepad $PROFILE`コマンドを打ち込みます。
すると、メモ帳とともに以下のポップアップが出ます。
（すでにプロファイルを作成済みの場合は出ないかもです）

![cat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/b234fa44-0ff0-d18b-02f9-9fb64f44ff12.png)

はいを押下し、自動で開かれたメモ帳に以下の情報をコピペして保存します。
（こちらも公式ドキュメントに記載のものです）
```powershell
Register-ArgumentCompleter -Native -CommandName az -ScriptBlock {
    param($commandName, $wordToComplete, $cursorPosition)
    $completion_file = New-TemporaryFile
    $env:ARGCOMPLETE_USE_TEMPFILES = 1
    $env:_ARGCOMPLETE_STDOUT_FILENAME = $completion_file
    $env:COMP_LINE = $wordToComplete
    $env:COMP_POINT = $cursorPosition
    $env:_ARGCOMPLETE = 1
    $env:_ARGCOMPLETE_SUPPRESS_SPACE = 0
    $env:_ARGCOMPLETE_IFS = "`n"
    $env:_ARGCOMPLETE_SHELL = 'powershell'
    az 2>&1 | Out-Null
    Get-Content $completion_file | Sort-Object | ForEach-Object {
        [System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)
    }
    Remove-Item $completion_file, Env:\_ARGCOMPLETE_STDOUT_FILENAME, Env:\ARGCOMPLETE_USE_TEMPFILES, Env:\COMP_LINE, Env:\COMP_POINT, Env:\_ARGCOMPLETE, Env:\_ARGCOMPLETE_SUPPRESS_SPACE, Env:\_ARGCOMPLETE_IFS, Env:\_ARGCOMPLETE_SHELL
}
```

念のためPowershellを再起動してみると、エラーが出ているではないですか、、


![mem3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/b09714bc-8385-ec1f-e59b-81328e204c05.png)


[こちらの記事](https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f)を見てみると、
実行ポリシーが初期状態のままであることが原因のようです。
（デフォルトではシェルの実行が許可されていない）

記事に従って、

`Get-ExecutionPolicy`コマンドで改めて`Restricted`になっていることを確認、

`Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process`を実施
`RemoteSigned`になっていることを確認

:::note info
余談
詳細は割愛しますが、以下の記事の通り
Powershellの実行ポリシー変更に関してはscopeという概念があり、
どの範囲で変更を適用するか設定できるようです。
（今回は、実行ポリシーを変更してもとに戻すのが手間（あるいは戻し忘れによるリスク回避）のため、scopeをprocessに変更することであくまで一時的なポリシー変更とすることが目的）

https://qiita.com/kikuchi/items/59f219eae2a172880ba6

:::

ポリシーを変更したら、
ps1ファイルの実行は下記を参考にさせていただきました。
（ps1ファイルがあるフォルダに移動してファイル名打ち込むだけですね）

https://qiita.com/tomoko523/items/df8e384d32a377381ef9

![cat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/670bb530-a731-bd4f-5563-425cddd08745.png)


おぉ～特にエラーが出ない。

試しにここまで売ってから、Tabを押してみると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/4351fe38-21af-0e3d-c8ff-497067796397.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/c569f3aa-cf56-e5ec-ea8d-fd0caacc08cc.png)

おぉ～自動補完されました！（本当ですよ）


### Azure CLIの最新化
`az upgrade`コマンド実行しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/dfae3e6e-adf0-feda-cca9-b55cbac00a49.png)

すでに最新版だよということですね（そりゃそうか）

### 最初のテンプレートを作成する
はぁ、はぁ、長い道のりだ…
ようやく本題に入ります。

VSCode に移り、公式でドキュメントに則りazuredeploy.jsonファイルを新しく作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/585fc5bf-1ae9-7239-98ec-632459483532.png)

以下のJSONをコピーして貼り付けます（[公式ドキュメント](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-tutorial-create-first-template?tabs=azure-powershell)より引用）
```json
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": []
}
```

> このテンプレートではリソースをデプロイしません。 間違いが生じる可能性をできるだけ抑えつつ、テンプレートをデプロイする手順に慣れることができるよう、最初は空のテンプレートを扱います。

とのことです、初心者に優しいですね～

各要素についても解説が載っているので気になる方は読んでもらえたらと思います。

[公式ドキュメント](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-tutorial-create-first-template?tabs=azure-powershell)から抜粋
> $schema: JSON スキーマ ファイルの場所を指定します。
> contentVersion: テンプレートのバージョンを指定します (1.0.0.0 など)。
> resources: デプロイまたは更新するリソースが格納されます。

ファイルの保存を忘れずしたらテンプレートの完成です。

### Azureへのサインイン

`az login`コマンドをPowerShellで実行します。
するとブラウザでログイン画面が出るのでログインします。
（自分の場合すでにログイン済だったので以下の表示になっています）

![cat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/09a38ab9-8681-94b9-d435-0bd85267f312.png)

ログイン出来たらPowerShellにこんな感じの情報が出てきます。

![cat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/61e876c4-d79d-5b02-d958-17827fba452c.png)

### リソースグループの作成

`az group create --name myResourceGroup --location "Central US"`
コマンドを実行します。

すると、以下の表示が出ます

![cat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/f4f3a47d-4430-bf71-9b97-c89720cce9dd.png)


うまくいったっぽいですね。
### テンプレートのデプロイ
公式ドキュメントの手順通り

```powershell
templateFile="{provide-the-path-to-the-template-file}"
az deployment group create --name blanktemplate --resource-group myResourceGroup --template-file $templateFile
```
と打ち込んだのですが、
以下のエラーが発生

![cat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/5c3dc203-5ab7-b120-af8f-4a08e77bd5e7.png)

templateFile=のパスが正しくないということで（そりゃサンプルだからそうだ）
azuredeploy.jsonを作ったデスクトップのパスを記載したのですが、
（C:\Users\ユーザーネーム\Desktop\）
それでも同じくうまくいかず…


最終的にファイ所のtemplateFile行は削除し、
--template-fileの部分にjsonファイルのパスを指定して実行したら無事できました。

こんな感じです。
![cat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/2634ccb1-a3c4-a376-0066-9141961d32a5.png)

ドキュメント曰く

> また、便宜上、テンプレート ファイルのパスを格納する変数も作成します。 この変数を使用すれば、デプロイするたびにパスを再入力しなくても済むため、デプロイ コマンドが実行しやすくなります。

ということで、必須項目でなくどちらかというと効率化の観点での変数設定だと思うので、今回は良しということにします（おい

無事、Succeededの文字も確認できました…！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/2b92aa5e-2abd-c935-70d2-2a0d72c46ac1.png)

AzurePortalのリソースグループからmyResourceGroupを選択し、
確かにデプロイ部分に1成功となっていますね、
（よかった～）

![cat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/7805a410-4429-53a5-ebcf-c9af368858e8.png)

1成功をクリックすると以下のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/b1db531c-776e-3610-29b6-499ab9f9f2fa.png)

さらにチェックボックスにチェックを入れ、blanktemplateをクリックすると、
以下の画面になります。

![mem2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/a45f5a73-da6e-57a9-2be3-2b96772d9886.png)


デプロイが完了しました！

### リソースグループの削除
今回はこれで終わるので、リソースグループの削除を行います。
公式ドキュメントに記載の手順でAzurePortalから削除もできますし、
今回は試しにコマンドで実施してみました。

`az group delete --name ExampleResourceGroup`

ExampleResourceGroupをmyResourceGroupに書き換えればOKです。

無事消えました（ほっ

# 結果

[公式ドキュメントの手順](https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-tutorial-create-first-template?tabs=azure-powershell
)
に沿って、

「チュートリアル:初めての ARM テンプレートを作成してデプロイする」
を完了できました。


# まとめ
まずはAzureに少しでもなれることが目的だったので、
これを皮切りにちょっとずつ触っていきたいと思います。