今年もコツコツと学んだことを記していきます。
はじめに
Azure Container Instancesではひとつのコンテナだけでなく複数のコンテナを動かすことができます。チュートリアルも用意されています。
複数のコンテナを動かすシナリオとしては以下のページに記載されています。
引用すると、
- Web アプリケーションにサービスを提供するコンテナーとソース管理から最新のコンテンツをプルするコンテナー。
- アプリケーション コンテナーとログ記録コンテナー。
- アプリケーション コンテナーと監視コンテナー。
- フロントエンド コンテナーとバックエンド コンテナー。
があるようです。
また、今回は試しませんでしたがアプリケーションのTLS接続を有効にするという例もあるようです。
チュートリアルをそのまま動かしてもあまり理解が進まなかったので、今日は「アプリケーションコンテナーと監視コンテナー」の例を独自のアプリで実装してみることにします。
アプリ/監視コンテナーの実装
アプリケーションコンテナーの実装
アプリケーションコンテナーはSpring Bootで実装しました。監視コンテナーのアクセス先として、Actuatorを追加しました。
監視コンテナー
監視コンテナーはwatch
コマンドで定期的にアプリケーションコンテナーのMetricsを取得するようにしました。
コンテナの通信は、
コンテナー グループ内では、コンテナー インスタンスは任意のポートの localhost を通じて相互にアクセスできます。それらのポートがグループの IP アドレスまたはコンテナーで外部に公開されていなくてもかまいません。
とあるので、http://localhost:8080/actuator/metrics
にcurl
コマンドでアクセスします。
処理を行うスクリプトは以下のように実装しました。
#!/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をみると、二つのコンテナが動いていることが確認できました。
監視コンテナーとして見立てたものからのログを見ると、データが取れていることが確認できました。