Azure Function on Linux and Docker
MS AzureのサーバレスであるAzure FunctionにLinuxとDockerサポートが追加されました。
従来のAzure FunctionはWindowsOSベースで動作していたのですが、これにプレビューでLinuxが追加され、さらにDockerイメージをデプロイすることができるようになりました。
https://blogs.msdn.microsoft.com/appserviceteam/2017/11/15/functions-on-linux-preview/
https://blog.wille-zone.de/post/run-azure-functions-in-docker/
Azure Function on Linux
Linux版Azure Functionの使い始め方は簡単で、ポータルからデプロイできます。
以下のようにLinux(preview)を選択すればAzure FunctionがLinuxで動作します。
まだWindows版ほど機能が豊富ではありませんが(Pythonがない・・・?)、最近のMicrosoftはLinux大好きっぽいので、そのうち拡充されていくでしょう。
C#やJavascriptは動作します。
CLIからAzure Functionを起動する方法はブログの方法で可能です。
az cliを使うので、ここからインストールします。
https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest
Azure CLIのインストールが面倒な場合は、Azureポータル上でBashを起動することもできます。
以下のようなコマンドでAzure Function Linuxを起動できます。
(パラメータは適宜変えてください)
# Create a Resource Group
az group create -n rglinuxdocker -l "South Central US"
# Create a Linux App Service Plan (use S2 or S3 as the sku value for larger VMs)
az appservice plan create -n rgplan -g rglinuxdocker --is-linux -l "South Central US" --sku S1 --number-of-workers 1
# Create a storage account
az storage account create -n rgdocstorage --location "South Central US" --resource-group rglinuxdocker --sku Standard_LRS
# Create a Linux Function App
az functionapp create -n rgfuncapp -g rglinuxdocker -p rgplan -s rgdocstorage
# Create a Linux Function App pointing to a specific container image
az functionapp create -n rgfuncapp -g rglinuxdocker -p rgplan -i microsoft/azure-functions-runtime:2.0.0-jessie -s rgdocstorage
もちろんKUDUも起動していますので、以下にブラウザでアクセスすることも可能です。
https://rgfuncapp.scm.azurewebsites.net
Linux上のC#はmonoのようです。
KUDUでBashを開いてOSを確認すると、どうもUbuntuのようです。
sudo権限はなく、apt-getもできませんでした。
Azure Function on Docker
さらに自分のDockerイメージをAzure Functionにデプロイすることができるようになりました。
Azureで用意されているAzure function runtimeのDockerイメージを利用して、自分のカスタムDockerイメージを作ることが可能です。
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-function-linux-custom-image
もろもろはGithubでサンプルが公開されているので、まずはこれをクローンして使うのが良いと思います。
git clone https://github.com/Azure-Samples/functions-linux-custom-image.git --config core.autocrlf=input
cd functions-linux-custom-image
GithubにはDockerfileも含まれています。
中身はこんな感じです。
FROM microsoft/azure-functions-runtime:v2.0.0-beta1
ENV AzureWebJobsScriptRoot=/home/site/wwwroot
COPY . /home/site/wwwroot
ひとまずこれをビルドして使ってみましょう。
docker build -t myazfunc:v1.0.0 .
docker run -it -p 8080:80 myazfunc:v1.0.0
ローカルでdocker run
するとこのように起動し、ログが出力されます。
8080ポートで公開されるので、ブラウザからアクセスしてみるとMicrosoftっぽいデザインのサイトが表示されます。
http://< ip address >:8080
末尾にAPIも同梱されているので、/api/HttpTriggerJS1?name=world
を追加してアクセスしてみます。
http://< ip address >:8080/api/HttpTriggerJS1?name=world
これでDockerコンテナが無事稼働していることが確認できます。
続いてAzure Functionで起動できるよう、カスタムDockerイメージをDockerHubに登録します。
docker login
docker tag myazfunc:v1.0.0 <yourrepo>/myazfunc
docker push <yourrepo>/myazfunc
Azure FunctionにDockerコンテナで起動する際は、Azure CLIからDockerHubのDockerイメージを指定し、Azure Functionにデプロイするようです。
コマンドは以下のようになります。
az functionapp create --name myrgdocker --storage-account rgdocstorage --resource-group rglinuxdocker --plan rgplan --deployment-container-image-name <yourrepo>/myazfunc
storageConnectionString=$(az storage account show-connection-string \
--resource-group rglinuxdocker --name rgdocstorage \
--query connectionString --output tsv)
az functionapp config appsettings set --name myrgdocker \
--resource-group rglinuxdocker \
--settings AzureWebJobsDashboard=$storageConnectionString \
AzureWebJobsStorage=$storageConnectionString
これで先程ローカルで起動したのと同じDockerイメージがAzure Function上で起動します。
以下URLにブラウザからアクセスすることでデフォルトサイトを表示することができます。
https://myrgdocker.azurewebsites.net/
APIにHTTP GETも可能です。
https://myrgdocker.azurewebsites.net/api/HttpTriggerJS1?name=world
もちろんKUDUも起動できます。
https://myrgdocker.scm.azurewebsites.net
注:今回つくった環境は削除済みです。アクセスしても何もありません。