Azure

ARMテンプレートでインフラ構築する。

こんにちは。
曽我改め、そがひろです。

趣味はカラオケとカード手品です。
チーズバーガーが好きです。
宜しくお願いします。

Azureでインフラ環境を構築する方法っていろいろありますよね。

主に、

1. ポータルをカチカチクリックしてリソースを作っていく方法
2. Powershell・CLIで作成する方法
3. ARMテンプレートで構築する方法

があります。

1,2を使った構築経験はよくありますが、
3に関してはコードを使って
インフラを構成・管理していく方法となり、
IaC(Infrastructure as Code)と呼ばれています。

自分はコードを書くことに苦手意識を持っていていて、
覚えないといけない“とは思ってたものの…
今までずるずる避けていました。

今回を機に簡単な仮想マシンくらい
デプロイできるようになってやろうと思います。 (`・ω・´)ゞ

1. まずARMって? (´・ω・`)

普段Azureを触ってますが、ARMってそもそもなんやっけ??
ってなったので書きます。

ARM(Azure Resource Manager) :
Azure のデプロイおよび管理サービス 。
Azure サブスクリプション内のリソースを作成、更新、および削除できる管理レイヤーを提供します。 アクセス制御、ロック、タグなどの管理機能を使用して、デプロイ後にリソースを保護および整理します。

[参照元: MS公式サイト] Azure Resource Manager の概要

クラシックモデルを除いて、普段Azureを触っている人はこのARMっていう
管理体系でリソースを管理しているんだよーってことですね。

以下の通り主なARMの特徴について書きました。

1. Azure上のリソースは”リソースグループ“という論理的な器で
  まとめられて管理・監視する。

リソースグループ(RG)とリソースの関係

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

アクセス制御(IAM)の画面

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クイックテンプレートです!

GitHub – Azureクイックテンプレート

これは先人たちが自分みたいな初心者でも簡単にARMテンプレートに
慣れ親しめるように用意された様々なインフラ構成テンプレートです!
これを使わない手はない!ってことで早速シンプルな
インフラ構成のテンプレートをダウンロードします。

今回選んだテンプレートでは以下のリソースを作成します。

・仮想マシン(Ubuntu OS 18.04)
・仮想ネットワーク
・NIC
・パブリックIP
・NSG


本体ファイル(azuredeploy.json)とパラメータファイル(azuredeploy.parameters.json)

のみダウンロードすればひとまずOKです。

まず、パラメーターファイル(azuredeploy.parameters.json)から見てみます。

パラメーターファイル(azuredeploy.parameters.json)

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

“adminPasswordOrKey”は念の為マスクしてます。

認証については公開鍵ではなくPWを選択しています。

続いて、本体ファイル(azuredeploy.json)の中身を見ていきます。
(長いのでファイル全体の内容は貼りません。。)

parametersセクション一部抜粋

ん?先程のparameterファイルには無かった”vmName”や
“authenticationType”がparametersセクションに書いています。
よく見ると”defaultvalue”と書かれている項目があります。

これは、
parameterファイルに定義されていたらその値を取ってきて、
定義されていなければ、既定の値(defaultValue)を使ってね。という意味です。

今回parametersセクションにはその他にも、VMサイズ(Standard_B2s)や、
サーバOSのバージョン(Ubuntu 18.04)などが書かれていました。

resourcesセクション一部抜粋

上記は仮想マシンの通信制御に使われる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. 用途によって内容を編集。 ……

という感じで少しずつテンプレートに慣れていきたいと思います。
目標は全てインフラ構成をコードで管理!….したい。。

以上です。長々と読んで下さり有難うございました!

Azure料金に関する豆知識①前のページ

Office 365 F3(旧F1)次のページ

関連記事

  1. Azure

    Managed InstanceへのDB移行・アプリとの連携時の注意Point

    そがひろです。今回は、OnPremiseからAzure Manage…

  2. Azure

    Azure Migrateを使ったIaaS移行

    はじめまして。新人クラウドエンジニアの三醍醐です。今回は、新機能が実…

  3. Azure

    Azure Key Vaultでみんなしあわせ

    私の知っているシステム開発これまでかかわってきたC/SやAS…

  4. Azure

    Azure AD Connectの構築トラブルメモ

    今回はAzure AD Connect(AADC)を構築した際に色々…

  5. 最新情報

    テレワーク導入応援キャンペーン

    緊急事態宣言によるテレワーク対応待ったなし!でも、何が…

  6. Azure

    Azure 資格試験の更新(2020年版)

    2020年になり、早くも Azure 資格試験の更新がありま…

関連記事

  1. Azure

    LogAnalytics(監視エージェント)を利用したVMの監視をしよう
  2. Azure

    WindowsVirtualDesktopがGAされているので(その1)
  3. Application Gateway

    L7 負荷分散 Azure Application Gateway について:3…
  4. Azure

    Managed InstanceへのDB移行・アプリとの連携時の注意Point
  5. Azure

    Azure VMの自動起動停止を行う
PAGE TOP