Java アプリケーションから複数のリージョンに対して仮想マシンを作成するCreate virtual machines across multiple regions from your Java applications

このサンプルでは、Azure Management Libraries for Java を使って複数の Azure リージョンに対して同時に仮想マシンを作成します。This sample creates virtual machines in parallel across different Azure regions using the Azure management libraries for Java.

重要

4 つのリージョンに対し、STANDARD_DS3_V2 サイズの Ubuntu 16.04 LTS を実行する合計 48 の VM を作成します。The sample creates a total of 48 VMs running Ubuntu 16.04 LTS of size STANDARD_DS3_V2 across four regions. これらの仮想マシンは、終了前にサンプル コードによって削除されます。The sample code deletes these virtual machines before exiting. このサンプルを既定の VM 数で実行する前に必ず、サービスの制限とクォータをチェックしてください。Make sure to check your service limits and quota before running this sample with the default number of VMs.

サンプルを実行する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-create-virtual-machines-across-regions-in-parallel.git
cd compute-java-create-virtual-machines-across-regions-in-parallel
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.

仮想マシンの場所と数の設定Set locations and counts for the virtual machines

// use a Map to define how where and how many VMs to create 
Map<Region, Integer> virtualMachinesByLocation = new HashMap<Region, Integer>();

// create 12 virtual machines in four regions
virtualMachinesByLocation.put(Region.US_EAST, 12);
virtualMachinesByLocation.put(Region.US_SOUTH_CENTRAL, 12);
virtualMachinesByLocation.put(Region.US_WEST, 12);
virtualMachinesByLocation.put(Region.US_NORTH_CENTRAL, 12);

この Map は、後で各リージョンへの VM の分配を設定するためにサンプルの中で使用します。This Map is used later in the sample to set the distrubtion of the VMs worldwide.

リソース グループの作成Create a resource group

// logically associate the resources in the sample into a randomly named resource group
final String rgName = SdkContext.randomResourceName("rgCOPD", 24);
ResourceGroup resourceGroup = azure.resourceGroups().define(rgName)
                .withRegion(Region.US_EAST)
                .create();

サンプルで使う各リソースは、このリソース グループによって管理されます。Each resource in the sample is managed by this resource group. そのため後でリソース グループを削除すれば、簡単にリソースをクリーンアップすることができます。This makes the resources easy to clean up later by deleting the resource group.

仮想マシンの定義Define the virtual machines

// list to store the VirtualMachine definitions
List<Creatable<VirtualMachine>> creatableVirtualMachines = new ArrayList<>();
    
// outer loop: iterate through each region included in the map
for (Map.Entry<Region, Integer> entry : virtualMachinesByLocation.entrySet()) {
    Region region = entry.getKey();
    Integer vmCount = entry.getValue();

    // Define one virtual network Creatable per region for the VMs to share
    String networkName = SdkContext.randomResourceName("vnetCOPD-", 20);
    Creatable<Network> networkCreatable = azure.networks().define(networkName)
           .withRegion(region)
           .withExistingResourceGroup(resourceGroup)
           .withAddressSpace("172.16.0.0/16");

    // Define one storage account Creatable per region for storing VM disks
    String storageAccountName = SdkContext.randomResourceName("stgcopd", 20);
    Creatable<StorageAccount> storageAccountCreatable = azure.storageAccounts()
        .define(storageAccountName)
              .withRegion(region)
              .withExistingResourceGroup(resourceGroup);

    // generate a common prefix for every VM name
    String linuxVMNamePrefix = SdkContext.randomResourceName("vm-", 15);

    // inner loop: iterate once for every VM instance in the region
    for (int i = 1; i <= vmCount; i++) {

        // Create one public IP address Creatable for each VM
        Creatable<PublicIpAddress> publicIpAddressCreatable = azure.publicIpAddresses()
             .define(String.format("%s-%d", linuxVMNamePrefix, i))
             .withRegion(region)
             .withExistingResourceGroup(resourceGroup)
             .withLeafDomainLabel(SdkContext.randomResourceName("pip", 10));

        publicIpCreatableKeys.add(publicIpAddressCreatable.key());

        // Create one virtual machine Creatable 
        Creatable<VirtualMachine> virtualMachineCreatable = azure.virtualMachines()
             .define(String.format("%s-%d", linuxVMNamePrefix, i))
             .withRegion(region)
             .withExistingResourceGroup(resourceGroup)
             .withNewPrimaryNetwork(networkCreatable)
             .withPrimaryPrivateIpAddressDynamic()
             .withNewPrimaryPublicIpAddress(publicIpAddressCreatable)
             .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_16_04_LTS)
             .withRootUsername(userName)
             .withSsh(sshKey)
             .withSize(VirtualMachineSizeTypes.STANDARD_DS3_V2)
             .withNewStorageAccount(storageAccountCreatable);
        // add the virtual machine Creatable to the list     
        creatableVirtualMachines.add(virtualMachineCreatable); 
     }
}

このコードに記述されている外側の for ループは、各リージョンを反復処理しながら、対応するリージョンのすべての仮想マシンで使用する仮想ネットワークの Creatable とストレージ アカウントの Creatable を定義しています。The outer for loop above iterates through each region, defining a virtual network Creatable and storage account Creatable for use by all virtual machines in that region. 管理ライブラリを使用しているとき、実際に必要になったタイミングでリソースを作成するには、Creatables を使います。詳細については、リンク先のページを参照してください。Learn more about using Creatables to create resources only as needed when using the management libraries.

内側の for ループでは、仮想マシンに使うパブリック IP アドレスの Creatable を取得した後、あらかじめ定義しておいた仮想ネットワーク、ストレージ アカウント、パブリック IP アドレスの Creatable を使って仮想マシンの Creatable を定義しています。The inner for loop gets a public IP address Creatable for the virtual machine and then defines a virtual machine Creatable using the Creatables for the virtual network, storage account, and public IP address defined previously. その後、この VirtualMachine Creatable を creatableVirtualMachines リストに追加します。This VirtualMachine Creatable is then added to the creatableVirtualMachines list.

仮想マシンの作成Create the virtual machines

// create all virtual machines defined in the list, return all Creatable objects used
// including networks, public IP addresses, and storage accounts
CreatedResources<VirtualMachine> virtualMachines = azure.virtualMachines().create(creatableVirtualMachines);

// list the IDs of each virtual machine created 
for (VirtualMachine virtualMachine : virtualMachines.values()) {
    System.out.println(virtualMachine.id());
}

// call createdRelatedResource(key) to get the resources used to define the virtual machines. 
// Save the key at the time you define the Creatable to use CreatedResources like this
for (String publicIpCreatableKey : publicIpCreatableKeys) {
    PublicIPAddress pip = 
         (PublicIPAddress) virtualMachines.createdRelatedResource(publicIpCreatableKey);
}

azure.virtualMachines().create(creatableVirtualMachines) の呼び出しによって、creatableVirtualMachines リストに定義されているすべての仮想マシンが複数のリージョンに対して同時に作成されます。The azure.virtualMachines().create(creatableVirtualMachines) call creates all of the virtual machines defined in the creatableVirtualMachines List in parallel across the regions.

これによって取得した CreatedResources<VirtualMachine> オブジェクトを使用すると、返された VirtualMachine 型だけでなく、create() メソッドの実行時に Azure サブスクリプションに作成されたすべてのリソースにアクセスできます。Use the returned CreatedResources<VirtualMachine> object to access any resources created in the Azure subscription during the the create() method, not just the returned VirtualMachine type. 返された値は、createdRelatedResources() から適切な型にキャストします。Cast the returned value from createdRelatedResources() to the correct type.

Creatable<T>CreatedResources の使い方について詳しくは、ライブラリの概念に関する記事を参照してください。Learn more about working with Creatable<T> and CreatedResources in our library concepts article.

リソース グループを削除しますDelete the resource group

// finally block deletes the resource group before the code exits
// deleting a resource group deletes all resources created in it
finally {
    try {
        System.out.println("Deleting Resource Group: " + rgName);
        azure.resourceGroups().deleteByName(rgName);
        System.out.println("Deleted Resource Group: " + rgName);
    } catch (NullPointerException npe) {
        System.out.println("Did not create any resources in Azure. No clean up is necessary");
    } catch (Exception g) {
        g.printStackTrace();
    }
}

サンプルで作成されたリソースは、その終了前にこのブロックで削除されます。This block deletes resources created in the sample before the sample exits.

サンプルの説明Sample explanation

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

このサンプルでは、仮想マシンがホストされるリージョンごとに、Creatable オブジェクトを使って仮想ネットワークとストレージ アカウントを定義しています。The sample uses Creatable objects to define a virtual network and storage account for each region hosting the virtual machines. その後、それぞれの仮想マシンには、パブリック IP アドレスの Creatable オブジェクトが定義されます。Creatable objects are then defined for the public IP address for each virtual machine. これらの Creatable オブジェクトを使って仮想マシンが定義され、VM の定義が virtualMachineCreatable リストに追加されます。The sample defines the virtual machines using these Creatable objects, and sample adds the VM definition to the virtualMachineCreatable list.

すべての仮想マシンの定義をリストに追加したら、azure.virtualMachines().create(creatableVirtualMachines) で、個々の仮想マシンを Azure に対して同時に作成します。After the code adds every virtual machine definition to the list, azure.virtualMachines().create(creatableVirtualMachines) creates each virtual machine in parallel in Azure.

その後、返された CreatedResources オブジェクトから、作成したすべての仮想マシンの IP アドレスを取得し、それらの仮想マシンに負荷を分散させる Traffic Manager を作成します。The sample code then gets the IP addresses for all of the created virtual machines from the returned CreatedResources object to create a Traffic Manager to distribute load across the virtual machines.

万一エラーが発生した場合でも、finally ブロックで、Azure サブスクリプションからリソースが削除されます。The finally block deletes the resources from your Azure subscription even in the case of an error.

サンプルで使われているクラスClass used in sample メモNotes
VirtualMachineVirtualMachine 仮想マシンのプロパティを照会したり、仮想マシンの状態を管理したりすることができます。Query properties and manage state of virtual machines. azure.virtualMachines().list() からリスト形式で取得するか、azure.virtualMachines().getByResourceGroup() から名前または ID で取得します。Retrieved in list form from azure.virtualMachines().list() or by name or ID azure.virtualMachines().getByResourceGroup()
VirtualMachineSizeTypesVirtualMachineSizeTypes 仮想マシン サイズのオプションに対応する静的な値です。仮想マシンを定義するときに、withSize() に渡すパラメーターとして使用されます。Static values that map to virtual machine size options for use as a parameter to withSize() when defining a virtual machine.
PublicIpAddressPublicIpAddress 仮想マシンごとに azure.publicIpAddresses().define() を使用して定義されます (ただしすぐには作成されません)。Defined, but not immediately created, for each virtual machine through azure.publicIpAddresses().define(). Creatable ごとにキーを保存しておいて、後から createdRelatedResource() で取得します。Store the key for each Creatable and retrieve later through createdRelatedResource()
KnownLinuxVirtualMachineImageKnownLinuxVirtualMachineImage Linux 仮想マシンの一連のオプションです。仮想マシンを定義するときに、withPopularLinuxImage() メソッドに渡すパラメーターとして使用されます。Set of Linux virtual machine options used as a parameter to withPopularLinuxImage() method when defining a virtual machine.
ネットワークNetwork このサンプルでは、各リージョンにつき 1 つの仮想ネットワークを azure.networks().define() で定義しています。The sample defines one virtual network for each region through azure.networks().define() .

次の手順Next steps

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