💨

Azure Container Apps ジョブを使って Go のニュースを Slack に流してみる

2023/06/11に公開

Microsoft Build で Azure Container Apps のジョブ機能が新たに発表されました!パチパチ!

この機能は、Kubernetes の JOB と同じような機能で、以下の 3 つのタイプを実行できます。

  • 手動(オンデマンド)
  • スケジュール
  • イベントドリブン

コンテナー化したアプリケーションを手軽にジョブとして実行できることが魅力的だなと思います。何かちょこっとしたコンテナーを実行したい...そんな時にとっても便利そうです。
現在はプレビューとなっています。

Azure Container Apps とは

細かい話はこちらを参照してください。
簡単に言うと、コンテナーを実行するためのサービスです。Azure Kubernetes Service にするまでもないけど、コンテナーを実行したい...そんな時に使えるサービスです。

そこまで大きなプロジェクトでない、または検証を行いたい場合は、AKS(Azure Kubernetes Service)にする前に Azure Container Apps で試してみるのも良いかもしれません。

今回実施する内容

今回は、Azure Container Apps のジョブ機能を使って、Go で作成したニュース取得アプリケーションを定期的に実行し、Slack に流すというものを作成してみます。

Go のニュースとは、Medium から Go に関する情報を取得することを指していて、こちらから取得しています。
このプログラム自体は、GoConference 2023 の Women Who Go の Gopher Radio のなかで、ChatGPT を使って対話しながら作成したプログラムです。
プログラムの細かい内容については、こちらを参照してください。
Pull を行うと、作成したプログラムと Dockerfile が含まれています。

事前準備

事前に Slack のアプリを作成しておき、Slack のチャンネルに投稿するためのトークンとチャンネル ID を取得しておきます。
アプリの作成とトークンなどの取得方法は、こちらを参照してください。

これを手元でコンテナー化して実行してみます。

git clone https://github.com/mihohoi0322/GoNewsAtMedium.git
cd GoNewsAtMedium
docker build -t gonewsatmedium .
docker run -p 8080:8080 -e SLACK_TOKEN="<Slack Token>" -e SLACK_CHANNEL_ID="<Channel ID>" gonewsatmedium:latest

どうでしょう?Slack にニュースが流れてきましたね。
実際に私が実行した結果はこちらです。
Slackの様子

Azure Container Apps で実行してみる

ここからが本題です。
Auzre Container Apps ジョブを作成し、コンテナーをジョブとして実行してみます。

Azure Container Registry にイメージを格納する

まずは、Azure Container Registry にイメージを格納します。既存のものがあればそれを使っても良いですし、新しく作成する場合は、以下を参照してください。

RESOURCE_GROUP="rg-GoNewsAtMedium"
ACR="ACR名"

az group create --name $RESOURCE_GROUP --location eastus
az acr create --resource-group $RESOURCE_GROUP \
  --name $ACR --sku Basic

Azure Container Registry(ACR) にログインします。

az acr login --name $ACR

イメージをプッシュします。ARC にプッシュするためには、イメージ名を ACR の名前を含める必要があるので、タグ名を変更しています。

% docker image ls
REPOSITORY                      TAG       IMAGE ID       CREATED        SIZE
gonewsatmedium                  latest    3be932758413   23 hours ago   25.7MB
% docker tag gonewsatmedium:latest <ACR>.azurecr.io/gonewsatmedium:v1
% docker image ls
REPOSITORY                          TAG       IMAGE ID       CREATED        SIZE
gonewsatmedium                      latest    3be932758413   23 hours ago   25.7MB
<ACR>.azurecr.io/gonewsatmedium   v1        3be932758413   23 hours ago   25.7MB
% docker push <ACR>.azurecr.io/gonewsatmedium:v1
The push refers to repository [<ACR>.azurecr.io/gonewsatmedium]
699819a9ea37: Pushed
a83c9b56bbe0: Pushed
77192cf194dd: Pushed
v1: digest: sha256:caea4d55a613a71acebf43a96244db5c4d0951ee519dfc81dbcdc4c5b4b8ff23 size: 949

Azure Container Apps Environment を作成

ベースのリソースが必要だ、ということで、Azure Container Apps Environment を作成します。

すでに以下を実施した環境である場合は不要です。

az upgrade
az extension add --name containerapp --upgrade
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

Azure Container Apps Environment を作成します。

RESOURCE_GROUP="rg-GoNewsAtMedium"
LOCATION="eastus"
ENVIRONMENT="gonewsatmedium-env"
JOB_NAME="gonewsatmedium-job"

az containerapp env create \
    --name "$ENVIRONMENT" \
    --resource-group "$RESOURCE_GROUP" \
    --location "$LOCATION"

作成した Container Apps Environment にジョブを登録(オンデマンド)

ジョブを登録します。ジョブは、ACR に格納したイメージを指定します。
ACR からイメージを取得するためには、ACR の認証情報を登録する必要があります。
ここ を参照して実行します。

IDENTITY="jobidentity"

// ユーザー割り当てマネージド ID を作成
az identity create \
  --name $IDENTITY \
  --resource-group $RESOURCE_GROUP

// ID のリソース ID を取得
IDENTITY_ID=`az identity show \
  --name $IDENTITY \
  --resource-group $RESOURCE_GROUP \
  --query id`

echo $IDENTITY_ID

ACR_ID=$(az acr show --name $ACR --resource-group $RESOURCE_GROUP --query id --output tsv)
az role assignment create --assignee $IDENTITY_ID --role acrpull --scope $ACR_ID

オンデマンドでまずは実行してみます。

az containerapp job create \
    --name $JOB_NAME --resource-group $RESOURCE_GROUP --environment $ENVIRONMENT \
    --trigger-type "Manual" \
    --replica-timeout 60 --replica-retry-limit 1 --replica-completion-count 1 --parallelism 1 \
    --env-vars "SLACK_TOKEN=<TOKEN>" "SLACK_CHANNEL_ID=<CHANNEL ID>" \
    --registry-identity $IDENTITY_ID \
    --registry-server "<ACR>.azurecr.io" \
    --image "<ACR>.azurecr.io/gonewsatmedium:v1"

// ジョブの実行
az containerapp job start --name $JOB_NAME --resource-group $RESOURCE_GROUP
az containerapp job execution list --name $JOB_NAME --resource-group $RESOURCE_GROUP

履歴を見た際に、"status": "Succeeded" が表示されていれば成功です!と、同時に Slack にニュースが流れてきているはずです。ワクワクしますね。

実際に Azure Portal から確認してみましょう。
Azure Container Apps Environment の[アプリ]-[アプリ]をクリックすると、ジョブが表示されています。"アプリの種類"が"コンテナー アプリ ジョブ"となっているのがわかります。
Azure Container Apps Environment

アプリをクリックし、[Monitoring]-[Execution History] をクリックすると、実行履歴が表示されます。
Azure Portal の実行履歴

ステータスが"Succeeded"となっていますね!

スケジュール実行してみる

コンテナーによっては、定期的に実行したいものがありますよね。今回の Slack に通知するコンテナーもオンデマンドというよりは、毎朝9時...など定期的に実行したいものです。

JOB_NAME_S=gonewsatmedium-job-schedule
az containerapp job create \
    --name $JOB_NAME --resource-group $RESOURCE_GROUP --environment $ENVIRONMENT \
    --trigger-type "Schedule" \
    --replica-timeout 60 --replica-retry-limit 1 --replica-completion-count 1 --parallelism 1 \
    --env-vars "SLACK_TOKEN=<TOKEN>" "SLACK_CHANNEL_ID=<CHANNEL ID>" \
    --registry-identity $IDENTITY_ID \
    --registry-server "<ACR>.azurecr.io" \
    --image "<ACR>.azurecr.io/gonewsatmedium:v1" \
    --cron-expression "53 * * * *"

すごい中途半端な時間に設定していますが、私の都合です。毎朝9時に実行したい場合は、"0 9 * * *" と設定します。
設定した時間に、ジョブが実行されていることが確認できます。やったね!
また、ポータルの概要欄を見ると、設定した時間帯が表示されています。
ジョブの設定概要

まとめ

Azure Container Apps は、コンテナーを簡単に実行できるサービスです。定期的に実行したいコンテナーを、簡単に実行できるのが魅力的ですね。
今回は、Go で作成したコンテナーを実行しましたが、コンテナー化してしまえば、実行できる言語や内容は広がると思います。ぜひ、試してみてください!

参考

https://news.microsoft.com/build-2023-book-of-news/ja/

https://learn.microsoft.com/ja-jp/azure/container-apps/overview

https://learn.microsoft.com/ja-jp/azure/container-apps/jobs?tabs=azure-cli

GitHubで編集を提案
Microsoft (有志)

Discussion