こんにちは。
曽我改め、そがひろです。
趣味はカラオケとカード手品です。
チーズバーガーが好きです。
宜しくお願いします。
Azureでインフラ環境を構築する方法っていろいろありますよね。
主に、
1. ポータルをカチカチクリックしてリソースを作っていく方法
2. Powershell・CLIで作成する方法
3. ARMテンプレートで構築する方法
があります。
1,2を使った構築経験はよくありますが、
3に関してはコードを使って
インフラを構成・管理していく方法となり、
IaC(Infrastructure as Code)と呼ばれています。
自分はコードを書くことに苦手意識を持っていていて、
“覚えないといけない“とは思ってたものの…
今までずるずる避けていました。
今回を機に簡単な仮想マシンくらい
デプロイできるようになってやろうと思います。 (`・ω・´)ゞ
目次
1. まずARMって? (´・ω・`)
普段Azureを触ってますが、ARMってそもそもなんやっけ??
ってなったので書きます。
ARM(Azure Resource Manager) :
[参照元: MS公式サイト] Azure Resource Manager の概要
Azure のデプロイおよび管理サービス 。
Azure サブスクリプション内のリソースを作成、更新、および削除できる管理レイヤーを提供します。 アクセス制御、ロック、タグなどの管理機能を使用して、デプロイ後にリソースを保護および整理します。
クラシックモデルを除いて、普段Azureを触っている人はこのARMっていう
管理体系でリソースを管理しているんだよーってことですね。
以下の通り主なARMの特徴について書きました。
1. Azure上のリソースは”リソースグループ“という論理的な器で
まとめられて管理・監視する。

2. “ロールベースアクセス制御 (RBAC)“でリソース グループ内の
すべてのサービスにアクセス制御が適用可能。

3. “タグ“をリソースに適用し、サブスクリプション内のリソースを
論理的に整理出来る且つ、同じタグを共有するリソースのコストを表示する
ことでタグ別(≒用途・組織別)の課金をわかりやすく出来る。

4.スクリプトではなく宣言型のテンプレート(ARMテンプレート)を使用し
インフラを管理できる。
最後の4で述べられている特徴がARMテンプレートのことです。
こういったテンプレートを使ってインフラを管理することを
Infrastructure as a Code
と言います。
2. インフラをコードで書くメリット
コードでインフラを管理することで何がうれしいのかというと、
インフラ構築を自動化できます。
例えば一般的なサーバ構築作業で下記のような設定手順があったとします。
- OSとしてCent OSをサーバへインストール。
- サーバを使用するユーザ用にアカウント・PWを設定。
- ミドルウェアとしてMySqlをインストール。
- MySqlを利用するユーザ用のユーザ・PWを設定。
これらの設定は手作業ですると二度手間なことがあったり、
同じ構成のサーバを複数台構築する時は、
上記作業 × サーバ台数分繰り返さないといけません。
また、手作業が多すぎると設定ミスなどのヒューマンエラーにも
繋がりますよね。
⇒ これらのOS/ミドルウェアのインストール・セットアップを
コードに記述することで 実行するだけで設計通りのインフラを作れます。
予めコードで「こんなインフラ構成を作ってね」と記述しておくことで後は自動でやってくれます。(冪等生)
一度作ったコード(テンプレート)を使えば、
同じような環境を作る時にコードを再利用できます。(時間のコストを節約)
また、インフラ構成をバージョン管理出来ます。
3. ARMテンプレートの中身
ARMテンプレートは下記6つのセクションから出来ています。

順に見ていきます。
- $schemaセクション(必須)
テンプレート言語のバージョンが記述されている
JSON スキーマ ファイルの場所。 定型文による決まり文句 。
- contentVersionセクション(必須)
テンプレートのバージョンを記述するセクション(1.0.0.0 など)。
任意の値を指定できる。
構成に変更があった際に値を更新。
- parametersセクション(任意)
テンプレートファイル(本体のファイル)とは
また別のファイル(パラメータファイル)から取得したい変数を
記述するセクション。
# リソースをデプロイするたびに定義したい値。
(VM名やログインパスワードなど)
- variablesセクション(任意)
parametersとは違い、テンプレート本体ファイル内で
変数を定義するセクション。
- resourcesセクション(必須)
デプロイや変更するリソースを定義するセクション。
仮想マシンやストレージを作成する時などに記述。
- outputsセクション(任意)
実行結果を返す。
作成完了時のメモを残すこともできる。
4. ARMテンプレートで仮想マシンをデプロイする
…とはいっても、いきなりARMテンプレートを使うことには
なかなか抵抗があります。
・ テンプレートファイルの中身はわかったけど実際に作るのはハードルが高い
・ フルスクラッチで書いてエラー吐きまくったらグダるだろうな
・ 一から勉強するとなると学習コストが高い
等々…
上記のように考えている方々でもできるだけ簡単にARMテンプレートを
使う方法がありました。それが、Azureクイックテンプレートです!

これは先人たちが自分みたいな初心者でも簡単にARMテンプレートに
慣れ親しめるように用意された様々なインフラ構成テンプレートです!
これを使わない手はない!ってことで早速シンプルな
インフラ構成のテンプレートをダウンロードします。
今回選んだテンプレートでは以下のリソースを作成します。
・仮想マシン(Ubuntu OS 18.04)
・仮想ネットワーク
・NIC
・パブリックIP
・NSG

本体ファイル(azuredeploy.json)とパラメータファイル(azuredeploy.parameters.json)
のみダウンロードすればひとまずOKです。
まず、パラメーターファイル(azuredeploy.parameters.json)から見てみます。

このパラメーターファイルではVMの管理者名(Built-inアカウント)と、
公開鍵orPW等認証情報、DNSラベル名(パブリックIP)が定義されていることがわかります。今回はこんな感じで変えて保存します。

認証については公開鍵ではなくPWを選択しています。
続いて、本体ファイル(azuredeploy.json)の中身を見ていきます。
(長いのでファイル全体の内容は貼りません。。)

ん?先程のparameterファイルには無かった”vmName”や
“authenticationType”がparametersセクションに書いています。
よく見ると”defaultvalue”と書かれている項目があります。
これは、
parameterファイルに定義されていたらその値を取ってきて、
定義されていなければ、既定の値(defaultValue)を使ってね。という意味です。
今回parametersセクションにはその他にも、VMサイズ(Standard_B2s)や、
サーバOSのバージョン(Ubuntu 18.04)などが書かれていました。

上記は仮想マシンの通信制御に使われるNSGの設定内容です。
よく見ると、22ポートへの通信はすべて許可になっています。
テスト環境といえど安全性を考慮し、今回は送信元” sourceAddressPrefix “に
自社のグローバルIPを登録しました。
などなど、テンプレート内容をところどころ変更しましたが、
変更せずそのまま利用できるテンプレートのほうが多いです。
テンプレートの修正が終わったら、実際にリソースをデプロイします。
Powershellコマンドは以下のようになります。
# リソースグループの作成
$rg = New-AzResourceGroup -Name “<リソースグループ名>” -Location “JapanEast”
# ARMテンプレートでリソースデプロイ
New-AzResourceGroupDeployment -ResourceGroupName $rg.ResourceGroupName `
-TemplateFile “<テンプレートファイル(azuredeploy.json)のパス>” `
-TemplateParameterFile “<パラメータファイル(azuredeploy.parameters.json)のパス>”
上記コマンドを叩いて赤字が出たら、エラーなので内容に従ってテンプレートファイル等修正します。
成功すると “output”セクション含め下記のように出力されます。

Azureポータルからだと以下のように見えました。

今回使用したテンプレートファイルは、同じような環境を作成する時に再利用できます。
“いつか使うだろうから。”と言っていつまでも利用しない環境を残さずに、
“必要になったらテンプレートでデプロイ⇒いらなくなったらすぐ作れるし削除!”
という風に出来て無駄なコストを削減出来ます。
まとめ
今回は本当に簡単な構成でしたが、
1. クイックテンプレートのテンプレートを使ってリソースデプロイ。
2. 用途によって内容を編集。
3. 編集したものを保存して再利用。
4. 用途によって内容を編集。 ……
という感じで少しずつテンプレートに慣れていきたいと思います。
目標は全てインフラ構成をコードで管理!….したい。。
以上です。長々と読んで下さり有難うございました!