GitHub MCP Serverでレポジトリ上のAzureナレッジを検索してみた

GitHub MCP Serverでレポジトリ上のAzureナレッジを検索してみた

Clock Icon2025.05.28

はじめに

こんにちは、コンサルティング部の神野です。

最近、Model Context Protocol(MCP)が話題になっていますね。特にGitHubが公開しているGitHub MCP Serverが気になっていたので、実際に使ってみることにしました。

弊社でもGitHub MCP Serverを使った事例が記事にあり、Pull Request作成を自動化しているケースがあります。

https://dev.classmethod.jp/articles/cline-github-mcp/

今回は、Azureの大規模なドキュメントやサンプルコードが豊富に含まれているリポジトリを題材に、GitHub MCP ServerがどれだけナレッジベースとしてAIと連携できるのかを試してみたいと思います!!

前提

今回MCP Serverを使うにあたって、Claude Desktop(Proプラン)を使用します。

https://claude.ai/download

GitHub MCP Serverとは

GitHub MCP Serverは、GitHubが開発したModel Context Protocol(MCP)のサーバー実装です。これにより、生成AIがGitHubのAPIを通じて直接リポジトリの情報にアクセスできるようになります。

主な機能

GitHub MCP Serverには以下のような機能があります。
詳細な機能については公式レポジトリのReadmeをご参照ください。

https://github.com/github/github-mcp-server

リポジトリ関連

  • ファイル内容の取得・更新
  • ブランチ作成・管理
  • コミット履歴の確認

Issues・Pull Requests

  • Issue作成・更新・検索
  • Pull Request作成・マージ・レビュー
  • コメント機能

検索機能

  • リポジトリ検索
  • コード検索
  • ユーザー検索

セキュリティ

  • コードスキャニングアラート
  • シークレットスキャニング

などなど・・・多岐に渡りますね・・・!!
今回はファイル内容の取得をメインで使用していきます。

セットアップ

今回はClaude Desktopを使用して、MCP Serverの設定を進めていきます。
Cmd + ,を入力して、設定画面を表示します。
表示したら、開発者タブを選択して、構成を編集ボタンを選択します。

CleanShot 2025-05-28 at 09.35.59@2x

すると、構成ファイルがFinderなどで表示されるので、エディターでJSONファイルを編集して下記を追加します。

{
  "mcpServers": {
    "github": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "GITHUB_PERSONAL_ACCESS_TOKEN",
        "ghcr.io/github/github-mcp-server"
      ],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>"
      }
    }
  }
}

内容を見るにDockerを使用しているので、もし未インストールの場合はインストールしておきましょう。
GITHUB_PERSONAL_ACCESS_TOKENはアクセストークンが必要なため、取得しておきます。
取得方法はユーザーの設定画面から、Developer settingsを選択します。

CleanShot 2025-05-28 at 09.44.18@2x
設定後は、Personal Access tokens > Fine-grained tokensを選択して、Generate new tokenボタンを押下します。

CleanShot 2025-05-28 at 09.43.29@2x
Token nameにトークン名を入れて、Repository accessはRead-onlyで構わないので、Public repositoriesを選択してGenerate token ボタンを押下します。
ちなみに有効期限はデフォルトの30日にしていますが、任意の期間を選択ください。

CleanShot 2025-05-28 at 09.46.27@2x
再度、確認画面が出るので、Generate token ボタンを押下します。
Pasted image 20250528094859
するとトークンが表示されるので、クリップボードにコピーするボタンがあるのでクリックして、取得したトークンをJSONにペーストして使用する形となります。
CleanShot 2025-05-28 at 09.49.06@2x

設定が無事完了すると、下記のようにgithubが追加されていればOKです!
CleanShot 2025-05-28 at 09.56.13@2x

今回の題材:日本語版 Azure 共通基盤(ランディングゾーン) 設計・構築ガイド

検証に使用したのは、日本語版 Azure 共通基盤(ランディングゾーン) 設計・構築ガイドというリポジトリです。

https://github.com/nakamacchi/AzureCAF.LandingZones.Demo?tab=readme-ov-file

このリポジトリを選んだ理由は以下です。

  • コンテンツの豊富さ
    • Azure CAF(Cloud Adoption Framework)に基づいた日本語の共通基盤設計・構築ガイドが含まれている
  • 実用性の高さ
    • 実際のエンタープライズ環境で使える構築スクリプトとドキュメントが揃っている
  • 大量のドキュメント
    • 00番から74番まで、多数のフォルダとファイルで構成されている

複数のファイルがあって、Azureのサブスクリプションを跨いだネットワーク、統制管理などを意識した際にとても役立つ資料が詰まったレポジトリです。
大量のファイルを見るのに目視だと時間がかかるので、GitHub MCP Serverを経由することでより効率的に資料を見たり、作成の手助けになるかなと思って今回試した次第です!

試しに聞いてみる

試しにレポジトリの内容を教えてと聞いてみます。

CleanShot 2025-05-28 at 10.11.00@2x

おお!get_file_contentsを使用して、Readmeファイルを参照して要約してくれていますね。
もう少し踏み込んで聞けるようシステムプロンプトを使用します。

システムプロンプトを活用する

今回はGitHub MCP Serverを使用してくれましたが、たまに質問によってはMCP Serverを使わない、または生成AI自身の知識から返却されないようレポジトリに従ってメッセージを返却する下記システムプロンプトを設定してやりとりしてみます。

システムプロンプトの例
あなたはAzure環境のセキュアな設計と実装のエキスパートアシスタントです。

GitHub MCP Serverを使用して、以下のリポジトリを参照しながら質問に回答してください:
https://github.com/nakamacchi/AzureCAF.LandingZones.Demo
※ローカルにはファイルは存在しないので、Claude CodeのようなMCPサーバーは使わず、必ずGitHub MCP Serverを使用してください。

このリポジトリは、Azure CAFとESLZをベースにした日本語版Azure共通基盤(ランディングゾーン)の設計・構築ガイドです。リポジトリには以下のようなコンテンツが含まれています:

1. 基本部分(フォルダ番号00~12):
   - マルチサブスクリプションの環境構成
   - Hub-Spoke VNET環境(ゼロトラストベース)
   - IaaSとPaaSのWeb-DBアプリ実装例
   - カスタムRBACロールによる権限分掌
   - 仮想マシンのセキュリティ強化
   - Azure PolicyとMDfC対応
   - 運用監視設定

2. 拡張サンプル:
   - AOAI社内文書検索(41~44)
   - AKS Web-DBアプリ(51~56)
   - Container Apps Web-DBアプリ(61~65)
   - DevCenterによるセルフサービス環境(71~74)

質問に回答する際は、必ず`get_file_contents`、`search_repositories`関数を使用して、リポジトリ内の関連するスクリプトやドキュメントを参照してください。スクリプトやコード例が必要な場合は、適切なファイルを検索し、具体的な実装例やスクリプトを提供してください。

必要に応じて以下の操作を行ってください:
1. 関連するフォルダ構造を調査する
2. 特定のファイルの内容を取得する
3. 内容を分析し、質問に合った回答を生成する
4. 必要に応じてコードの一部を抽出または修正し、具体的な実装例として提示する

Azureの設計原則、セキュリティベストプラクティス、運用管理のポイントも含めて解説してください。クライアントの質問内容や要件に最適なソリューションを提案できるよう、リポジトリの内容を効果的に活用してください。
基本的にレポジトリの内容以外は含めないよう注意してください。必ずレポジトリの内容を厳守してください。

質問してみる

今度はマルチサブスクリプション環境の作成をステップバイステップで教えてと聞いてみます。

CleanShot 2025-05-28 at 10.46.47@2x

00.環境準備から順繰りで03.ハブサブスクリプションの作成のフォルダのファイルを確認して、ステップバイステップで構築コマンドを提供してくれました。
これをみたら実際に構築をスムーズに進めていけそうですごいですね・・・!

全体の下記は回答に添付しました。長いので折りたたんでいます。

回答全文
リポジトリの内容を確認いたしました。Azure CAF(Cloud Adoption Framework)とESLZ(Enterprise-Scale Landing Zones)をベースにした、セキュアなマルチサブスクリプション環境の構築手順をステップバイステップでご説明いたします。
Azure マルチサブスクリプション環境構築の全体構成
このリポジトリでは、以下の4つの基本サブスクリプションを使用してHub-Spoke型のマルチサブスクリプション環境を構築します:

subscription-mgmt:運用監視基盤(Log Analytics Workspace、運用管理端末)
subscription-hub:本番環境用ハブ(Azure Firewall)
subscription-spoke-a:業務システムサンプルA(IaaS Web-DBアプリ)
subscription-spoke-b:業務システムサンプルB(PaaS Web-DBアプリ)

ステップ1: 環境準備(Step 00)
1-1. 作業環境の準備
まず、Azure CLI環境を準備します:
bash# 推奨:WSL2上にAzure CLIをインストール
wsl --install  # Ubuntu をインストール
# Azure CLI のインストール(Linux用手順に従う)
1-2. サブスクリプションの準備
4つのAzureサブスクリプションを以下の名前に変更:

subscription-mgmt
subscription-hub
subscription-spoke-a
subscription-spoke-b

1-3. 環境変数の設定
リポジトリから取得した設定スクリプトを実行:
bash# グローバル管理者でログイン
az logout
rm -rf ~/.azure
az account clear
az login

# 環境変数設定(以下の値を実際の環境に合わせて修正)
PRIMARY_DOMAIN_NAME=yourcompany.onmicrosoft.com
ALERT_EMAIL_ADDRESS=admin@yourcompany.com

# IP範囲設定
IP_HUB_PREFIXS[0]="10.0"
IP_MGMT_PREFIXS[0]="10.48"
IP_SPOKE_A_PREFIXS[0]="10.1"
IP_SPOKE_B_PREFIXS[0]="10.2"

# サブスクリプションID取得
SUBSCRIPTION_ID_MGMT=$(az account list --query "[? name == 'subscription-mgmt'].id" -o tsv)
SUBSCRIPTION_ID_HUB=$(az account list --query "[? name == 'subscription-hub'].id" -o tsv)
SUBSCRIPTION_ID_SPOKE_A=$(az account list --query "[? name == 'subscription-spoke-a'].id" -o tsv)
SUBSCRIPTION_ID_SPOKE_B=$(az account list --query "[? name == 'subscription-spoke-b'].id" -o tsv)
1-4. 管理グループの作成
マルチサブスクリプション管理のための管理グループ階層を構築:
bash# 管理グループ作成
az account management-group create --name platform --display-name "Azure Landing Zone Platform"
az account management-group create --name landingzones --display-name "Landing Zones for LOB Applications"

# サブスクリプションの配置
az account management-group subscription add --name platform --subscription ${SUBSCRIPTION_ID_MGMT}
az account management-group subscription add --name platform --subscription ${SUBSCRIPTION_ID_HUB}
az account management-group subscription add --name landingzones --subscription ${SUBSCRIPTION_ID_SPOKE_A}
az account management-group subscription add --name landingzones --subscription ${SUBSCRIPTION_ID_SPOKE_B}
ステップ2: 初期環境セットアップ(Step 01)
2-1. 共用Log Analytics Workspace作成
全サブスクリプション共通の監視基盤を構築:
bash# 管理サブスクリプションに切り替え
az account set -s "${SUBSCRIPTION_NAME_MGMT}"

# Log Analytics Workspace作成
TEMP_LAW_NAME="law-vdc-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"
TEMP_RG_NAME="rg-vdc-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"

az group create --name ${TEMP_RG_NAME} --location ${LOCATION_NAMES[0]}
az monitor log-analytics workspace create --resource-group ${TEMP_RG_NAME} --workspace-name ${TEMP_LAW_NAME}
2-2. アクティビティログの集約設定
全サブスクリプションのアクティビティログを一元管理:
bash# 各サブスクリプション用の診断設定作成
for TEMP_SUBSCRIPTION_ID in $SUBSCRIPTION_IDS; do
    az monitor diagnostic-settings subscription create \
        --subscription ${TEMP_SUBSCRIPTION_ID} \
        --name "toLogAnalyticsWorkspace" \
        --workspace ${TEMP_LAW_ID} \
        --location ${LOCATION_NAMES[0]} \
        --logs '[{"category": "Administrative", "enabled": true}, {"category": "Security", "enabled": true}, {"category": "ServiceHealth", "enabled": true}, {"category": "Alert", "enabled": true}]'
done
ステップ3: 管理サブスクリプション構築(Step 02)
3-1. 運用管理ネットワーク(OpsVNET)作成
bashaz account set -s "${SUBSCRIPTION_NAME_MGMT}"

# 運用管理用VNET作成
TEMP_RG_NAME="rg-ops-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"
TEMP_VNET_NAME="vnet-ops-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"

az group create --name ${TEMP_RG_NAME} --location ${LOCATION_NAMES[0]}
az network vnet create --resource-group ${TEMP_RG_NAME} --name ${TEMP_VNET_NAME} \
    --address-prefixes "${IP_MGMT_PREFIXS[0]}.0.0/16"

# サブネット作成(管理用途別)
az network vnet subnet create --resource-group ${TEMP_RG_NAME} --vnet-name ${TEMP_VNET_NAME} \
    --name "snet-ops" --address-prefixes "${IP_MGMT_PREFIXS[0]}.1.0/24"
az network vnet subnet create --resource-group ${TEMP_RG_NAME} --vnet-name ${TEMP_VNET_NAME} \
    --name "AzureFirewallSubnet" --address-prefixes "${IP_MGMT_PREFIXS[0]}.2.0/24"
3-2. Azure Firewall(運用管理用)作成
bash# Azure Firewall作成
TEMP_FW_NAME="fw-ops-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"
TEMP_FW_PIP_NAME="pip-fw-ops-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"

az network public-ip create --resource-group ${TEMP_RG_NAME} --name ${TEMP_FW_PIP_NAME} \
    --allocation-method static --sku standard

az network firewall create --resource-group ${TEMP_RG_NAME} --name ${TEMP_FW_NAME} \
    --location ${LOCATION_NAMES[0]}
3-3. 運用管理VM作成
bash# Bastion Subnet作成
az network vnet subnet create --resource-group ${TEMP_RG_NAME} --vnet-name ${TEMP_VNET_NAME} \
    --name "AzureBastionSubnet" --address-prefixes "${IP_MGMT_PREFIXS[0]}.3.0/24"

# 運用管理VM作成
TEMP_VM_NAME="vm-ops-${UNIQUE_SUFFIX}"
az vm create --resource-group ${TEMP_RG_NAME} --name ${TEMP_VM_NAME} \
    --image "Win2022Datacenter" --size ${DEFAULT_VM_SIZE} \
    --admin-username ${ADMIN_USERNAME} --admin-password ${ADMIN_PASSWORD} \
    --vnet-name ${TEMP_VNET_NAME} --subnet "snet-ops" \
    --public-ip-address ""
ステップ4: ハブサブスクリプション構築(Step 03)
4-1. Hub VNET作成
bashaz account set -s "${SUBSCRIPTION_NAME_HUB}"

# Hub VNET作成
TEMP_RG_NAME="rg-hub-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"
TEMP_VNET_NAME="vnet-hub-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"

az group create --name ${TEMP_RG_NAME} --location ${LOCATION_NAMES[0]}
az network vnet create --resource-group ${TEMP_RG_NAME} --name ${TEMP_VNET_NAME} \
    --address-prefixes "${IP_HUB_PREFIXS[0]}.0.0/16"

# Azure Firewall Subnet作成
az network vnet subnet create --resource-group ${TEMP_RG_NAME} --vnet-name ${TEMP_VNET_NAME} \
    --name "AzureFirewallSubnet" --address-prefixes "${IP_HUB_PREFIXS[0]}.0.0/24"
4-2. Azure Firewall(本番用)作成
bash# 本番用Azure Firewall作成
TEMP_FW_NAME="fw-hub-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"
TEMP_FW_PIP_NAME="pip-fw-hub-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"

az network public-ip create --resource-group ${TEMP_RG_NAME} --name ${TEMP_FW_PIP_NAME} \
    --allocation-method static --sku standard

az network firewall create --resource-group ${TEMP_RG_NAME} --name ${TEMP_FW_NAME} \
    --location ${LOCATION_NAMES[0]}
ステップ5: 業務サブスクリプション構築(Step 06-10)
5-1. Spoke A(IaaS環境)作成
bashaz account set -s "${SUBSCRIPTION_NAME_SPOKE_A}"

# Spoke A VNET作成
TEMP_RG_NAME="rg-spokea-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"
TEMP_VNET_NAME="vnet-spokea-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"

az network vnet create --resource-group ${TEMP_RG_NAME} --name ${TEMP_VNET_NAME} \
    --address-prefixes "${IP_SPOKE_A_PREFIXS[0]}.0.0/16"

# Hub-Spoke間のVNETピアリング作成
az network vnet peering create \
    --name "peer-spokea-to-hub" \
    --resource-group ${TEMP_RG_NAME} \
    --vnet-name ${TEMP_VNET_NAME} \
    --remote-vnet ${TEMP_HUB_VNET_ID} \
    --allow-vnet-access
5-2. Spoke B(PaaS環境)作成
bashaz account set -s "${SUBSCRIPTION_NAME_SPOKE_B}"

# Spoke B VNET作成(PaaS統合用)
TEMP_RG_NAME="rg-spokeb-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"
TEMP_VNET_NAME="vnet-spokeb-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"

az network vnet create --resource-group ${TEMP_RG_NAME} --name ${TEMP_VNET_NAME} \
    --address-prefixes "${IP_SPOKE_B_PREFIXS[0]}.0.0/16"

# App Service統合用サブネット作成
az network vnet subnet create --resource-group ${TEMP_RG_NAME} --vnet-name ${TEMP_VNET_NAME} \
    --name "snet-app" --address-prefixes "${IP_SPOKE_B_PREFIXS[0]}.1.0/24" \
    --delegations "Microsoft.Web/serverfarms"
ステップ6: セキュリティ・ガバナンス設定(Step 11)
6-1. Azure Policy適用
bash# Microsoft Cloud Security Benchmarkポリシー適用
az policy assignment create \
    --name "Azure Security Benchmark" \
    --display-name "Azure Security Benchmark" \
    --policy-set-definition "/providers/Microsoft.Authorization/policySetDefinitions/1f3afdf9-d0c9-4c3d-847f-89da613e70a8" \
    --scope "/providers/Microsoft.Management/managementGroups/platform"
6-2. Microsoft Defender for Cloud有効化
bash# MDfC有効化(全サブスクリプション)
for TEMP_SUBSCRIPTION_ID in $SUBSCRIPTION_IDS; do
    az security pricing create --name "VirtualMachines" --tier "Standard" --subscription ${TEMP_SUBSCRIPTION_ID}
    az security pricing create --name "SqlServers" --tier "Standard" --subscription ${TEMP_SUBSCRIPTION_ID}
    az security pricing create --name "AppServices" --tier "Standard" --subscription ${TEMP_SUBSCRIPTION_ID}
done
ステップ7: 運用監視設定(Step 12)
7-1. アラートルール作成
bash# アクショングループ作成
az monitor action-group create \
    --resource-group ${TEMP_RG_NAME} \
    --name "ag-ops-${UNIQUE_SUFFIX}" \
    --short-name "OpsAlert" \
    --email-receivers name="Admin" email-address="${ALERT_EMAIL_ADDRESS}"

# リソースヘルスアラート作成
az monitor activity-log alert create \
    --resource-group ${TEMP_RG_NAME} \
    --name "Resource Health Alert" \
    --description "Alert on resource health events" \
    --action-groups "ag-ops-${UNIQUE_SUFFIX}"
重要なセキュリティ設計原則

ゼロトラスト原則:すべての通信がAzure Firewallを経由
権限分掌(SoD):サブスクリプション別の管理者権限分離
多層防御:ネットワーク、アプリケーション、データ層でのセキュリティ
集中監視:すべてのログとメトリクスの一元管理
ガバナンス:Azure PolicyとMDfCによる継続的なコンプライアンス

このステップに従って進めることで、エンタープライズグレードのセキュアなマルチサブスクリプション環境を構築できます。各ステップの詳細な実装については、リポジトリ内の各フォルダの具体的なスクリプトをご参照ください。

レポジトリの内容を参照して、ステップバイステップで作成コマンドを教えてくれていますね。

ちなみにシステムプロンプトやMCP Serverを使わずに回答させると下記回答が返ってくるので、システムプロンプトを活用してMCP Serverを使用して、内容を問い合わせすることで、ある程度レポジトリの内容に基づいて回答してくれている印象はあります。

CleanShot 2025-05-28 at 11.18.12@2x

回答全文
Azureでマルチサブスクリプション環境を構築する際の体系的なアプローチをステップバイステップで説明します。
ステップ1:計画・設計段階
1.1 要件の整理

環境の目的を明確化(開発/テスト/本番、部門別、プロジェクト別など)
必要なサブスクリプション数の決定
コスト配分とガバナンス要件の定義
セキュリティとコンプライアンス要件の確認

1.2 サブスクリプション戦略の決定

環境別分離(Dev/Test/Prod)
部門別分離(マーケティング/開発/財務など)
プロジェクト別分離
ハイブリッドアプローチ

ステップ2:Management Groupの設定
2.1 階層構造の設計
Root Management Group
├── Production
│   ├── Prod-Subscription-1
│   └── Prod-Subscription-2
├── Non-Production
│   ├── Dev-Subscription
│   └── Test-Subscription
└── Sandbox
    └── Sandbox-Subscription
2.2 Management Groupの作成

Azure Portalで「Management groups」にアクセス
階層に従ってManagement Groupを作成
適切な名前付け規則を使用

ステップ3:サブスクリプションの作成・管理
3.1 サブスクリプションの作成

Enterprise Agreement、CSP、またはPay-as-you-goで作成
適切なManagement Groupに配置
統一された命名規則を使用

3.2 サブスクリプションの移動

必要に応じて適切なManagement Groupに移動
依存関係を確認してから実行

ステップ4:RBAC(ロールベースアクセス制御)の設定
4.1 ロール設計

組織の役割に基づいてカスタムロールを定義
最小権限の原則を適用
環境別のアクセス権限を設定

4.2 ロール割り当て
Management Group レベル:
- Global Admin → Owner
- Security Team → Security Admin

Subscription レベル:
- Dev Team → Contributor (Dev環境)
- DevOps Team → Owner (Test環境)
- Operations → Reader (All環境)
ステップ5:Azure Policyの設定
5.1 ポリシーの設計

リソースの場所制限
許可されるリソースタイプ
命名規則の強制
コストコントロール

5.2 ポリシーの適用
json{
  "policyRule": {
    "if": {
      "field": "location",
      "notIn": ["japaneast", "japanwest"]
    },
    "then": {
      "effect": "deny"
    }
  }
}
ステップ6:課金管理の設定
6.1 Cost Managementの設定

各サブスクリプションの予算設定
アラートの構成
コスト配分タグの設定

6.2 課金アカウントの管理

部門別コスト追跡
チャージバック/ショーバックモデルの実装

ステップ7:ガバナンスとモニタリング
7.1 Azure Blueprintsの設定

標準的な環境テンプレートの作成
コンプライアンス要件の自動適用

7.2 モニタリングとログ管理

Azure Monitorの設定
Log Analyticsワークスペースの中央集約
セキュリティログの収集

ステップ8:継続的な管理
8.1 定期的なレビュー

アクセス権限の定期監査
ポリシーコンプライアンスの確認
コスト最適化の実施

8.2 自動化の実装

ARM テンプレートやTerraformによるIaC
CI/CDパイプラインの設定

実装時のベストプラクティス

段階的実装: 小規模から開始して徐々に拡張
文書化: 設計決定と設定を詳細に記録
テスト: 本番適用前に非本番環境でテスト
トレーニング: チームメンバーへの教育実施

特定のステップについてより詳細な説明が必要でしたら、お聞かせください。また、組織の具体的な要件があれば、それに合わせたカスタマイズした推奨事項も提供できます。

ちょっとコマンドが多くわかりづらかったので、SVGで絵も書いてもらいました。
また、この後何をしたらいいかもわからなかったので併せて聞いてみます!

CleanShot 2025-05-28 at 13.06.20@2x

ちょっとカラフルですが、何をやったかのざっとはわかる感じですね。SVGで絵も描けてすごいですね・・・!

CleanShot 2025-05-28 at 10.55.12@2x

今後何を進めていったらいいかは質問が提供されたコマンドを実施してね!といった内容に誤解されてしまいましたね・・・

回答全文
🚀 Azure マルチサブスクリプション環境 セットアップロードマップ
フェーズ1: 事前準備【必須】
この段階を完了しないと後続作業ができません。
✅ やること

Azureサブスクリプション準備

4つのサブスクリプションをテスト用Entra IDテナントに紐付け
サブスクリプション名を変更(subscription-mgmt等)

作業環境準備

WSL2 + Azure CLI環境構築
グローバル管理者権限でログイン

基本設定

環境変数設定(ドメイン名、メールアドレス等)
管理グループ作成
リソースプロバイダ登録

📊 進捗確認方法
bash# サブスクリプション確認
az account list --output table

# 管理グループ確認
az account management-group list --output table

フェーズ2: 監視基盤構築【重要度:高】
全体の運用監視の基盤を最初に構築します。
✅ やること

Log Analytics Workspace作成

管理サブスクリプションに集約監視用LAW作成
全サブスクリプションのアクティビティログ集約設定

Microsoft Defender for Cloud有効化

全サブスクリプションでMDfC有効化
セキュリティ基準設定

🎯 完了目標

すべてのAzure操作がログ記録される状態
セキュリティ状況が可視化される状態

フェーズ3: 管理基盤構築【重要度:高】
運用管理用の環境を構築します。
✅ やること

運用管理ネットワーク構築

Ops VNET作成(10.48.0.0/16)
Azure Firewall(運用管理用)作成
Bastion作成

運用管理VM作成

Windows Server VM作成
必要なツールインストール準備

🎯 完了目標

安全にAzure環境にアクセスできる管理拠点完成

フェーズ4: ハブネットワーク構築【重要度:高】
本番環境の中核となるHub環境を構築します。
✅ やること

Hub VNET構築

Hub VNET作成(10.0.0.0/16)
Azure Firewall(本番用)作成
DNS設定

セキュリティルール設定

Firewall Policy作成
基本的なフィルタリングルール設定

🎯 完了目標

すべての通信を制御できるハブが完成

フェーズ5: 業務環境構築【段階的実施】
実際のワークロードを載せる環境を構築します。
✅ Spoke A (IaaS環境)

ネットワーク構築

Spoke VNET作成(10.1.0.0/16)
Hub-Spokeピアリング設定
ルートテーブル設定

アプリケーション環境

Web サーバーVM作成
Database サーバーVM作成
Load Balancer設定

✅ Spoke B (PaaS環境)

ネットワーク統合

PaaS統合用VNET作成(10.2.0.0/16)
Private Endpoint設定

PaaSサービス

App Service作成
Azure SQL Database作成
Application Gateway + WAF作成

🎯 段階的完了目標

Spoke A完成 → IaaSアプリが動作
Spoke B完成 → PaaSアプリが動作

フェーズ6: セキュリティ・ガバナンス強化【継続的】
セキュリティとコンプライアンスを強化します。
✅ やること

Azure Policy適用

Azure Security Benchmark適用
カスタムポリシー作成
コンプライアンス評価

権限管理強化

カスタムRBACロール作成
Privileged Identity Management設定
権限分掌実装

セキュリティ監視

MDfCスコア100%達成
セキュリティアラート設定

🎯 完了目標

MDfCスコア100%
コンプライアンス100%

フェーズ7: 運用監視完成【最終段階】
運用に必要な監視・アラート体制を完成させます。
✅ やること

アラート設定

リソースヘルスアラート
パフォーマンスアラート
セキュリティアラート

ダッシュボード作成

運用監視ダッシュボード
セキュリティダッシュボード
コスト監視ダッシュボード

🎯 完了目標

24時間監視体制完成
インシデント対応プロセス稼働

📋 推奨セットアップ順序
Week 1-2: 基盤準備

フェーズ1(事前準備)
フェーズ2(監視基盤)
フェーズ3(管理基盤)

Week 3-4: ネットワーク構築

フェーズ4(ハブネットワーク)
フェーズ5-A(Spoke A - IaaS)

Week 5-6: アプリケーション環境

フェーズ5-B(Spoke B - PaaS)
アプリケーションデプロイ・テスト

Week 7-8: セキュリティ・運用

フェーズ6(セキュリティ強化)
フェーズ7(運用監視完成)

🎯 各フェーズの成功指標
フェーズ成功指標確認方法1サブスクリプション4つ準備完了az account list2全ログ集約開始LAWにログ蓄積確認3管理VMアクセス可能Bastion経由接続確認4Hub Firewall稼働通信ログ確認5アプリ動作確認Webアクセステスト6MDfCスコア100%セキュリティセンター確認7アラート受信確認テストアラート実行
各フェーズを確実に完了させてから次に進むことで、安定したマルチサブスクリプション環境を構築できます。どのフェーズから始めたいか、または特定のフェーズで詳細が知りたい部分はありますでしょうか?

再度問い合わせしてみます。
CleanShot 2025-05-28 at 11.46.36@2x
聞き返したら、絵を描いてくれました!

レポジトリの内容に従っていくつかパターンを示してくれていますね。

  • IaaS構築(06-07)
  • PaaS構築(08-10)
  • AI文書検索(41-44)
  • コンテナプラットフォーム(51-56,61-65)

CleanShot 2025-05-28 at 10.56.42@2x
具体的な手順も返ってきました。生成AIの回答はPaaSからどうかってアドバイスしてくれていますね。なんとなくイメージは湧くので概要を掴むのに助かりますね!

回答全文
🚀 推奨:まずPaaS環境から始める理由
初めて実装する場合は、**パターン2(PaaS型Web-DBシステム)**から始めることを強く推奨します:
✅ PaaS環境が最初に適している理由

設定が簡単:VMの詳細設定不要
セキュリティ組み込み済み:Private Endpoint、WAF標準装備
運用負荷が軽い:OS管理、パッチ適用不要
スケーラビリティ:Auto Scaling標準対応
コスト効率:従量課金で無駄がない

📋 実際の作業手順:PaaS環境構築(Step 08-10)
基盤環境完成後、以下の手順でPaaS環境を構築します:
Phase 1: ネットワーク基盤作成
bash# Spoke B サブスクリプションに切り替え
az account set -s "${SUBSCRIPTION_NAME_SPOKE_B}"

# 1. リソースグループ作成
TEMP_RG_NAME="rg-spokeb-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"
az group create --name ${TEMP_RG_NAME} --location ${LOCATION_NAMES[0]}

# 2. Spoke VNET作成
TEMP_VNET_NAME="vnet-spokeb-${UNIQUE_SUFFIX}-${LOCATION_PREFIXS[0]}"
az network vnet create --resource-group ${TEMP_RG_NAME} --name ${TEMP_VNET_NAME} \
    --address-prefixes "${IP_SPOKE_B_PREFIXS[0]}.0.0/16"

# 3. サブネット作成(用途別に分離)
# App Service統合用サブネット
az network vnet subnet create --resource-group ${TEMP_RG_NAME} --vnet-name ${TEMP_VNET_NAME} \
    --name "snet-app" --address-prefixes "${IP_SPOKE_B_PREFIXS[0]}.1.0/24" \
    --delegations "Microsoft.Web/serverFarms"

# Private Endpoint用サブネット
az network vnet subnet create --resource-group ${TEMP_RG_NAME} --vnet-name ${TEMP_VNET_NAME} \
    --name "snet-pe" --address-prefixes "${IP_SPOKE_B_PREFIXS[0]}.2.0/24"

# Application Gateway用サブネット
az network vnet subnet create --resource-group ${TEMP_RG_NAME} --vnet-name ${TEMP_VNET_NAME} \
    --name "snet-agw" --address-prefixes "${IP_SPOKE_B_PREFIXS[0]}.3.0/24"
Phase 2: データベース構築
bash# 4. Azure SQL Database作成
TEMP_SQL_SERVER_NAME="sql-spokeb-${UNIQUE_SUFFIX}"
TEMP_SQL_DB_NAME="pubs"

# SQL Server作成
az sql server create --resource-group ${TEMP_RG_NAME} --name ${TEMP_SQL_SERVER_NAME} \
    --admin-user ${ADMIN_USERNAME} --admin-password ${ADMIN_PASSWORD} \
    --location ${LOCATION_NAMES[0]}

# SQL Database作成
az sql db create --resource-group ${TEMP_RG_NAME} --server ${TEMP_SQL_SERVER_NAME} \
    --name ${TEMP_SQL_DB_NAME} --service-objective S0

# 5. Private Endpoint作成(閉域化)
az network private-endpoint create \
    --resource-group ${TEMP_RG_NAME} \
    --name "pe-sql-spokeb-${UNIQUE_SUFFIX}" \
    --vnet-name ${TEMP_VNET_NAME} \
    --subnet "snet-pe" \
    --private-connection-resource-id "/subscriptions/${SUBSCRIPTION_ID_SPOKE_B}/resourceGroups/${TEMP_RG_NAME}/providers/Microsoft.Sql/servers/${TEMP_SQL_SERVER_NAME}" \
    --group-ids sqlServer \
    --connection-name "sql-connection"
Phase 3: Webアプリケーション構築
bash# 6. App Service Plan作成
TEMP_APP_SERVICE_PLAN_NAME="plan-spokeb-${UNIQUE_SUFFIX}"
az appservice plan create --resource-group ${TEMP_RG_NAME} --name ${TEMP_APP_SERVICE_PLAN_NAME} \
    --sku P1V3 --is-linux

# 7. Web App作成
TEMP_WEB_APP_NAME="app-spokeb-${UNIQUE_SUFFIX}"
az webapp create --resource-group ${TEMP_RG_NAME} --plan ${TEMP_APP_SERVICE_PLAN_NAME} \
    --name ${TEMP_WEB_APP_NAME} --runtime "DOTNETCORE:6.0"

# 8. Web App VNET統合(閉域化)
az webapp vnet-integration add --resource-group ${TEMP_RG_NAME} --name ${TEMP_WEB_APP_NAME} \
    --vnet ${TEMP_VNET_NAME} --subnet "snet-app"

# 9. アクセス制限設定
az webapp config access-restriction add --resource-group ${TEMP_RG_NAME} --name ${TEMP_WEB_APP_NAME} \
    --rule-name "DenyAll" --action Deny --ip-address 0.0.0.0/0 --priority 1000
Phase 4: セキュリティ・監視設定
bash# 10. Application Insights作成
TEMP_APP_INSIGHTS_NAME="appi-spokeb-${UNIQUE_SUFFIX}"
az monitor app-insights component create --resource-group ${TEMP_RG_NAME} \
    --app ${TEMP_APP_INSIGHTS_NAME} --location ${LOCATION_NAMES[0]} \
    --application-type web

# 11. Application Gateway + WAF作成
TEMP_AGW_NAME="agw-spokeb-${UNIQUE_SUFFIX}"
TEMP_AGW_PIP_NAME="pip-agw-spokeb-${UNIQUE_SUFFIX}"

# Public IP作成
az network public-ip create --resource-group ${TEMP_RG_NAME} --name ${TEMP_AGW_PIP_NAME} \
    --allocation-method Static --sku Standard

# Application Gateway作成
az network application-gateway create \
    --resource-group ${TEMP_RG_NAME} \
    --name ${TEMP_AGW_NAME} \
    --location ${LOCATION_NAMES[0]} \
    --vnet-name ${TEMP_VNET_NAME} \
    --subnet "snet-agw" \
    --public-ip-address ${TEMP_AGW_PIP_NAME} \
    --sku WAF_v2 \
    --capacity 2

🎯 各パターンの詳細作業時間目安
パターン構築時間難易度前提知識PaaS環境4-6時間⭐⭐Azure基本知識IaaS環境8-12時間⭐⭐⭐VM管理経験AI文書検索6-8時間⭐⭐⭐⭐AI/ML基礎知識コンテナ12-16時間⭐⭐⭐⭐⭐Kubernetes経験DevCenter4-6時間⭐⭐⭐開発環境管理経験

📝 次のステップ推奨順序
Week 1: PaaS環境構築

✅ Spoke B VNET作成
✅ Azure SQL Database + Private Endpoint
✅ App Service + VNET統合
✅ Application Gateway + WAF

Week 2: IaaS環境構築

✅ Spoke A VNET作成
✅ Web Server VM + DB Server VM
✅ Load Balancer設定
✅ セキュリティ強化

Week 3-4: 拡張システム
お好みで以下から選択:

🤖 AI文書検索システム(最新技術体験)
📦 コンテナプラットフォーム(モダン開発)
🔧 DevCenter環境(開発効率化)

⚡ 今すぐ始められる最小構成
もし「とりあえず動くものを見たい」場合は、以下の最小構成から始めてください:
bash# 最小PaaS構成(30分で完成)
# 1. Spoke B VNET作成
# 2. App Service作成
# 3. Azure SQL Database作成
# 4. 簡単なサンプルアプリデプロイ
どのパターンから始めたいか、または特定のパターンの詳細手順が知りたいものはありますでしょうか?リポジトリの具体的なスクリプトを参照しながら、ステップバイステップでご案内できます!

概要から理解して、実際に使うところまでスムーズに進めていく手助けになりそうでいいですね!!

おわりに

GitHub MCP Serverを実際に使ってみて、ナレッジを検索するのにも便利だな〜としみじみと感じました。

特に今回のような大規模なドキュメント群があるプロジェクトでは、その威力を実感しやすい気がします。目視で確認すると時間がかかるものが、AIと対話して当たりをつけるのに良いなと思いました。

ただし、あくまでツールは手段であり、最終的には「どのような質問をするか」「得られた情報をどう活用するか」、「回答を盲信しない」などといった人間側のスキルもより重要かと思います。GitHub MCP Serverのような強力なツールを活用すればより生産性向上につながるかと思います!

本記事が少しでも参考になれば幸いです!ご覧いただきありがとうございましたー!!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.