この記事はDeNA 25 新卒 Advent Calendar 2024の12日目の記事です。25卒同期が魅力的な記事を紹介してくれると思うので、ぜひぜひチェックしてみてください!
はじめに
皆さん、バッチ処理してますか?
バッチ処理を定期実行するとなると、PCを常時起動する or クラウド上で動かすかの2択ですが、クラウドが楽ですよね!
ただ、クラウドを使うとなるとコストが気になるところ。。。
そこで、この記事ではコストを抑えてAzure上でバッチ処理を実行する方法について紹介します。
例えば、Pythonで書いたバッチ処理をAzure上で定期実行することを考えると、Azureで使う環境として
- Azure virtual machines (以下、Azure VPS)
- Azure Functions
- Azure Container Apps jobs
などが挙げられます。
Azure VPSはVPSなので自由に設定して動かせますが、VMを停止している間もストレージにコストがかかり続けます。
Azure Functions等のサーバーレスでは、バッチ処理を定期実行する場合はコストをかなり抑えられますが、Pyppeteerを使う必要があるなど、OSのパッケージに依存する処理は実行できません。
一方、Azure Container Apps jobsは任意のコンテナイメージを実行でき、従量課金のため使った分しかコストが発生しません。なので、Docker Hubを利用するなど無料のコンテナレジストリさえ確保できれば低コストに運用できます。(コンテナレジストリにAzure Container Registryを使う場合、コストはAzure VPSと大差ありません)
Azure Container Apps jobsとは
Azure Container Appsのリソースの1つです。
Azure Container Appsの中にはappsとjobsがあり、以下の違いがあります。
- Azure Container Apps:継続的に実行されるサービス向け
- Azure Container Apps jobs: 一定時間で終了するバッチ処理向け
Azure Container Apps jobsでコンテナを定期実行するまで
構成
Docker HubにPushしたhello-worldのDockerイメージを、Azure Container Apps jobs上で実行します。
コンテナイメージの流れは以下の通りです。
手順
PublicなDocker Hubのリポジトリを利用する場合
Azure portal上のリソースの作成
からContainer App ジョブ
を選択します。
左のタブからだと出てこないので、container apps
などで検索する必要があります。
今回はWest US 2リージョンに定期実行するサービスを作成します。
Docker HubのリポジトリがPublicな場合はこんな感じで作成できます。
- レジストリログインサーバ:
docker.io
- イメージとタグ:${DockerHubUserName}/my-hello:latest
リポジトリがPrivateの場合はレジストリログインサーバがPublicの場合と異なります(後述)
PrivateなDocker Hubのリポジトリを利用する場合
PrivateなDocker Hubのリポジトリのイメージを利用する場合、レジストリログインサーバをdocker.io
にするとデプロイ時にエラーが出るので、作成手順を別途紹介します。
docker.io
を指定するとサービスのデプロイ時に
The following field(s) are either invalid or missing. Field * is invalid with details: 'Invalid value: ...
このエラーを回避するためには、レジストリログインサーバをregistry.hub.docker.com
に変更する必要があります。
- https://stackoverflow.com/questions/76110956/how-to-integrate-docker-hub-with-azure-container-apps-using-azure-devops-pipelin
- https://github.com/microsoft/azure-container-apps/issues/352
また、レジストリのパスワード
には、Docker Hubで作成した、少なくともRead-onlyのアクセス権が設定されたPersonal access tokens
を使います。
レジストリログインサーバとレジストリのパスワードを設定し、リソースを作成すると...
動作確認
デプロイしたリソースのExecution history
から定期実行されていることを確認できます。
Console
へ移動するとhello-worldコンテナの出力が確認でき、正常に定期実行できていることが確認できます。
おわりに
今回はAzure Container Apps jobsを使ってバッチ処理のコストを抑える方法を紹介しました。
ライブラリで完結するような処理はAzure Functionsを利用し、OSのパッケージが別途必要な場合はAzure Container Apps jobsを利用するなど使い分けることで、Azure VPSを使わずにほとんどのバッチ処理は低コストに実行できます。
それでは良いAzureライフを!