初めてのAzure VM構築記録

# 初めに
この記事はAzureの学習をしたアウトプットになります。
ありがたいことに、はじめての実務先がMicrosoft365に関してかなり詳しく学習に最適な環境だったのでその副産物として記事を書くことにした次第です。

# Azureとは
Azureは、いわゆるクラウドサービス。
AWSやGCPなんかと肩を並べる三大クラウドのひとつだが、その全貌は階層構造により複雑極まりないものとなっている。
また、その複雑な階層構造それぞれに権限の付与などをおこなえるのでこまかな設定を行いたい大企業に最適なサービスと言える。

# 全体像
```
[Azure Active Directory]
     └─ [テナント]
          └─ [サブスクリプション]  ← 課金単位
               └─ [リソースグループ]  ← 管理単位
                    ├─ [VNet]
                    │     └─ [サブネット]
                    │           └─ [Network Security Group]
                    ├─ [VM]
                    │     ├─ [NIC]
                    │     │     └─ [Public IP Address]
                    │     └─ [Disk]
                    ├─ [Storage Account]
                    └─ [Azure SQL Database]
```
このような、まるでフォルダのような階層構造でAzureは構成されている。
Azure Active Directory以下にはテナントが存在し、そのテナントは複数作成できる。

:::note info
自分用の Azure テナント（popo-personal.onmicrosoft.com）を作成
会社の Azure テナント（corp-company.onmicrosoft.com）にも参加
両方を 1つの Microsoft アカウントで切り替えて使える
:::

さらに、テナント配下のサブスクリプションも同様に複数作成できるので管理が複雑にできる反面、細かな設定が可能となる。
※VNetやVMも同様に複数作成可能

# 各名称について
ここでは各名称について軽く解説
MSLearnでも書いてあるけど正直言葉が固すぎるしサービス多すぎて理解できないから簡単に…

## Azure Active Directory
Microsoftが提供しているクラウドベースのID・アクセス管理サービス

| 機能 | 具体例 |
|:-:|:-|
| ユーザー管理	  | 従業員アカウントの作成・削除・認証  |
| グループ管理		  | 権限単位のグループ化（開発チームなど）  |
| シングルサインオン		  | 1回のログインで複数アプリにアクセス  |
| アプリ統合			  | Microsoft 365や自社アプリと連携  |
| ロール制御			  | 管理者・閲覧者など役割に応じた権限管理  |
| MFA・条件付きアクセス			  | 多要素認証や場所・デバイス制限  |

## テナント
Azure Active Directoryのインスタンス（組織専用のID空間・管理領域）のこと

```
[Azure Active Directory]
     └─ [Tenant（例：mio-corp）]
          └─ [Directory（ディレクトリ）]
               ├─ Users
               ├─ Groups
               └─ Applications
```

役割：ID管理の領域
中身：Users、Groups、Apps

## サブスクリプション
Azureでリソース（VMなどのこと）を使うための契約・課金・管理の単位

```
[Azure Active Directory]
     └─ [Tenant（組織）]
          ├─ [Subscription A]
          │     └─ [Resource Group A]
          │           └─ [VM・VNet・DBなど]
          └─ [Subscription B]
                └─ [Resource Group B]

```


**特徴**
リソースの隔離を担っており、サブスク単位で開発や本番環境などを分けることができる
課金の分離を担っており、プロジェクトや部署ごとに請求書を分けられる
RBAC（ロールベースアクセスコントロール）の分離を担っており、アクセス権をサブスク単位で制御できる
割り当てん変更も可能で、ほかのテナントにサブスクを移すことも可能（一部条件あり

## リソースグループ
Azure上のリソース（VMやVNet、DBなど）をまとめて管理するためのコンテナ

```
[Subscription]
     └─ [Resource Group: rg-web-dev]
          ├─ [Virtual Machine: vm1]
          ├─ [Storage Account: mystorage]
          ├─ [Virtual Network: vnet-dev]
          └─ [Public IP: pip-web]

```


**特徴**
一括削除により、リソースグループを削除すると中身も全部削除される
権限制御により、グループ単位でアクセス制限を設定できる（RBAC）
地域（リージョン）指定ができ、リソースグループ自体にリージョンを設定できる
※中のリソースは別のリージョンでもOK
課金や監視をまとめることができるので、コスト分析やアラート対象として使用できる

## VNet
Azure上で作る仮想的なネットワーク空間

```
[VNet: vnet-prod]
     ├─ [Subnet: web-subnet]
     │     └─ [VM: web-server]
     └─ [Subnet: db-subnet]
           └─ [VM: db-server]

```

**特徴**
IPアドレス空間の定義をおこなえる。CIDR（例：10.0.0.0/16）で指定可能
サブネット分割ができ、サービスやセキュリティ単位でネットを分けられる
NSGで通信制御ができ、サブネットやNIC単位でファイアウォール設定が可能
ピアリングができ、ほかのVNetと接続可能（VNet Peering）
VPN接続ができ、オンプレとつなぐことも可能（VPN Gateway）

:::note warn
VNetはパブリック通信ではなく、内部ネットワークのみ
外部に出す場合は、パブリックIPやNATが必用
VNetはサブスクリプション＆リージョンに属する
:::

## サブネット
VNet内の小さな区画

```
[VNet: 10.0.0.0/16]
     ├─ [Subnet: subnet-web (10.0.1.0/24)]
     │     └─ [VM: web-server]
     └─ [Subnet: subnet-db (10.0.2.0/24)]
           └─ [VM: db-server]

```
**特徴**
通信の分離を行い、Web用・DB用などで分けてセキュリティ強化ができる
IP範囲の割り当てにより、VNetの中でさらにCIDRで範囲指定ができる
NSGとの連携により、各サブネットにファイアウォールルールがつけられる
リソース配属先を指定でき、VMやDBなどをどのネットワークに置くか決める場所となる
:::note warn
サブネットのCIDR範囲はVNet内で重複できない
サブネットをまたいで通信するにはNSGで許可が必要な場合がある
Azureの一部リソース（VPN Gatewayなど）は専用サブネット名が必用
:::

## Network Security Group
通称：NSG
Azureの仮想ネットワークで通信を制御するファイアウォールのようなもの
どのIPポートを許すか、拒否するかを決めるルール集

```
[VNet]
  └─ [Subnet: web-subnet]
        └─ [VM: web-server]
              └─ [NSG: nsg-web]
                    ├─ Allow: 80 (HTTP)
                    ├─ Allow: 22 (SSH)
                    └─ Deny: All others

```
**特徴**
ルールの方向を決めることができ、受信（Inbound）と送信（Outbound）で分けて管理している
適用先として、サブネットにもNIC（VMのネットワークカード）にも割り当て可能
優先度として、ルールには番号（低いほど優先）がある（100～4096）
デフォルトでは、「すべて拒否」、必要な通信だけ明示的に許可する方式
プロトコルは、TCP/UDP/Anyが指定可能

| 名前 | 優先度 | 方向 | ポート | アクション | 説明 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| Allow-HTTP	  |  100 | Inbound  | 80  | Allow  | Webアクセス許可  |
|  Allow-SSH	 |  200 | Inbound  | 22  | Allow  | SSH接続許可  |
| Deny-All	  | 4096  | Inbound  | *  | Deny  | 他すべて拒否  |

:::note alert
同じVMに「NICのNSG」と「サブネットのNSG」両方適用できる
NSGはWAFではない
つまり、ネットワーク層でアクセス制御する、Azureのセキュリティブロック
:::

## VM
Azure上で動く「仮想的なパソコン（サーバー）」

```
[Virtual Network]
     └─ [Subnet]
          └─ [VM: myVM]
               ├─ [NIC（ネットワークカード）]
               │     └─ [Public IP（必要なら）]
               ├─ [OS Disk（Cドライブ相当）]
               └─ [NSG（通信制御）]
               
```
**特徴**
OSの選択が可能、Windows/Linuxの選択ができる
スケーリングにより、必要に応じてサイズ変更が可能(vCPU、メモリなど）
起動・停止はポータルやCLIから何時でも可能（停止中でも一部料金発生）
ディスクは、OSディスク＋データディスクを複数選択可
ネットワークは、NICを通してVNet/Subnetに接続
公開は、パブリックIPをつなげればインターネット公開できる
SSH/RDP（リモートデスクトップ）接続ができ、LinuxはSSH、WindowsはRDPで接続

:::note warn
停止には二種類あり、「割り当て解除」と「課金継続」
ディスク、NIC、IPなどはVMとは別に管理されている
:::

## NIC（Network Interface Card）
Azure VMがネットワークと接続するためのネットの挿し口

```
[VM: myVM]
   └─ [NIC: myVM-nic]
        ├─ [Private IP: 10.0.1.4]
        ├─ [Public IP: 52.x.x.x（任意）]
        └─ [NSG: 通信ルール（任意）]

```
**特徴**
プライベートIPを設定でき、サブネット内のローカルIPアドレスとして使用
パブリックIPを設定でき、インターネット接続用として使用できる（必要な時だけつけれる）
NSG割り当てができ、NIC単体でもファイアウォール設定できる（サブネットNSGと組み合わせ可能）
複数NICができ、VMに複数のNICをつけて、ネットワークの分類もできる（一部VMサイズで対応可）
静的IP設定可能で、DHCPで自動、もしくは固定IP割り当ても可

:::note warn
VMがVNet/Subnetに接続されるときは必ずNICが必用
パブリックIPの付け外しはNICを通して設定
ネットワーク設計上、「セキュリティ分離した通信経路」が必要なときにNICを増やす
:::

## Storage Account
Azureであらゆるデータを保存するための万能ストレージの入り口

```
[Storage Account: mystorage]
     ├─ [Blob Storage]       ← 画像・動画・バックアップなど
     ├─ [File Share]         ← Windows共有フォルダ風の保存領域
     ├─ [Table Storage]      ← NoSQLデータ
     └─ [Queue Storage]      ← メッセージのやりとり

```
### 保存できるデータの種類
| 種類 | 説明 | 用途例 |
|:-|:-|:-|
| Blob  | 大容量の非構造データ（画像・動画など）  | バックアップ、静的Web  |
| File Share  | SMBプロトコルで共有できるファイルストレージ  | ファイルサーバー  |
| Table  | NoSQL形式の構造化データ  | 軽量データ保存  |
| Queue  | 非同期処理用のメッセージキュー  | 処理のバッファ  |

**特徴**
リージョン指定ができ、どの地域に保存するか選べる（冗長性設計に関係）
アクセス制御ができ、SASトークン、RBAC、キーなどで制限可能
冗長性オプションができ、LRS/ZRS/GRSなどを設定できる
静的Webサイト機能により、HTML/CSSなどをホスティング可能（Blob）

:::note warn
ストレージアカウント名は全世界で一意（DNSになるため）
データの種類によってアクセス方法が異なる（REST API/SMB/SDKなど）
:::

# VNを立ち上げよう
ここまで、Azureの各サービスに触れてきたので簡単にVM立ち上げまでを行ってみる
設計図はGithubに挙げてるので、そちらを参考に…

https://github.com/Ahoudori77/azure-vm-first-setup/blob/main/README.md

### 1.RG作成
Azureポータルにログインし、リソースグループを選択し、作成
![スクリーンショット 2025-05-28 230745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/6bc2d133-3e67-4397-b7fa-995a1e3ea0ba.png)
作成後、下記のように設定
・サブスクリプション：自分の使用中のもの
・リソースグループ名：rg-azure-web（適当に
・リージョン：Japan East（お好みで
![スクリーンショット 2025-05-28 230920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/41fa8525-3d35-4292-aab0-fc0a75acd4e7.png)
設定後、「レビューと作成」をクリック

### 2.VNetとサブネット作成
仮想ネットワークを選択し、作成
![スクリーンショット 2025-05-28 231732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/1d390438-ef9f-4b6b-bd15-cbc28305f03d.png)
基本タブ
・リソースグループ：rg-azure-web
・名前：vnet-web
・リージョン：Japan East
![スクリーンショット 2025-05-28 231743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/8b9f8358-05ee-479f-b337-d5772f836f2c.png)

IPアドレスタブ
・アドレス空間：10.0.0.0/16
・サブネット：subnet-web/10.0.1.0/24
![スクリーンショット 2025-05-28 231916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/bd65ed05-3a5f-48c5-b140-079ecab95eb0.png)
残りの項目はデフォルトで、「確認及び作成」⇒「作成」

### 3.パブリックIPアドレス作成
パブリックIPアドレス⇒作成
![スクリーンショット 2025-05-28 232911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/d523b019-aa2f-408e-b652-d7e700849ff1.png)
基本タブ
・名前：pip-web
・SKU：基本
・割り当て：静的
・DNS各ラベル：任意
・リソースグループ：rg-azure-web
![スクリーンショット 2025-05-28 233206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/36e591a2-d039-4719-8192-57fd0c5581b5.png)
確認及び作成⇒作成

### 4.NSG作成
ネットワークセキュリティキグループ⇒作成
![スクリーンショット 2025-05-28 233250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/c9805303-b7ec-4d27-bb12-db9808a3a2f4.png)
基本タブ（括弧内はポート22の場合）
・優先度：100（110）
・名前：Allow-HTTP（AllowSSH）
・ポート範囲：80（22）
・プロトコル：TCP
・ソース：任意
・アクション：許可
![スクリーンショット 2025-05-28 233913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/e325a53f-0561-4b95-a1f9-d75f707a396b.png)

### 5.VM作成
仮想マシン⇒作成
![スクリーンショット 2025-05-28 233954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/77bb5139-abfe-4a32-8a15-6e211261e7e2.png)
基本
・名前：vm-web
・リージョン：Japan East
・イメージ：Ubuntu Server 22.04 LTS
・サイズ：B1s（無料枠）
・認証：パスワードorSSH公開鍵
ディスク:標準HDD（コスト低いのでこちらを使用しました）
ネットワーク
・仮想ネットワーク：vnet-web
・サブネット：subnet-web
・パブリックIP：pip-web
・NSG：nsg-webを指定
![スクリーンショット 2025-05-28 234729.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3864659/b1a1b8d7-a9e3-41f4-811f-aa34efdecaa2.png)
↑今回の編成だと月1800円弱ほど
確認及び作成⇒作成

### これにてVM完成。
あとは、SSHなんかでVMへ接続してみて煮るなり焼くなり、お好みに。

## あと語り
M365もAzureもややこしい！！
AZ900勉強してて感じたけど、似た文言が多すぎて頭の中ぐちゃぐちゃになってしまう・・・
体型的に理解すれば問題ないみたいに聞くけど、正直いまも理解できてない部分が多すぎる。
MSLearn見てるだけじゃ、覚えられない部分が多いから実際に手を動かすのが一番いいと思うので、みんな頑張ろうね・・・