Azure SDK for JavaでAzure Container Instanceを操作する

ちょっと機会があってJavaでAzure Container Instanceを操作する実装方法について調査する機会がありました。備忘録としても記しておきます。

SDK

AzureにはSDKが用意されており、プログラミング言語で各サービスを操作することが可能です。用意されているSDKは以下のページに記されています。

azure.microsoft.com

簡単な使い方については、以前ブログも書いていたようです(これを書く上で検索してはじめて思い出しました)。

miyohide.hatenablog.com

今回は、Azure Container Instanceを操作するためには、以下の記述をbuild.gradleに記述しました。

dependencies {
    implementation 'com.azure.resourcemanager:azure-resourcemanager-containerinstance:2.17.0'
    implementation 'com.azure.resourcemanager:azure-resourcemanager:2.17.0'
    implementation 'com.azure:azure-identity:1.5.3'
}

サンプル

SDKAPIを色々と観てもいいんですが、コードサンプルがMicrosoftから公開されているのでそれを参考にします。コードサンプルは、以下のページから検索して探してみます。

docs.microsoft.com

今回は以下のサンプルが見つかったので、このサンプルをもとに実装します。

github.com

実装

実装自体はそんなに難しいものではなく、サンプルを横目に実装できます。細かいメソッドとして、Utils.javaが公開されているのでここから必要なメソッドを抜き出すと便利かなと思います。

github.com

今回は、以下のようなクラスを作り...

package com.github.miyohide;

import com.azure.core.management.Region;
import com.azure.resourcemanager.AzureResourceManager;
import com.azure.resourcemanager.containerinstance.models.ContainerGroup;
import com.azure.resourcemanager.containerinstance.models.ContainerGroupRestartPolicy;
import com.azure.resourcemanager.resources.fluentcore.utils.ResourceManagerUtils;

import java.time.Duration;

public class ContainerInstanceService {
    private String resourceGroupName;
    private Region region;
    private String containerImage;
    private String aciName;

    public ContainerInstanceService(String resourceGroupName, Region region, String containerImage, String aciName) {
        this.resourceGroupName = resourceGroupName;
        this.region = region;
        this.containerImage = containerImage;
        this.aciName = aciName;
    }

    public boolean runContainerInstance(AzureResourceManager azureResourceManager) {
        ContainerGroup containerGroup = azureResourceManager.containerGroups().define(aciName)
                .withRegion(this.region)
                .withNewResourceGroup(this.resourceGroupName)
                .withLinux()
                .withPublicImageRegistryOnly()
                .withoutVolume()
                .defineContainerInstance(aciName)
                .withImage(this.containerImage)
                .withExternalTcpPort(80)
                .attach()
                .withRestartPolicy(ContainerGroupRestartPolicy.NEVER)
                .withDnsPrefix(aciName)
                .create();

        // 起動中
        System.out.println("起動中 ..." + containerGroup.ipAddress());
        Utils.sendGetRequest("http://" + containerGroup.ipAddress());
        ResourceManagerUtils.sleep(Duration.ofSeconds(15));
        System.out.println("CURLing " + containerGroup.ipAddress());
        System.out.println(Utils.sendGetRequest("http://" + containerGroup.ipAddress()));

        return true;
    }
}

上記のクラス・メソッドを以下のように呼び出します。

public class Main {
    public static void main(String[] args) {
        AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);
        TokenCredential credential = new DefaultAzureCredentialBuilder()
                .authorityHost(profile.getEnvironment().getActiveDirectoryEndpoint())
                .build();
        AzureResourceManager azure = AzureResourceManager
                .authenticate(credential, profile)
                .withDefaultSubscription();
        ContainerInstanceService containerInstanceService
                = new ContainerInstanceService(
                        Utils.randomResourceName(azure, "rgaci", 15),
                Region.JAPAN_EAST,
                "mcr.microsoft.com/azuredocs/aci-helloworld",
                Utils.randomResourceName(azure, "acisample", 20));

        containerInstanceService.runContainerInstance(azure);
    }
}

詳細は末尾のソースを参照してください。

実行

実行すると、ランダムなリソースグループ名とコンテナインスタンス名でAzure Container Instanceがつくられます。

Azure Container Instanceの概要ページ

今回はMicrosoftが公開しているサンプルのイメージであるmcr.microsoft.com/azuredocs/aci-helloworldを使ったので、URLアクセスすると以下の画面が表示されます。

aci-helloworldページ

ちなみにUtils.randomResourceNameの第二引数に指定している長さを短くすると、prefixがつかないことがありました。

実装に使っているメソッドのドキュメントにもprefixの部分にはif possibleと書かれているので、短いとprefixがつかないのでしょう。

docs.microsoft.com

ソース

ここまでのソースです。

github.com