Microsoft Azure 試し打ち(1)
Microsoft Azure の案件が一月流れて、今月暇になってしまったので、適当なシステムを構築して、自分の知識を棚卸ししてみようと思う。
作成するシステム
外部からの要求を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 |
リソースグループの構成
リソースグループはライフサイクルを共有するリソースでまとめるのが鉄則。検討の余地があるが、現状では以下のようにした。
- パブリックロードバランサー
- web サーバー(VM)
- インターナルロードバランサー
- MySQL(master)
- MySQL(replica)
- Redis(Master)
- Redis(Replica)
- VNet
リソースグループの名前は "<サービス名略称>-<環境>-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
今日はここで力尽きたので、続きはまた後日。