Azure CLIを使ってデプロイ時のトラブルを無くそう

現在、AILabでデプロイをする際には主にAzure Functionsを使用しています。 Azure Functionsにデプロイすることの強みとしては、サーバー管理が不要である、GUIで直感的に操作することができることが挙げられます。 しかし今回開発していく中でGUIでデプロイを進めていると、環境変数を変更するたびにデプロイしたはずの関数が消滅する、といった問題が生じました。 しかも厄介なのが、長いことAzure Functionsを使用している中でこの問題が生じたり生じなかったりと、非常に不安定な挙動を示すため、解決が困難な問題でした。

そんな中で代替案として挙げるのが、Azure CLI(Command Line Interface)です。 Azure CLIとは、Microsoft Azure のリソースをコマンドラインから操作できるツールのことを指します。 GUIを使わずに、ターミナルやスクリプトを使ってリソースの作成・管理・デプロイ・設定変更などを行うことができ、デプロイや構成の変更をスクリプトで一貫して管理できるようになります。 これは非常に便利なツールですが、環境構築が少し厄介なので以下にその手順を載せたいと思います。

① 仮想環境を作成

Azure CLIは実環境だと管理者権限の問題、またbrewの権限設定がややこしかったりなど困難な点が多いため、仮想環境上で実行することが推奨されます。以下にそのコマンドを示します。

python -m venv venv
source venv/bin/activate 

なお名前は任意であり、場所もどこでもいいです。

② 必要なツールをインストール

先ほど作った仮想環境にあるのは実環境にあったツールのみであるため、デプロイに必要なツールのインストールをします。今回必要なのは、pipとazure-functions、azure-functions-core-tools@4 –unsafe-permです。

pip install --upgrade pip
pip install azure-functions azure-cli
npm install -g azure-functions-core-tools@4 --unsafe-perm true

ここで、3行目のコマンドがうまくいかない可能性があります。 これは/usr/local/lib/node_modulesディレクトリに書き込み権限がないためアクセスが拒否されることが原因だと思われます。 この場合、グローバルにインストールするのではなく、ローカルにインストールするとうまくいきます。

手順

  1. プロジェクトディレクトリを作成
mkdir project-name
cd project-name
  1. Node.jsプロジェクト初期化
npm init -y
  1. Core Tools をローカルにインストール
npm install azure-functions-core-tools@4 --unsafe-perm

③ Azureにログイン

az login

このコマンドを実行するとブラウザが自動で開くので、指示通りに進めてください。ブラウザを閉じた後、コマンドラインに出てくる指示に対しては”1″と入力し、Enterを押して下さい。

④ Azureリソースの準備

以下のコマンドでリソースを作成します。なお、リソースグループ、ストレージアカウント、Azure Functionsが既にある場合は、該当の箇所を飛ばして下さい。しかし経験上、Azure Functionsはここで新規作成した方がエラーが少なかたっため、作ってしまった方がいいかもしれません。

# リソースグループの作成
az group create --name <リソースグループの名前> --location <location>

# ストレージアカウントの作成
az storage account create --name <ストレージアカウントの名前> --location <location> --resource-group <リソースグループの名前> --sku Standard_LRS

# Consumption プランで Function App を作成(Linux + Python)
az functionapp create \
  --resource-group <リソースグループの名前> \
  --consumption-plan-location <location> \
  --runtime python \
  --runtime-version <pythonのバージョン> \
  --functions-version 4 \
  --name <Azure Functionの名前> \
  --storage-account <ストレージアカウントの名前> \
  --os-type Linux

⑤ Azure Functionsプロジェクトの作成

func init myfuncapp --python
cd myfuncapp
func new --name MyHttpTrigger --template "HTTP trigger" --authlevel "anonymous"

ここで、1行目のコマンドを打った後、他のコマンドを打つ前に今作成したフォルダの中にあるfunction_app.pyを削除してください(これがあると次に作成するinit.pyを含むフォルダがうまく作成されません) これで以下の構成ができます。init.pyがデプロイしたい関数です。

myfuncapp/
├── MyHttpTrigger/
│   ├── __init__.py
│   └── function.json
├── host.json
├── local.settings.json
├── requirements.txt

requirements.txtにはインポートしたいライブラリを全て載せて下さい。

⑥ ローカルで動作確認

func start

⑦ Azure Functionsにデプロイ

func azure functionapp publish <Azure Functionsの名前>

以上の過程を経ると、Azure CLIを使ったデプロイが完了します。