Azure CLIでDockerイメージをACRにPushし、デプロイ済みのAzure Functionsにのせる方法
やること
Azure Portalにデプロイ済みの関数アプリにDockerイメージを連携する
今回やることのイメージ図
準備
それぞれ以下の記事を参考にしてインストールしました。
・Azure Functions Core Tools
・Azure CLI
前提
・Azure上に以下を作成済み
‐ Azure Functions
- Azure Container Regisrty(ACR)
‐ リソースグループ
‐ ストレージアカウント
全体の流れ
全体の流れはプロジェクトの作成→Dockerイメージの作成→DockerイメージをACRにPush→ACRからAzure FunctionsにPullという流れで順番にやっていきます。
①プロジェクトの作成
まず最初にAzure Functionsのプロジェクトを初期化します。
func init --worker-runtime python --docker
※ここだけAzure Functions Core Toolsでやりました。なぜかうまくいかなかったんですよね・・・
②Dockerイメージの作成
次にACRにPushしたいDockerイメージをビルドします。
docker build -t <イメージ名> .
③DockerイメージをACRにPush
まず、Windows Powershell上でAzureCLIを使えるようにAzureにログインします。
az login -t <テナントID>
ここが最初の落とし穴で単にaz login
だとauthentication errorが出て、意図したテナントが出てこないので注意が必要です。
次に、Azure Container Registry(ACR)にアクセスできるようにAzure CLIでログインします。
az acr login --name <ACR名>
次に、どのバージョンPushしたDockerイメージかわかるようにタグを付与します。
docker tag <イメージ名> <ACR名>.azurecr.io/<リポジトリ名>:<タグ>
※<ACR名>: Azure Portal で作成した ACR 名
<リポジトリ名>: イメージの名前(例: myfunctions)
<タグ>: イメージのバージョン(例: v1)
最後にDockerイメージをACRにPushします。
docker push <ACR名>.azurecr.io/<リポジトリ名>:<タグ>
Pushが正常にできると以下のように表示されます。
④ACRからAzure FunctionsにPull
まず、先ほどACRにPushしたDockerイメージを確認してみましょう。
<リポジトリ名の表示>
az acr repository list --name <ACR名> --output table
<タグ一覧の確認>
az acr repository show-tags --name <ACR名> --repository <リポジトリ名> --output table
これらできちんとレポジトリ名とタグが確認してから、Pullします。
az functionapp config container set \
--name <関数アプリ名> \
--resource-group <リソースグループ名> \
--docker-custom-image-name <ACR名>.azurecr.io/<リポジトリ名>:<タグ> \
--docker-registry-server-url https://<ACR名>.azurecr.io
こんな感じでJSON形式のリストが表示されればOKです
コンテナ起動の確認
Azure portal の「問題と診断の解決」オプションで無事に起動できることを確認できました!聞くところによれば、kudu ツールのデバッグコンソールで見る方法もあるらしいです。
その他役立ちそうなコマンド
az extension add --name azure-functions --debug
AzureCLIで色々なコマンドを実行していくとき、どこでどんなエラーが起きてるのか確認できます。
az functionapp --help
Azure CLI ではAzure Functions 関連の操作が標準で CLI に含まれている場合がありますが、拡張機能が廃止されるなんてこともあります。そのとき、これらのコマンドでどんな拡張機能があるのか確認してみましょう。
コメントなど
なんとかゴールまでたどりつきましたが、ほんとは全部Azure CLIでやりたかったんですよねー。Azure Functions Core ToolsやAzure CLIに慣れるという意味では良かったんですが、もっと慣れていく必要があると感じた次第です。
Discussion