Azure Container Instancesで複数コンテナのデプロイを実装

今年もコツコツと学んだことを記していきます。

はじめに

Azure Container Instancesではひとつのコンテナだけでなく複数のコンテナを動かすことができます。チュートリアルも用意されています。

docs.microsoft.com

複数のコンテナを動かすシナリオとしては以下のページに記載されています。

docs.microsoft.com

引用すると、

  • Web アプリケーションにサービスを提供するコンテナーとソース管理から最新のコンテンツをプルするコンテナー。
  • アプリケーション コンテナーとログ記録コンテナー。
  • アプリケーション コンテナーと監視コンテナー。
  • フロントエンド コンテナーとバックエンド コンテナー。

があるようです。

また、今回は試しませんでしたがアプリケーションのTLS接続を有効にするという例もあるようです。

docs.microsoft.com

チュートリアルをそのまま動かしてもあまり理解が進まなかったので、今日は「アプリケーションコンテナーと監視コンテナー」の例を独自のアプリで実装してみることにします。

アプリ/監視コンテナーの実装

アプリケーションコンテナーの実装

アプリケーションコンテナーはSpring Bootで実装しました。監視コンテナーのアクセス先として、Actuatorを追加しました。

docs.spring.io

監視コンテナー

監視コンテナーはwatchコマンドで定期的にアプリケーションコンテナーのMetricsを取得するようにしました。

en.wikipedia.org

コンテナの通信は、

コンテナー グループ内では、コンテナー インスタンスは任意のポートの localhost を通じて相互にアクセスできます。それらのポートがグループの IP アドレスまたはコンテナーで外部に公開されていなくてもかまいません。

とあるので、http://localhost:8080/actuator/metricscurlコマンドでアクセスします。

docs.microsoft.com

処理を行うスクリプトは以下のように実装しました。

#!/bin/bash

watch -n 10 curl http://localhost:8080/actuator/metrics

コンテナ化するためのDockerfileは以下のような感じ。

FROM alpine:3.15.0
RUN apk add --update curl ca-certificates
COPY watchactuator.sh .
RUN chmod +x watchactuator.sh
CMD ["/bin/sh", "watchactuator.sh"]

Azure Container Instancesで動かす

Azure Container Instancesで複数のコンテナを動かしたい場合、ポータル上では設定ができなさそうだったのでTerraformで実装してみることにします。単純にcontainerを必要な数だけ並べる形になります。

resource "azurerm_container_group" "aci" {
  location            = data.azurerm_resource_group.rg.location
  name                = var.aci_name
  os_type             = "linux"
  resource_group_name = data.azurerm_resource_group.rg.name
  ip_address_type = "Public"
  dns_name_label = var.aci_dns_name_label

  image_registry_credential {
    password = data.azurerm_container_registry.acr.admin_password
    server   = data.azurerm_container_registry.acr.login_server
    username = data.azurerm_container_registry.acr.admin_username
  }

  container {
    cpu    = 0.5
    image  = "${data.azurerm_container_registry.acr.login_server}/aci_java_app:latest"
    memory = 1.0
    name   = "aci-java-app"
    ports {
      port = 8080
      protocol = "TCP"
    }
  }

  container {
    cpu = "0.5"
    image  = "${data.azurerm_container_registry.acr.login_server}/sidecar:latest"
    memory = 1.0
    name   = "sidecar"
  }
}

動かしてみる

実際に動かしてみます。

デプロイ後、Azure Container Instancesをみると、二つのコンテナが動いていることが確認できました。

f:id:miyohide:20220102173127p:plain

監視コンテナーとして見立てたものからのログを見ると、データが取れていることが確認できました。

f:id:miyohide:20220102174108p:plain