#author("2020-07-29T01:04:22+00:00","","")
#mynavi(Azureメモ)
#setlinebreak(on);

* 概要 [#q629b743]
#html(<div class="pl10">)
VMにアクセスする Azure Functions の開発手順を記載する。
#html(</div>)

* 目次 [#uf1ea711]
#contents
- 関連
-- [[Azureメモ]]
- 参考
-- [[Premium プランの関数アプリを作成する:https://docs.microsoft.com/ja-jp/azure/azure-functions/scripts/functions-cli-create-premium-plan]]
-- [[Azure Functions の Premium プラン:https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-premium-plan]]
-- [[サンプルスクリプト:https://docs.microsoft.com/ja-jp/azure/azure-functions/scripts/functions-cli-create-premium-plan#sample-script]]
-- [[Azure Functions のデプロイ テクノロジ:https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-deployment-technologies]]
-- [[Azure Functions の zip デプロイ:https://docs.microsoft.com/ja-jp/azure/azure-functions/deployment-zip-push]]

* サンプル関数の仕様 [#i6e368a7]
#html(<div class="pl10">)
- Blobストレージへのファイルアップロードをトリガーに起動する関数とする。
- アップロードするファイルは時系列データのCSVファイルとする。
- 関数はファイルの内容をそのままVMで稼働する InfluxDB に登録する。

#TODO(絵)

#html(</div>)

* 必要なリソースの作成 [#kef97978]
#html(<div class="pl10">)

#myterm2(){{
# ストレージアカウント名は世界で唯一である必要がある
SUFFIX=xxxxxxxx

# リージョン
region=japanwest

# リソースグループ名
# ( az group delete --name $resourceGroup で一括削除可能 )
resourceGroup=myResourceGroup$SUFFIX

# ストレージアカウント名
storageName=mystorageaccount$SUFFIX
storageSku=Standard_LRS

# 関数アプリ名
functionAppName=myFuncapp$SUFFIX

# 使用するFunctionsのバージョン
functionsVersion=2

# 関数アプリのプラン名
# ※VMへのアクセスにはVNet統合を使用するが、この機能はプレミアムプランでないと提供されない。
funcPlanName=mypremiumplan$SUFFIX
funcPlanSku=EP1

# Storageコンテナ名
storageContainer=mystrcontainer$SUFFIX

# 仮想マシン名
vmName=MyVM$SUFFIX
vmImage=UbuntuLTS

# リソースグループの作成
az group create \
  --name $resourceGroup \
  --location $region

# ストレージアカウントの作成
az storage account create \
  --name $storageName \
  --location $region \
  --resource-group $resourceGroup \
  --sku $storageSku

# プレミアムプランの作成
az functionapp plan create \
  --name $funcPlanName \
  --resource-group $resourceGroup \
  --location $region \
  --sku $funcPlanSku

# 関数アプリの作成
az functionapp create \
  --name $functionAppName \
  --storage-account $storageName \
  --plan $funcPlanName \
  --resource-group $resourceGroup \
  --functions-version $functionsVersion

# Storageコンテナの作成
az storage container create \
  --name $storageContainer \
  --resource-group $resourceGroup \
  --account-name $storageName

# 仮想マシンの作成
az vm create \
  --resource-group $resourceGroup \
  --name $vmName \
  --image $vmImage \
  --generate-ssh-keys \
  --ssh-dest-key-path `pwd`/ \
  --output json \
  --verbose

# InfluxDB用のポートを開放しておく
az vm open-port --resource-group $resourceGroup --name $vmName --port 8086
}}
#TODO: Publicアクセスは踏み台サーバのみ許可する

#html(</div>)

* InfluxDBインストール [#x5d23908]
#html(<div class="pl10">)

VM上にInfluxDBをインストールする。
ここでは docker を使用する為、先に docker からインストールを行う。
https://docs.docker.com/engine/install/ubuntu/

VM作成時に生成されたSSH鍵を使用してVMに接続後、以下の作業を行う。

** dockerインストール [#k8bf0c40]
#html(<div class="pl10">)
#myterm2(){{
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
}}
#html(</div>)

** docker-compose インストール [#c275c195]
#html(<div class="pl10">)

https://docs.docker.com/compose/install/

#myterm2(){{
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
}}

#html(</div>)

** InfluxDBインストール [#u9a56dd9]
#html(<div class="pl10">)

influxdb.conf
#mycode2(){{
[meta]
  dir = "/var/lib/influxdb/meta"

[data]
  dir = "/var/lib/influxdb/data"
  engine = "tsm1"
  wal-dir = "/var/lib/influxdb/wal"

[http]
  enabled = true
  flux-enabled = true
}}

docker-compose.yml
#mycode2(){{
version: "3" 

services:
  influxdb:
    image: influxdb:1.8
    hostname: influxdb_sample
    container_name: influxdb_sample
    volumes:
      - ./influxdb:/var/lib/influxdb
      - ./influxdb.conf:/etc/influxdb/influxdb.conf
    ports:
      - 8086:8086
}}

起動
#myterm2(){{
sudo docker-compose up -d
}}

サンプルDB/ユーザ作成
#myterm2(){{
docker exec -it influxdb_for_test bash
# influx
> create database sampledb
> create user sample with password 'sample' WITH ALL PRIVILEGES
}}

#html(</div>)

#html(</div>)


* 関数アプリの作成 [#x09d7bdd]
#html(<div class="pl10">)
#TODO
#html(</div>)

* 関数アプリのデプロイ [#v8360ab2]
#html(<div class="pl10">)

[参考]
- [[Azure Functions のデプロイ テクノロジ:https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-deployment-technologies]]
- [[Azure Functions の zip デプロイ:https://docs.microsoft.com/ja-jp/azure/azure-functions/deployment-zip-push]]

#TODO
#myterm2(){{
az functionapp deployment source config-zip -g リソースグループ -n 関数名 --src ZIPファイルPATH
}}

#html(</div>)

* Functions を Azure 仮想ネットワークに統合する [#uc003b0f]

[[チュートリアル: Functions を Azure 仮想ネットワークに統合する:https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-create-vnet]]
[[アプリを Azure 仮想ネットワークと統合する:https://docs.microsoft.com/ja-jp/azure/app-service/web-sites-integrate-with-vnet]]

[[Azure Functions のネットワーク オプション:https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-networking-options]]

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS