LinuxとDockerで入門するAzureのサーバレス

# 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は動作します。

![0.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/db4bc7b5-5ae4-dfaf-d827-dcf035125ee2.png)


CLIからAzure Functionを起動する方法は[ブログ](https://blogs.msdn.microsoft.com/appserviceteam/2017/11/15/functions-on-linux-preview/)の方法で可能です。
az cliを使うので、ここからインストールします。
https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest

Azure CLIのインストールが面倒な場合は、Azureポータル上でBashを起動することもできます。
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/5935e09b-1542-e648-3539-40a7017eae9b.png)

以下のようなコマンドでAzure Function Linuxを起動できます。
（パラメータは適宜変えてください）

```bash
# 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
```

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/f624b073-a6ee-f341-07bd-eca08ffb470d.png)

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/1aac389e-f128-3040-4d65-12aa64329282.png)


もちろんKUDUも起動していますので、以下にブラウザでアクセスすることも可能です。
https://rgfuncapp.scm.azurewebsites.net

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/3a298c9a-c358-91e3-0099-7e6f228b6db6.png)

Linux上のC#は[mono](http://www.mono-project.com/)のようです。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/fec6773d-1d96-fa73-51ea-a3fe27120abe.png)

KUDUでBashを開いてOSを確認すると、どうもUbuntuのようです。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/6fe388d6-609f-57e4-4e38-069b97a3ebff.png)


sudo権限はなく、apt-getもできませんでした。

![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/8ae4d33e-57c8-4e29-ba84-56cec4ae027b.png)


## Azure Function on Docker
さらに自分のDockerイメージをAzure Functionにデプロイすることができるようになりました。
Azureで用意されている[Azure function runtimeのDockerイメージ](https://hub.docker.com/r/microsoft/azure-functions-runtime/)を利用して、自分のカスタムDockerイメージを作ることが可能です。
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-function-linux-custom-image

もろもろは[Github](https://github.com/Azure-Samples/functions-linux-custom-image)でサンプルが公開されているので、まずはこれをクローンして使うのが良いと思います。

```bash
git clone https://github.com/Azure-Samples/functions-linux-custom-image.git --config core.autocrlf=input
cd functions-linux-custom-image
```

![19.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/9c8ec2c2-0820-3d27-e26b-dffadaa99e27.png)


GithubにはDockerfileも含まれています。
中身はこんな感じです。


```dockerfile
FROM microsoft/azure-functions-runtime:v2.0.0-beta1
ENV AzureWebJobsScriptRoot=/home/site/wwwroot
COPY . /home/site/wwwroot
```

ひとまずこれをビルドして使ってみましょう。

```bash
docker build -t myazfunc:v1.0.0 .
docker run -it -p 8080:80 myazfunc:v1.0.0
```

![18.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/0f61051d-91f6-fbf6-cbf5-e07a021906c9.png)


ローカルで`docker run`するとこのように起動し、ログが出力されます。

![21.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/5d2efa17-78cb-0c3f-44c0-1db877b8bff8.png)


8080ポートで公開されるので、ブラウザからアクセスしてみるとMicrosoftっぽいデザインのサイトが表示されます。
http://< ip address >:8080

![17.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/c28c2ad4-061e-8230-743b-c7f58f5e80b1.png)


末尾にAPIも同梱されているので、`/api/HttpTriggerJS1?name=world`を追加してアクセスしてみます。
http://< ip address >:8080/api/HttpTriggerJS1?name=world

![22.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/61e13585-dcc0-8855-30d0-0ea1da3d8d29.png)


これでDockerコンテナが無事稼働していることが確認できます。
続いてAzure Functionで起動できるよう、カスタムDockerイメージをDockerHubに登録します。

```bash
docker login
docker tag myazfunc:v1.0.0 <yourrepo>/myazfunc
docker push <yourrepo>/myazfunc
```

Azure FunctionにDockerコンテナで起動する際は、Azure CLIからDockerHubのDockerイメージを指定し、Azure Functionにデプロイするようです。
コマンドは以下のようになります。

```bash
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
```

![25.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/12e4afea-372d-b108-647c-dd0155978a10.png)


これで先程ローカルで起動したのと同じDockerイメージがAzure Function上で起動します。
以下URLにブラウザからアクセスすることでデフォルトサイトを表示することができます。
https://myrgdocker.azurewebsites.net/

![32.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/88c3f504-a816-3869-3877-84c3eceec06d.png)


APIにHTTP GETも可能です。
https://myrgdocker.azurewebsites.net/api/HttpTriggerJS1?name=world

![31.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/a12a84f4-586f-8aa5-9dea-5a38f2daf999.png)


もちろんKUDUも起動できます。
https://myrgdocker.scm.azurewebsites.net

![27.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/47df2fc5-ff78-009c-c612-582700945da8.png)

注：今回つくった環境は削除済みです。アクセスしても何もありません。