Azure 仮想マシン スケール セットを Java アプリケーションから管理するManage Azure virtual machine scale sets from your Java applications

このサンプルでは、Java 管理ライブラリを使って仮想マシン スケール セットを作成します。This sample creates a virtual machine scale set using the Java management libraries.

サンプルを実行するRun the sample

認証ファイルを作成し、そのファイルのコンピューター上における完全なパスを保持する環境変数 AZURE_AUTH_LOCATION を設定します。Create an authentication file and set an environment variable AZURE_AUTH_LOCATION with the full path to the file on your computer. 次に、以下を実行します。Then run:

git clone https://github.com/Azure-Samples/compute-java-manage-virtual-machine-scale-sets.git
cd compute-java-manage-virtual-machine-scale-sets
mvn clean compile exec:java

完全なコード サンプルについては GitHub を参照してください。View the complete code sample on GitHub.

Azure での認証Authenticate with Azure

認証ファイルを作成し、環境変数 AZURE_AUTH_LOCATION と認証ファイルの完全なパスをコマンド ラインでエクスポートします。Create an authentication file and export an environment variable AZURE_AUTH_LOCATION on the command line with the full path to the file.

export AZURE_AUTH_LOCATION=/Users/raisa/azure.auth

Azure リソースを定義、作成、構成するために管理ライブラリで使用されるエントリ ポイント Azure オブジェクトを構成するために、この認証ファイルが使用されます。The authentication file is used to configure the entry point Azure object used by the management libraries to define, create, and configure Azure resources.

// pull in the location of the security file from the environment 
final File credFile = new File(System.getenv("AZURE_AUTH_LOCATION"));

Azure azure = Azure
        .configure()
        .withLogLevel(LogLevel.NONE)
        .authenticate(credFile)
        .withDefaultSubscription();

Azure Management Libraries for Java を使用する際の認証オプションの詳細については、こちらを参照してください。Learn more about authentication options when using the Azure management libraries for Java.

スケール セットに使用する仮想ネットワークの作成Create a virtual network for the scale set

Network network = azure.networks().define(vnetName)
                    .withRegion(region)
                    .withNewResourceGroup(rgName)
                    .withAddressSpace("172.16.0.0/16")
                    .defineSubnet("Front-end")
                    .withAddressPrefix("172.16.1.0/24")
                    .attach()
                    .create();

仮想ネットワークとロード バランサーは、スケール セットの定義を作成する前に設定します。Set up a virtual network and load balancer before creating the scale set definition. スケール セットの初期構成に、これらのリソースが使用されます。The scale set uses these resources for its initial configuration.

スケール セット全体に負荷を分散するためのロード バランサーの作成Create a load balancer to distribute load across the scale set

LoadBalancer loadBalancer1 = azure.loadBalancers().define(loadBalancerName1)
                    .withRegion(region)
                    .withExistingResourceGroup(rgName)
                    // assign a public IP address to the load balancer
                    .definePublicFrontend(frontendName)
                        .withExistingPublicIPAddress(publicIPAddress)
                        .attach()
                    // Add two backend address pools
                    .defineBackend(backendPoolName1)
                        .attach()
                    .defineBackend(backendPoolName2)
                        .attach()
                    // Add two health probes on 80 and 443
                    .defineHttpProbe(httpProbe)
                        .withRequestPath("/")
                        .withPort(80)
                        .attach()
                    .defineHttpProbe(httpsProbe)
                        .withRequestPath("/")
                        .withPort(443)
                        .attach()

                    // balance HTTP and HTTPs traffic
                    .defineLoadBalancingRule(httpLoadBalancingRule)
                        .withProtocol(TransportProtocol.TCP)
                        .withFrontend(frontendName)
                        .withFrontendPort(80)
                        .withProbe(httpProbe)
                        .withBackend(backendPoolName1)
                        .attach()
                    .defineLoadBalancingRule(httpsLoadBalancingRule)
                        .withProtocol(TransportProtocol.TCP)
                        .withFrontend(frontendName)
                        .withFrontendPort(443)
                        .withProbe(httpsProbe)
                        .withBackend(backendPoolName2)
                        .attach()

                    // Add NAT definitions to enable SSH and telnet to the VMs 
                    .defineInboundNatPool(natPool50XXto22)
                        .withProtocol(TransportProtocol.TCP)
                        .withFrontend(frontendName)
                        .withFrontendPortRange(5000, 5099)
                        .withBackendPort(22)
                        .attach()
                    .defineInboundNatPool(natPool60XXto23)
                        .withProtocol(TransportProtocol.TCP)
                        .withFrontend(frontendName)
                        .withFrontendPortRange(6000, 6099)
                        .withBackendPort(23)
                        .attach()
                    .create();

このロード バランサーには、2 つのバックエンド ネットワーク アドレス プールが定義されています。1 つは HTTP の負荷を分散するためのプール (backendPoolName1)、もう 1 つは HTTPS の負荷を分散するためのプール (backendPoolName2) です。The load balancer defines two backend network address pools-one to balance load across HTTP (backendPoolName1) and the other to balance load across HTTPS (backendPoolName2). ロード バランサーには、defineHttpProbe() メソッドによって正常性プローブのエンドポイントを設定します。The defineHttpProbe() methods set up health probe endpoints on the load balancers. スケール セットの仮想マシンのポート 22 とポート 23 は、telnet アクセスと SSH アクセス用に NAT ルールで公開しています。NAT rules expose ports 22 and 23 on the scale set virtual machines for telnet and SSH access.

スケール セットを作成するCreate a scale set

 // Create a virtual machine scale set with three virtual machines
 // And, install Apache Web servers on them
VirtualMachineScaleSet virtualMachineScaleSet = azure.virtualMachineScaleSets()
       .define(vmssName)
                .withRegion(region)
                .withExistingResourceGroup(rgName)
                .withSku(VirtualMachineScaleSetSkuTypes.STANDARD_D3_V2)
                .withExistingPrimaryNetworkSubnet(network, "Front-end")
                .withExistingPrimaryInternetFacingLoadBalancer(loadBalancer1)
                .withPrimaryInternetFacingLoadBalancerBackends(backendPoolName1, backendPoolName2)
                .withPrimaryInternetFacingLoadBalancerInboundNatPools(natPool50XXto22, natPool60XXto23)
                .withoutPrimaryInternalLoadBalancer()
                .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_16_04_LTS)
                .withRootUsername(userName)
                .withSsh(sshKey)
                .withNewDataDisk(100)
                .withNewDataDisk(100, 1, CachingTypes.READ_WRITE)
                .withNewDataDisk(100, 2, 
                     CachingTypes.READ_WRITE, StorageAccountTypes.STANDARD_LRS)
                .withCapacity(3)
                // Use a VM extension to install Apache Web servers
                .defineNewExtension("CustomScriptForLinux")
                    .withPublisher("Microsoft.OSTCExtensions")
                    .withType("CustomScriptForLinux")
                    .withVersion("1.4")
                    .withMinorVersionAutoUpgrade()
                    .withPublicSetting("fileUris", fileUris)
                    .withPublicSetting("commandToExecute", installCommand)
                    .attach()
                .create();

前の手順で作成した仮想ネットワークの定義とロード バランサーの定義を使用して、それぞれ 3 つの Linux インスタンス (withCapacity(3)) と 3 つの 100 GB データ ディスクから成るスケール セットを作成します。Use the virtual network definition and load balancer definitions created in the previous step to create a scale set with three Linux instances (withCapacity(3)) and three 100GB data disks each. それぞれの VM には、defineNewExtension() メソッド チェーンによって Apache Web サーバーがインストールされます。The defineNewExtension() method chain installs the Apache web server on each VM.

仮想マシン スケール セットに存在するネットワーク インターフェイスの列挙List virtual machine scale set network interfaces

// List network interfaces on the scale set and iterate through them
PagedList<VirtualMachineScaleSetNetworkInterface> vmssNics = 
     virtualMachineScaleSet.listNetworkInterfaces();
for (VirtualMachineScaleSetNetworkInterface vmssNic : vmssNics) {
    System.out.println(vmssNic.id());
}

各スケール セット仮想マシンの SSH 接続文字列の取得Get SSH connection strings for each scale set virtual machine

for (VirtualMachineScaleSetVM instance : virtualMachineScaleSet.virtualMachines().list()) {
    System.out.println("Scale set virtual machine instance #" + instance.instanceId());
    System.out.println(instance.id());
    PagedList<VirtualMachineScaleSetNetworkInterface> networkInterfaces = 
         instance.listNetworkInterfaces();
    // Pick the first NIC on the instance and use its primary IP address
    VirtualMachineScaleSetNetworkInterface networkInterface = networkInterfaces.get(0);
    for (VirtualMachineScaleSetNicIPConfiguration ipConfig : networkInterface.ipConfigurations().values()) {
        if (ipConfig.isPrimary()) {
            List<LoadBalancerInboundNatRule> natRules = ipConfig.listAssociatedLoadBalancerInboundNatRules();
            for (LoadBalancerInboundNatRule natRule : natRules) {
                // find rule matching the inbound SSH port on the backend for the IP address
                // and return the SSH connection string to that port on the load balancer
                if (natRule.backendPort() == 22) {
                    System.out.println("SSH connection string: " + userName + 
                        "@" + publicIPAddress.fqdn() + ":" + natRule.frontendPort());
                break;
                }
            }
            break;
        }
    }
}

仮想マシンの SSH ポート (22) と telnet ポート (23) は、先に作成しておいた NAT プールによってロード バランサー上のポートにマップされます。The NAT pool created earlier mapped the SSH and telnet ports (22 and 23, respectively) on the virtual machines to ports on the load balancer. このコードによって、各仮想マシンの SSH 接続文字列が作成されます。This code builds the SSH connection string for each virtual machine.

仮想マシン スケール セットの停止Stop the virtual machine scale set

// stop (not deallocate) all scale set instances
virtualMachineScaleSet.powerOff();

仮想マシンに予約されたリソースは、その仮想マシンを停止しても消費され続けます。Stopped virtual machines continue to consume reserved resources. 仮想マシン上のオペレーティング システムを deallocate() で停止して、コンピューティング リソースを解放してください。Use deallocate() to stop the operating system on the virtual machines and release their compute resources.

仮想マシン スケール セットの割り当て解除Deallocate the virtual machine scale set

// deallocate the virtual machine scale set
virtualMachineScaleSet.deallocate();

Deallocate() を実行すると、仮想マシン上のオペレーティング システムがシャットダウンされ、スケール セット インスタンスで使用されているコンピューティング リソースとネットワーク リソース (IP アドレスなど) が解放されます。Deallocate() shuts down the operating system on the virtual machines and frees up the compute and network resources (such as IP addresses) used by the scale set instances. その後も、仮想マシンにアタッチされているすべてのディスク (OS も含む) のストレージ料金が課金されます。You continue to accrue storage charges for any disks (including the OS) attached to the virtual machines.

仮想マシン スケール セットの起動Start a virtual machine scale set

// start a deallocated or stopped virtual machine scale set
virtualMachineScaleSet.start();

スケール セットに含まれる仮想マシンのインスタンス数の更新Update the number of virtual machines instances in the scale set

// increase the number of virtual machine scale set instances from three to six
virtualMachineScaleSet.update()
                    .withCapacity(6)
                    .apply();

スケール セットに含まれる仮想マシンの数をスケーリングするには withCapacity() を使用します。また、それぞれの仮想マシンのキャパシティをスケーリングするには、withSku() を使用します。Scale the number of virtual machines in the scale set using withCapacity() and scale the capacity of each virtual machine using withSku().

サンプルの説明Sample explanation

このサンプル コードではまず、スケール セットの仮想マシン間の通信に使用する仮想ネットワークを作成し、トラフィックを仮想マシン間で分散するためのロード バランサーを作成します。The sample code first creates a virtual network for the scale set to communicate across and a load balancer to distribute traffic across the virtual machines. Apache Web サーバーを実行する 3 つの Linux インスタンスから成るスケール セットが、azure.virtualMachineScaleSets().define()...create() メソッド チェーンによって作成されます。The azure.virtualMachineScaleSets().define()...create() method chain creates the scale set with three Linux instances running the Apache web server.

サンプルで使われているクラスClass used in sample メモNotes
VirtualMachineScaleSetVirtualMachineScaleSet スケール セットに含まれるすべての仮想マシンを対象に、照会、起動、停止、更新、削除を実行します。Query, start, stop, update and delete all virtual machines in the scale set.
VirtualMachineScaleSetVMVirtualMachineScaleSetVM virtualMachineScaleSet.virtualMachines().get() または list() から取得して、スケール セットの仮想マシンを対象に、照会、起動、停止、構成、削除を実行できます。Retrieved from virtualMachineScaleSet.virtualMachines().get() or list(), allows you to query, start, stop, configure and delete virtual machines in the scale set.
VirtualMachineScaleSetNetworkInterfaceVirtualMachineScaleSetNetworkInterface スケール セットに含まれる仮想マシンの読み取り専用のネットワーク インターフェイスを表します。virtualMachineScaleSet.listNetworkInterfaces() から返されます。Returned from virtualMachineScaleSet.listNetworkInterfaces(), read-only representation of a network interface on a virtual machine in a scale set.
VirtualMachineScaleSetSkuTypesVirtualMachineScaleSetSkuTypes スケール セットのメンバーが利用できるリソースの量を定義する仮想マシン スケール セットのレベルを設定するための静的フィールドのクラスです。Class of static fields used to set the virtual machine scale set tier used to define how much resources scale set members can consume.
VirtualMachineScaleSetNicIpConfigurationVirtualMachineScaleSetNicIpConfiguration スケール セットの仮想マシン上のネットワーク インターフェイスに関連付けられている IP 構成を照会する際に使用します。Used to query the IP configuration associated with a network interface on a scale set virtual machine.

次の手順Next steps

Azure での Java アプリの作成とデプロイの詳細については、Java デベロッパー センターを参照してください。For more information on creating and deploying Java apps on Azure, visit the Java developer center.