新機能: Azure Load Balancer のアイドル タイムアウトが構成可能に
このポストは、8 月 14 日に投稿した New: Configurable Idle Timeout for Azure Load Balancer の翻訳です。
このたび Azure Load Balancer で、Cloud Services と Virtual Machines の TCP アイドル タイムアウトの構成を変更できるようになりました。この構成は、Service Management API、PowerShell、またはサービス モデルを使用して行えます。
概要
Azure Load Balancer の既定では、アイドル タイムアウトが 4 分に設定されています。
つまり、確立した TCP セッションまたは HTTP セッションを一定時間操作せず、タイムアウトの設定値を超えた場合、クライアントとサービス間の接続の維持は保証されません。
接続が解除されると、「基になる接続が閉じられました: 維持される必要があった接続が、サーバーによって切断されました」というエラー メッセージが、クライアント アプリケーションに表示されます。
接続をアクティブに維持する時間を延ばすには、TCP キープアライブ (英語) を使用するのが一般的です。.NET の例をこちら (機械翻訳) からご覧いただけます。この手法では、接続のアクティビティがなくなったことを検知すると、パケットが送信されます。こうして継続的なネットワーク アクティビティを維持することで、アイドル タイムアウトを回避して接続を長時間維持します。
TCP キープアライブはバッテリの制約がないシナリオでは有効ですが、通常、モバイル アプリケーションには適しません。モバイル アプリケーションから TCP キープアライブを使用すると、デバイスのバッテリの消耗を速める可能性が高くなります。
こうしたシナリオをサポートするために追加されたのが、構成可能なアイドル タイムアウトです。これにより、タイムアウトを 4 ~ 30 分に設定できるようになりました。この設定は、受信側の接続のみに適用されます。
シナリオ
Virtual Machines 上のエンドポイントに、PowerShell または Service Management API 経由で TCP タイムアウトを構成
負荷分散されたエンドポイント セットに、PowerShell または Service Management API 経由で TCP タイムアウトを構成
インスタンスレベルのパブリック IP に TCP タイムアウトを構成
Web/Worker ロールにサービス モデル経由で TCP タイムアウトを構成
PowerShell の例
必ず最新の Azure PowerShell (英語) をダウンロードしてインストールしてください。
インスタンスレベルのパブリック IP の TCP タイムアウトを 15 分に構成する
Set-AzurePublicIP –PublicIPName webip –VM MyVM -IdleTimeoutInMinutes 15
IdleTimeoutInMinutes はオプションです。設定しない場合、既定のタイムアウトは 4 分になります。この値は、4 ~ 30 分の間で設定できるようになりました。
Virtual Machines 上で Azure エンドポイントを作成する際にアイドル タイムアウトを設定する
Get-AzureVM -ServiceName "mySvc" -Name "MyVM1" | Add-AzureEndpoint -Name "HttpIn" -Protocol "tcp" -PublicPort 80 -LocalPort 8080 -IdleTimeoutInMinutes 15| Update-AzureVM
アイドル タイムアウトの構成を取得する
PS C:\> Get-AzureVM –ServiceName “MyService” –Name “MyVM” | Get-AzureEndpoint
VERBOSE: 6:43:50 PM - Completed Operation: Get Deployment
LBSetName : MyLoadBalancedSet
LocalPort : 80
Name : HTTP
Port : 80
Protocol : tcp
Vip : 65.52.xxx.xxx
ProbePath :
ProbePort : 80
ProbeProtocol : tcp
ProbeIntervalInSeconds : 15
ProbeTimeoutInSeconds : 31
EnableDirectServerReturn : False
Acl : {}
InternalLoadBalancerName :
IdleTimeoutInMinutes : 15
負荷分散されたエンドポイント セットに TCP タイムアウトを設定する
負荷分散されたエンドポイント セット内のエンドポイントの場合は、負荷分散されたエンドポイント セットに対して TCP タイムアウトを設定する必要があります。
Set-AzureLoadBalancedEndpoint -ServiceName "MyService" -LBSetName "LBSet1" -Protocol tcp -LocalPort 80 -ProbeProtocolTCP -ProbePort 8080 -IdleTimeoutInMinutes 15
Cloud Services の例
Azure SDK for .NET 2.4 を利用すると、使用中の Cloud Services を更新できます。
Cloud Services のエンドポイント設定は、.csdef ファイルで定義します。そのため、Cloud Services 環境の TCP タイムアウトを更新するには、デプロイメントの更新が必要になります。ただし、パブリック IP に対する TCP タイムアウトのみを指定する場合は除きます。パブリック IP の設定は .cscfg ファイルで定義され、デプロイメントの更新およびアップグレードによって更新できます。
エンドポイント設定に関しては、.csdef を次のように変更します。
<WorkerRole name="worker-role-name" vmsize="worker-role-size" enableNativeCodeExecution="[true|false]">
<Endpoints>
<InputEndpoint name="input-endpoint-name" protocol="[http|https|tcp|udp]" localPort="local-port-number" port="port-number" certificate="certificate-name" loadBalancerProbe="load-balancer-probe-name" idleTimeoutInMinutes="tcp-timeout" />
</Endpoints>
</WorkerRole> <!-- パブリック IP のタイムアウト設定については、.cscfg を次のように変更します。 -->
<NetworkConfiguration>
<VirtualNetworkSite name="VNet"/>
<AddressAssignments>
<InstanceAddress roleName="VMRolePersisted">
<PublicIPs>
<PublicIP name="public-ip-name" idleTimeoutInMinutes="timeout-in-minutes"/>
</PublicIPs>
</InstanceAddress>
</AddressAssignments>
</NetworkConfiguration>
API の例
TCP アイドル タイムアウトの構成は、Service Management API からも行えます。
必ず x-ms-version ヘッダーを追加し、バージョンを 2014-06-01 以降に設定してください。
デプロイメント内の全 Virtual Machines 上で、特定の負荷分散された入力エンドポイントの構成を更新する
要求
POST https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deployments/<deployment-name>
応答
<LoadBalancedEndpointList xmlns="https://schemas.microsoft.com/windowsazure" xmlns:i="https://www.w3.org/2001/XMLSchema-instance">
<InputEndpoint>
<LoadBalancedEndpointSetName>endpoint-set-name</LoadBalancedEndpointSetName>
<LocalPort>local-port-number</LocalPort>
<Port>external-port-number</Port>
<LoadBalancerProbe>
<Path>path-of-probe</Path>
<Port>port-assigned-to-probe</Port>
<Protocol>probe-protocol</Protocol>
<IntervalInSeconds>interval-of-probe</IntervalInSeconds>
<TimeoutInSeconds>timeout-for-probe</TimeoutInSeconds>
</LoadBalancerProbe>
<LoadBalancerName>name-of-internal-loadbalancer</LoadBalancerName>
<Protocol>endpoint-protocol</Protocol>
<IdleTimeoutInMinutes>15</IdleTimeoutInMinutes>
<EnableDirectServerReturn>enable-direct-server-return</EnableDirectServerReturn>
<EndpointACL>
<Rules>
<Rule>
<Order>priority-of-the-rule</Order>
<Action>permit-rule</Action>
<RemoteSubnet>subnet-of-the-rule</RemoteSubnet>
<Description>description-of-the-rule</Description>
</Rule>
</Rules>
</EndpointACL>
</InputEndpoint>
</LoadBalancedEndpointList>