ちょっと機会があってJavaでAzure Container Instanceを操作する実装方法について調査する機会がありました。備忘録としても記しておきます。
SDK
AzureにはSDKが用意されており、プログラミング言語で各サービスを操作することが可能です。用意されているSDKは以下のページに記されています。
簡単な使い方については、以前ブログも書いていたようです(これを書く上で検索してはじめて思い出しました)。
今回は、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' }
サンプル
SDKのAPIを色々と観てもいいんですが、コードサンプルがMicrosoftから公開されているのでそれを参考にします。コードサンプルは、以下のページから検索して探してみます。
今回は以下のサンプルが見つかったので、このサンプルをもとに実装します。
実装
実装自体はそんなに難しいものではなく、サンプルを横目に実装できます。細かいメソッドとして、Utils.java
が公開されているのでここから必要なメソッドを抜き出すと便利かなと思います。
今回は、以下のようなクラスを作り...
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がつくられます。
今回はMicrosoftが公開しているサンプルのイメージであるmcr.microsoft.com/azuredocs/aci-helloworld
を使ったので、URLアクセスすると以下の画面が表示されます。
ちなみにUtils.randomResourceName
の第二引数に指定している長さを短くすると、prefixがつかないことがありました。
実装に使っているメソッドのドキュメントにもprefixの部分にはif possible
と書かれているので、短いとprefixがつかないのでしょう。
ソース
ここまでのソースです。