Azureサービスエンドポイントの使い方を徹底解説!PaaSへのセキュアアクセスを構築する方法
生徒
「Azureの仮想ネットワーク内から、Storage(ストレージ)やSQL Database(エスキューエル データベース)などのPaaS(パース)サービスに安全に接続したいのですが、インターネットを経由させない方法はありますか?」
先生
「それなら『Azureサービスエンドポイント(Azure Service Endpoints)』という機能がぴったりです。これを使えば、仮想ネットワークのプライベートな通信ルートを維持したまま、特定のサービスへセキュアにアクセスできるようになりますよ。」
生徒
「インターネットを通らないなら安心ですね!具体的にどうやって設定して、どんな仕組みで動くのか詳しく教えてください!」
先生
「もちろんです。初心者の方でも分かりやすいように、メリットや設定手順、コマンド例を交えて解説していきますね!」
1. Azureサービスエンドポイントとは?
Azure(アジュール)サービスエンドポイントは、Azure Virtual Network(仮想ネットワーク、通称VNet:ブイネット)内のプライベートなIPアドレス空間を、Azureの各種PaaSサービス(Azure StorageやAzure SQL Databaseなど)まで拡張する機能です。通常、PaaSサービスにはパブリックなエンドポイント経由でアクセスしますが、サービスエンドポイントを利用することで、通信をMicrosoft(マイクロソフト)のバックボーンネットワーク内に閉じ込めることができます。
この技術の歴史を遡ると、クラウド利用が広まるにつれ、企業はセキュリティ上の懸念から「インターネットを経由せずにクラウドサービスを使いたい」という強い要望を持っていました。それに応える形で登場したのが、このサービスエンドポイントです。仮想ネットワーク内のサブネット単位で有効化でき、ルーティング構成を複雑にすることなく、セキュリティの向上とネットワークパフォーマンスの最適化を同時に実現できるのが特徴です。
2. サービスエンドポイントの仕組みとメリット
サービスエンドポイントを有効にすると、VNet(ブイネット)内の仮想マシン(VM)から対象のPaaSサービスへのトラフィックが、インターネットを一切通らず、Azureの内部ネットワークを経由するようになります。これにより、パブリックIPアドレスを使用したアクセスを拒否し、特定の仮想ネットワークからの通信のみを許可する「ファイアウォール」の設定が可能になります。
主なメリットは以下の通りです。
- セキュリティの強化:PaaS側のネットワークセキュリティ規則で、特定のサブネットからの通信のみに限定できるため、不正アクセスのリスクを大幅に低減できます。
- パフォーマンスの最適化:インターネットを介さないため、ホップ数が減り、より低遅延で安定した通信が期待できます。
- 設定の簡素化:複雑なNAT(ナット:ネットワークアドレス変換)デバイスやゲートウェイを構築する必要がなく、Azureポータルから数クリックで設定が完了します。
3. サービスエンドポイントとプライベートリンクの違い
よく混同される概念に「Azure Private Link(プライベートリンク)」があります。両者の最大の違いは「IPアドレス」の扱いです。サービスエンドポイントは、ターゲットとなるPaaSサービスのパブリックIPアドレスをそのまま利用しますが、ルーティングを内部的に切り替えます。一方、プライベートリンクは、PaaSサービスに対してVNet内のプライベートなIPアドレスを直接割り当てる仕組みです。サービスエンドポイントの方が導入コストが低く、手軽に始められるという利点があります。
4. Azure CLIを使用したサービスエンドポイントの有効化
まずは、実際の構築現場でよく使われるコマンドライン(Linuxコマンド形式)での設定方法を見ていきましょう。特定のサブネットに対して、Azure Storage(ストレージ)へのサービスエンドポイントを追加する例です。
az network vnet subnet update --resource-group MyResourceGroup --vnet-name MyVNet --name MySubnet --service-endpoints Microsoft.Storage
{
"addressPrefix": "10.0.1.0/24",
"id": "/subscriptions/.../subnets/MySubnet",
"name": "MySubnet",
"resourceGroup": "MyResourceGroup",
"serviceEndpoints": [
{
"provisioningState": "Succeeded",
"service": "Microsoft.Storage"
}
]
}
このコマンドを実行することで、指定したサブネット内のリソースがストレージサービスへの直通ルートを持つようになります。実行結果として、serviceEndpointsの項目に設定したサービスが表示されていれば成功です。
5. Pythonスクリプトによるストレージ接続の自動化例
サービスエンドポイントを設定した後は、実際にプログラムから安全にアクセスを確認します。ここでは、Python(パイソン)のSDKを使用して、Blob(ブロブ)コンテナー内のファイル一覧を取得するシンプルなコード例を紹介します。内部ネットワーク経由でのセキュアなアクセスを想定しています。
from azure.storage.blob import BlobServiceClient
connection_string = "DefaultEndpointsProtocol=https;AccountName=mystorage;AccountKey=xxx;EndpointSuffix=core.windows.net"
blob_service_client = BlobServiceClient.from_connection_string(connection_string)
try:
container_client = blob_service_client.get_container_client("mycontainer")
blobs = container_client.list_blobs()
for blob in blobs:
print(f"ファイル名: {blob.name}")
except Exception as e:
print(f"エラーが発生しました: {e}")
実行結果のイメージは以下の通りです。
ファイル名: profile.png
ファイル名: report.pdf
ファイル名: config.json
6. SQL Databaseへのアクセス制御とSQLクエリの実行
サービスエンドポイントはデータベース(SQL Database)にも有効です。VNetからのアクセスのみを許可するようにデータベース側を設定した後、C#(シーシャープ)を使ってデータを操作する例を見てみましょう。あらかじめ、以下のようなユーザー管理テーブルがデータベース内に存在すると仮定します。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
5 | 田中三郎 | 28 | saburo@example.com
次に、C#から年齢が20歳以上のユーザーを抽出するコードを作成します。サービスエンドポイントにより、この通信は仮想ネットワーク外へ漏れることはありません。
using System;
using Microsoft.Data.SqlClient;
string connString = "Server=tcp:myserver.database.windows.net,1433;Initial Catalog=myDB;User ID=user;Password=pass;";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
string sql = "SELECT id, name FROM users WHERE age >= 20";
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine($"ID: {reader["id"]}, Name: {reader["name"]}");
}
}
}
}
実行結果は以下のようになります。
ID: 1, Name: 山田太郎
ID: 3, Name: 鈴木一郎
ID: 4, Name: 高橋次郎
ID: 5, Name: 田中三郎
7. セキュリティ規則の適用状況をSQLで確認する
Azure SQL Databaseでは、ファイアウォール規則や仮想ネットワーク規則の設定状況をシステムビューから確認できます。設定が正しく反映され、自分のVNetが許可リストに入っているかを調査するSQLコマンドです。
SELECT name, virtual_network_subnet_id, state
FROM sys.virtual_network_rules;
実行前の確認(空の状態):
name | virtual_network_subnet_id | state
-----+---------------------------+-------
実行後の確認(設定済み):
name | virtual_network_subnet_id | state
----------+---------------------------+-------
vnet-rule | /subscriptions/.../my-vnet | Ready
8. 導入時の注意点とトラブルシューティング
非常に便利なサービスエンドポイントですが、導入にあたっていくつか注意すべきポイントがあります。まず、エンドポイントを有効にしただけでは、PaaS側でのアクセス制限は完了しません。必ずPaaSサービス側の「ファイアウォールと仮想ネットワーク」の設定画面で、対象のサブネットを追加してください。
また、オンプレミス環境からExpressRoute(エクスプレスルート)やVPN(ブイピーエヌ)経由でPaaSにアクセスする場合、サービスエンドポイントはそのままでは利用できません。この場合は、前述したPrivate Link(プライベートリンク)を検討する必要があります。通信がうまくいかない場合は、NSG(ネットワークセキュリティグループ)の送信規則を確認し、サービスへの通信が拒否されていないかをチェックしましょう。特に、デフォルトの「Internet」への送信許可を削除している場合は、個別にサービスタグ(Service Tags)を許可する設定が必要です。
まとめ
ここまで、Azureサービスエンドポイントの基本概念から具体的な設定方法、プログラムを用いた接続例まで詳しく解説してきました。Azureサービスエンドポイントは、Microsoft Azure(マイクロソフト アジュール)が提供するネットワークセキュリティ機能の要であり、Virtual Network(仮想ネットワーク)内のプライベートな通信を維持したまま、各種PaaS(パース)リソースへのセキュアなアクセスを可能にします。インターネットという公共の道を一切通らず、Azureの堅牢なバックボーンネットワークを経由することで、データの機密性を保ちながら高いパフォーマンスを享受できるのが最大の魅力です。
本記事を通じて、以下の重要なポイントを再確認しましょう。まず、サービスエンドポイントはサブネット単位で設定するものであり、設定によって仮想マシンのトラフィックが自動的に最適化されます。次に、Azure Private Link(アジュール プライベートリンク)との違いを理解し、コストや運用負荷のバランスを考えて適切なソリューションを選択することが重要です。さらに、Azure CLI(アジュール コマンドラインインターフェース)やPython(パイソン)、C#(シーシャープ)などのプログラミング言語を用いた自動化やアプリケーションの実装方法についても触れました。
特にセキュリティ面では、PaaS側のファイアウォール設定と組み合わせることで、「特定の仮想ネットワーク以外からのアクセスを一切拒否する」という強力なガードレールを構築できます。これは、企業のコンプライアンス遵守や情報漏洩対策において不可欠なステップです。また、SQL Database(エスキューエル データベース)の管理において、SQLクエリを用いて設定状況をシステムビューから確認する手法も紹介しました。
実践的なコードの振り返り
最後に、まとめとしてC#を用いたデータベース操作の応用例を掲載します。サービスエンドポイント経由で安全に接続された環境下で、特定の条件に基づいたデータの更新処理を行うコードです。
using System;
using Microsoft.Data.SqlClient;
namespace AzureEndpointDemo
{
class Program
{
static void Main(string[] args)
{
string connString = "Server=tcp:myserver.database.windows.net,1433;Initial Catalog=myDB;User ID=user;Password=pass;";
using (SqlConnection conn = new SqlConnection(connString))
{
try
{
conn.Open();
// 特定のIDのユーザー情報を更新するSQL
string updateSql = "UPDATE users SET age = age + 1 WHERE id = @id";
using (SqlCommand cmd = new SqlCommand(updateSql, conn))
{
cmd.Parameters.AddWithValue("@id", 1);
int rows = cmd.ExecuteNonQuery();
Console.WriteLine($"{rows} 件のレコードを更新しました。");
}
}
catch (Exception ex)
{
Console.WriteLine($"エラー発生: {ex.Message}");
}
}
}
}
}
このコードが実行される際、通信はAzureの内部ネットワークを通るため、外部からの傍受のリスクを最小限に抑えられます。実行結果は以下のようになります。
1 件のレコードを更新しました。
Azureサービスエンドポイントを活用することで、インフラ構成を複雑にすることなく、クラウドネイティブなセキュリティ設計を実現できます。これからAzureを本格的に運用する方や、既存システムのセキュリティを強化したいエンジニアにとって、この機能の習得は非常に価値のあるものとなるでしょう。常に最新のドキュメントを参照し、最適なネットワーク構成を追求し続けてください。
生徒
「先生、ありがとうございました!Azureサービスエンドポイントを使えば、インターネットに出ることなくStorageやSQL Databaseにアクセスできる仕組みがよく分かりました。特に、サブネットの設定を変えるだけでルートが切り替わるのは驚きです。」
先生
「その通りです。シンプルでありながら強力な機能ですよね。設定後、ちゃんとPaaS側のファイアウォールで『仮想ネットワークの許可』を追加するのを忘れないようにしてくださいね。これを忘れると、せっかくのエンドポイントも効果を発揮しませんから。」
生徒
「はい、そこが重要ですね。さっき教えてもらったSQLクエリで設定を確認する方法も実践してみます。あと、Private Linkとの使い分けも意識してみます。小規模やコストを抑えたいときはサービスエンドポイントが有利なんですよね?」
先生
「鋭いですね。サービスエンドポイントは追加費用がかからないので、まずはここから始めるのが定石です。ただ、オンプレミスとの連携が複雑になる場合はPrivate Linkを検討する、という使い分けが実務では一般的ですよ。実際のプロジェクトでも、この知識を活かしてセキュアな環境を構築してください!」
生徒
「よく分かりました!コードの書き方も含めて復習して、自信を持ってAzureのネットワーク設計ができるよう頑張ります!」