個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

Orleans の基本的な構成を App Service にデプロイする(3)App Service の プライベートポート

WebSocket をオンにする

 
サイロのインスタンス同士やサイロとフロントエンド(Oreansクライアント)間で WebSocket 通信を行えるようにするために、WebSocket をオンに設定します。

 

VnetPrivatePortsCount

 
また、今回はサイロは プライベート エンドポイント接続とVNet 統合でパブリックアクセスができないようにしているので、プライベートポートが2個(SiloPort、GatewayPort)必要になります。
 
この値はポータル上からは設定できないので、PowerShell で設定するか Bicep などの IaC で設定する必要があります。
 
VnetPrivatePortsCount のリファレンス
learn.microsoft.com
 
 

VnetPrivatePortsCount を PowerShell で設定

 

$resourceGroupName = '<リソースグループ名>'
$siloServiceName = '<App Service 名>'
$siloWebApp = Get-AzResource -ResourceType Microsoft.Web/sites -ResourceGroupName $resourceGroupName -ResourceName $siloServiceName
$siloWebApp.Properties.siteConfig.vnetPrivatePortsCount=2
$siloWebApp | Set-AzResource -Force

 
今回は
- フロントエンド(orleanspocfrontend)
- サイロ01(orleanspoc01)
- サイロ02(orleanspoc02)
の3つに設定するので、以下のようになります。
 

$resourceGroupName = 'OrleansPoC'

$frontendServiceName = 'orleanspocfrontend'
$frontendWebApp = Get-AzResource -ResourceType Microsoft.Web/sites -ResourceGroupName $resourceGroupName -ResourceName $frontendServiceName
$frontendWebApp.Properties.siteConfig.vnetPrivatePortsCount=2
$frontendWebApp | Set-AzResource -Force

$siloServiceName01 = 'orleanspoc01'
$siloWebApp01 = Get-AzResource -ResourceType Microsoft.Web/sites -ResourceGroupName $resourceGroupName -ResourceName $siloServiceName01
$siloWebApp01.Properties.siteConfig.vnetPrivatePortsCount=2
$siloWebApp01 | Set-AzResource -Force


$siloServiceName02 = 'orleanspoc02'
$siloWebApp02 = Get-AzResource -ResourceType Microsoft.Web/sites -ResourceGroupName $resourceGroupName -ResourceName $siloServiceName02
$siloWebApp02.Properties.siteConfig.vnetPrivatePortsCount=2
$siloWebApp02 | Set-AzResource -Force

 
 

アプリケーションコードで利用する際の注意点

 
設定されたポートは、環境変数WEBSITE_PRIVATE_PORTSで取得できます。なお、このポートはスケールユニット内の他のインスタンスのポート使用状況に応じて動的に設定される(再起動時に変更される)ので、アプリケーションコード内からは必ず環境変数から取得して利用する必要があります。
 

 

// WEBSITE_PRIVATE_PORTS は再起動で変更されるので WEBSITE_PRIVATE_PORTS として取得し Parse すること
var strPorts = context.Configuration["WEBSITE_PRIVATE_PORTS"].Split(',');
if (strPorts.Length < 2)
    throw new Exception("Insufficient private ports configured.");
var (siloPort, gatewayPort) = (int.Parse(strPorts[0]), int.Parse(strPorts[1]));

 
 
次の記事はこちらです。
hiro128.hatenablog.jp