Azureで基本的な構成を構築してみる①(前提、ネットワーク・VM作成)


1. 背景

自分自身、AWS環境はこれまで1年ほど触ってきましたが最近業務で数日Azure環境でインフラ構築したので、そこで学んだ知見を共有したいと思います。
今回構築するのはコストを抑えた小規模インフラだったのですが、まとまった記事が少なく、手戻りが発生したり公式ドキュメントを頑張って読み解いたりすることが多くて大変だったので、この記事がどなたかの参考になれば幸いです。

Azureで基本的な構成を構築してみる①(前提、ネットワーク・VM作成) ←今ここ
Azureで基本的な構成を構築してみる②(ALB、DNS作成)
Azureで基本的な構成を構築してみる③(MySQL作成, VMからのSSL接続)

2. 前提

今回構築したAzureインフラに乗せるアプリケーションがスモールスタートのものであったため、インフラも小規模構成で、Azureの利用料金をできるだけ抑えるという要件がありました。
サービスによっては何も考えずにスペックを選択すると月何万単位で課金されてしまう恐れがあり、Azureの料金体系は念入りにリサーチしました。
また、同じサービスでも高いグレードだと使えるけど、低いグレードだと使えないオプションもあり、代案を考える必要もありました。

3. アーキテクチャ図

今回作成するアーキテクチャは以下のようなものとなります。括弧内にAWSで対応するサービス名を書いています。

AWSでいうRoute53,ALB,EC2,RDSのオーソドックスな構成です。(サイトのSSL化はまだしていないので、今後記事を書きたい)

構成のポイント

・ApplicationGateway(ALB)専用のサブネットが必要
AWSではALBとEC2等でサブネット共有できたと思いますが、AzureでALBに相当するApplicationGatewayを作る際は、専用のサブネットが必要になります。
グレードとしてStandard v2でオートスケール機能があるため、インスタンスを確保したいからかと思われます。ただ、今回はStandardでインスタンス数1とするので関係ありませんが、、

・VM(EC2)にもパブリックIPを付与
アプリケーションの動作するEC2にはALB以外からの横入りをされたくないので、プライベートサブネットに所属させてパブリックIPを付与しないのが自然です。しかし今回はDatabaseforMySQL(RDS)にインターネット経由でアクセスする必要があり、パブリックIPを付与しています。(理由はMySQL作成の記事に書きますが、簡単に言うとMySQLで安いBasicプランを選択する必要があったためです。)
また、MySQL側のファイアウォールでVMのIPのみ開放しセキュリティを担保しています。動的IPだと再起動時にVMのパブリックIPが変わって接続できなくなる恐れがあるため、静的IPを付与しました。

4. 構築手順

4.1 仮想ネットワーク作成

Vnet(AWSでいうVPC), サブネットを作成します。
Azureポータルで「仮想ネットワーク」に移動 → 「+作成」

【基本】タブ
・リソースグループ:新規作成する場合は、後に作成するリソースもこれと同じリソースグループに含めること。
・名前:任意
・地域:東日本

【IPアドレス】タブ
サブネットは後から作成できますが、ここで一気に作ります。
・IPv4アドレス空間:10.0.0.0/16(任意)
・サブネット名:2つサブネットを新規作成する。
・「+サブネットの追加」→
   VM用のサブネット:10.0.0.0/24(任意)
   ALB用のサブネット:10.0.1.0/24(任意)

【セキュリティ】【タグ】タブ
デフォルト設定のまま

→作成

4.2 VM作成

VM(AWSでいうEC2)を作成します。
Azureポータルで「Virtual Machines」に移動 → 「+作成」 → 「仮想マシン」

【基本設定】タブ
・リソースグループ:上記Vnetと同じグループを選択
・仮想マシン名:任意
・地域:東日本
・イメージ: 今回は「RedHatEnterprise Linux8.1 Gen2」を選択
・サイズ:今回は小規模構成でコスト抑えたいので「B1ms」を選択
・認証の種類:SSH公開キー
・キーのソース新しいキーの組の生成
・受信ポート:HTTP(80),SSH(22)

【ディスクの種類】タブ
・OSディスクの種類:Standard SSD(初期運用でローコストに抑えたいため、PremiumSSDは避けました)
・その他はデフォルトの設定

【ネットワーク】タブ
後述しますがDBへの接続設定で、VMのIPから接続許可するFirewallが必要になるので、静的IPを割り当てました。
・仮想ネットワーク、サブネット:前述で作成済のものを選択
・パブリックIP:新規作成し、「静的」を選択(静的IPは追加で¥300/月程度課金される)
・パブリック受信ポート:HTTP,SSHが選択されていることを確認

【管理、詳細、タグ】
デフォルトのまま設定

→作成後、SSH秘密鍵を忘れずダウンロードしておく

4.3 VM内設定

作成したVMにSSHログインしてネットワーク設定を行なっていきます。
・ローカルで任意のディレクトリに移動し、ダウンロードしたSSH秘密鍵を持ってくる
・秘密鍵の権限変更(chmod 400)
・sshログイン

$ ssh -i <鍵のパス> azureuser@<VMのパブリックIP>

・firewallのポート穴あけ(firewall起動しておく場合)

$ sudo firewall-cmd –-add-port 80/tcp  --permanent --zone=public
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all

・SELinuxを永続的に停止

$ getenforce
Enforcing
$ sudo vi /etc/selinux/config
・SELINUX=enforcing → disabledに修正
$ sudo reboot

・再起動後、SSHログインし無効化されていることを確認

$ getenforce
Disabled

ついでにyumアップデート

$ sudo yum update

接続確認のためApache httpdを一旦インストールします。

$ sudo yum install httpd
$ sudo systemctl enable httpd
$ systemctl start httpd

httpdデフォルトのページだとステータスコード403となり、後の記述で作成するALBからのヘルスチェックに失敗したので、DocumentRootにページ作りました。

$ vi /var/www/html/index.html
   →適当にHelloWorldページ記述

4.4 セキュリティグループ確認

今回設定はしませんが、VMにアタッチされているセキュリティグループで適切なポートが開いているか一応確認します。
Azureポータルで「Virtual Machines」 → 作成したVM → 「ネットワーク」と移動 → 「受信ポートの規則」タブ
以下のとおり80が開いています。(VMにSSHアクセスする用事なければ22は念の為閉じときましょう。)

もしVMにのせるアプリケーションの仕様上、80番ポート以外から、待ち受ける場合はセキュリティグループとVMのファイアウォールでポート開放しておくことを忘れずに!

その後、ブラウザからVMのパブリックIP入力し、Hello Worldページが確認できればOKです。