Microsoft Azure 試し打ち(1)

Microsoft Azure の案件が一月流れて、今月暇になってしまったので、適当なシステムを構築して、自分の知識を棚卸ししてみようと思う。

作成するシステム

f:id:kwy:20190903194703j:plain
図1 構成図第一案

外部からの要求をLB で受け、それをweb アプリが動作しているVM に割り振る。web サーバー以降のRedis, MySQL への接続は、Master への接続は直接、レプリカへの接続はインターナルLB を介して行うという、まぁよくある構成ではないかと。


必要なリソースの確認

図1 にあるリソースを作成するには、更に細かいリソースが必要となる。以下に必要となるリソースを表にまとめてみた(作成中)。

表1 必要なリソース一覧(作成中)

# 種類 リソース 解説
1 仮想ネットワーク 仮想ネットワーク
2 ネットワークセキュリティグループ
3 仮想マシン 仮想マシン
4 ディスク
5 ストレージアカウント
6 ネットワークインターフェース
7 パブリックIPアドレス
8 ネットワークセキュリティグループ
9 ロードバランサー
10 Azure Database for MySQL
11 Azure Cache Redis

リソースグループの構成

リソースグループはライフサイクルを共有するリソースでまとめるのが鉄則。検討の余地があるが、現状では以下のようにした。

リソースグループの名前は "<サービス名略称>-<環境>-rg"とした。 - contosopublb-prod-rg - contosoweb-prod-rg - contosoimtlb-prod-rg - contosomdb-prod-rg - contosordb-prod-rg - contosomredis-prod-rg - contosorredis-prod-rg - contosovnet-prod-rg

リソースグループの作成

では実際に作成。ようやくAzure CLI の出番

  • create_rg.sh
#!/usr/bin/env bash

set -euo pipefail

read -p "リソースグループのロケーションを入力してください: " location

az group list --output table

for resource_group in contosopublb-prod-rg contosoweb-prod-rg contosoimtlb-prod-rg contosomdb-prod-rg contosordb-prod-rg contosomredis-prod-rg contosorredis-prod-rg contosovnet-prod-rg
do
    az group create --location ${location} \
                    --name ${resource_group} \
                    --tags env=prod role=resource_group
done

az group list --output table
VNet の構成

VNet は、グローバルロードバランサーから右側のすべてを1つにまとめることにする。

VNet の作成
  • create_vnet.sh
#!/usr/bin/env bash

set -euo pipefail

read -p "VNet の名前を入力してください: " vnet_name
resource_group=contosovnet-prod-rg
read -p "VNet のIPアドレス空間を入力してください(例: 10.2.0.0/16): " vnet_cidr
ddos_protection=true
location=japanwest

az network vnet list --output table

az network vnet create --name ${vnet_name} \
                       --resource-group ${resource_group} \
                       --address-prefixes ${vnet_cidr} \
                       --location ${location} \
                       --tags env=prod role=vnet

az network vnet list --output table

サブネットの構成

作成したVNet をweb サーバー群が所属する "public"と、DB, Redis 群が所属する "private" というサブネットに分ける

サブネットの作成

  • create_subnet_external.sh
#!/usr/bin/env bash

set -euo pipefail

read -p "サブネットのIPアドレス範囲を入力してください(例: 10.2.0.0/24): " subnet_cidr
subnet_name=public
reource_group=contosovnet-prod-rg
read -p "VNet の名前を入力してください: " vnet_name

az network vnet subnet list --resource-group ${resource_group} --vnet-name ${vnet_name} --output table

az network vnet subnet create --address-prefixes ${subnet_cidr} \
                              --name ${subnet_name} \
                              --resource-group ${reource_group} \
                              --vnet-name ${vnet_name}

az network vnet subnet list --resource-group ${resource_group} --vnet-name ${vnet_name} --output table
  • create_subnet_internal.sh
#!/usr/bin/env bash

set -euo pipefail

read -p "サブネットのIPアドレス範囲を入力してください(例: 10.2.3.0/24): " subnet_cidr
subnet_name=private
reource_group=contosovnet-prod-rg
read -p "VNet の名前を入力してください: " vnet_name

az network vnet subnet list --resource-group ${resource_group} --vnet-name ${vnet_name} --output table

az network vnet subnet create --address-prefixes ${subnet_cidr} \
                              --name ${subnet_name} \
                              --resource-group ${reource_group} \
                              --vnet-name ${vnet_name}

az network vnet subnet list --resource-group ${resource_group} --vnet-name ${vnet_name} --output table

ネットワークセキュリティグループ(NSG)の設計

NSG は、サブネットとNIC のそれぞれに対して設定できるが、今回の構成ではサブネットのみの設定で用が足りるため、NIC に対しては設定しない。

public サブネット

public サブネットでは、80, 443ポートへの通信のみを受け付ける。また、SSH 接続を行うため、特定IP アドレスからの22ポートへの通信を受け付ける。

private サブネット

private サブネットでは、web サーバー群からのAzure Database for MySQLへの接続(3306ポート)とAzure Cache Redis への接続(6379ポート。SSL では6380)が必要となる。ただし、デフォルトでプライベートネットワーク内での通信に制限はないため、NSG を設定する必要はない。

NSG の作成

NSG は、作成後ルールを設定していく

  • create_public_nsg.sh
#!/usr/bin/env bash

set -euo pipefail

read -p "NSG の名前を入力してください: " nsg_name
reource_group=contosovnet-prod-rg
read -p "NSG のロケーションを入力してください: " location

az network nsg list --output table

az network nsg create --name ${nsg_name} \
                      --resource-group ${resource_group} \
                      --location ${location} \
                      --tags env=prod role=nsg

az network nsg list --output table

NSG 規則の作成

  • configure_public_nsg_rules.sh
#!/usr/bin/env bash

set -euo pipefail

# Allow_HTTP_HTTPS
read -p "NSG 規則の名前を入力してください: " nsg_rule_name
nsg_name=contoso-web-nsg
# 100
read -p "規則の優先度を入力してください: " rule_priority
reource_group=contosovnet-prod-rg
# japanwest
read -p "NSG のロケーションを入力してください: " location

az network nsg rule list --nsg-name ${nsg_name} \
                         --resource-group ${resource_group} \
                         --output table

az network nsg rule create --name ${nsg_rule_name} \
                           --nsg-name ${nsg_name} \
                           --priority ${rule_priority} \
                           --resource-group ${reource_group} \
                           --access Allow \
                           --destination-address-prefixes Internet \
                           --destination-port-ranges 80 443 \
                           --direction Inbound \
                           --protocol '*' \
                           --source-address-prefixes '*' \
                           --source-port-ranges '*'


az network nsg rule list --nsg-name ${nsg_name} \
                         --resource-group ${resource_group} \
                         --output table

作成したNSG をサブネットに適用する

  • この部分、作業前後の確認ができていないので「サブネットにアタッチされたNSG を特定する」コマンドを確認する
#!/usr/bin/env bash

set -euo pipefail

# external
read -p "サブネット の名前を入力してください: " subnet_name
reource_group=contosovnet-prod-rg
# contoso-prod-vnet
read -p "VNet の名前を入力してください: " vnet_name
# contoso-web-nsg
read -p "NSG の名前を入力してください: " nsg_name

# az network vnet subnet show --name ${subnet_name} \
#                             --resource-group ${reource_group} \
#                             --vnet-name ${vnet_name} \
#                             --verbose \
#                             --output table

az network vnet subnet update --name ${subnet_name} \
                              --network-security-group ${nsg_name} \
                              --resource-group ${reource_group} \
                              --vnet-name ${vnet_name}

# az network vnet subnet show --name ${subnet_name} \
#                             --resource-group ${reource_group} \
#                             --vnet-name ${vnet_name} \
#                             --verbose \
#                             --output table

今日はここで力尽きたので、続きはまた後日。