Freigeben über


新機能: Azure Load Balancer のアイドル タイムアウトが構成可能に

このポストは、8 月 14 日に投稿した New: Configurable Idle Timeout for Azure Load Balancer の翻訳です。

このたび Azure Load Balancer で、Cloud Services と Virtual Machines の TCP アイドル タイムアウトの構成を変更できるようになりました。この構成は、Service Management APIPowerShell、またはサービス モデルを使用して行えます。

概要

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>