Skip to content

Latest commit

 

History

History
599 lines (401 loc) · 21 KB

azure-functions-note.md

File metadata and controls

599 lines (401 loc) · 21 KB

Azure Functions 忘備録

Ubuntu 18.04LTS上でPythonでAzure Functionsを書くメモ。 AWS Lambdaと全然違う。

Azure Functionsで使える言語

Azure Functions ランタイム バージョンの概要 | Microsoft Docs

ただし課金プランで、いちばん安い「従量課金プラン」が使える言語は限られる。 (従量課金プランは消費量プラン、Consumption planとも言う)

Azure Functions での従量課金プランのコストの見積もり | Microsoft Docs

以下の記事はやや古いけど参考にはなります

^^^^^^^^^^^^^^^

Azure Functions リファレンス

functionsの開発にいるもの

最低限必要なもの:

あると便利なもの:

チュートリアル Visual Studio Code を使用して Azure で初めての関数を作成するにはVScode+ExtensionやVisual Studioが必須のように書かれていますが、funcコマンドでなんとでもなる。

リンク

Azure CLI

Azure Functions Core Tools

Azure/azure-functions-core-tools: Command line tools for Azure Functions

Azure Functions Runtime 2.0.12850が2019-10-29に出てた。

日本語ドキュメント

azure-docs.ja-jp/articles/azure-functions at master · MicrosoftDocs/azure-docs.ja-jp

Pythonの制限(2019-7)

v2.7.1724

Japan EastでもPython使えるみたい(2019-10)

使えるリージョンがいまのところ

  • West US
  • East US
  • West Europe
  • East Asia

GUIも使えたり使えなかったり。 コードの編集も テストランもできません。

あと Premiumプラン、 App Serviceプランだけなので、 「少なくとも 1 つのインスタンスが常にウォーム状態である必要があります。 つまり、実行数に関係なく、アクティブなプランごとに固定の月額コストがかかります」 のは同じ。

Azure Functions のスケールとホスティング | Microsoft Docs

前提

ここから開始→ Azure で HTTP によってトリガーされる関数を作成する | Microsoft Docs

Python 3.6 のインストール

は省略。本当に必要なのかはわからないがvenvを使うので

sudo apt-get install python3-venv

しておく。

Azure CLI バージョン 2.x 以降をインストールします。

Azure CLI のインストール | Microsoft Docs 参照。

Azure Functions Core Tools バージョン 2.6.666 以降をインストールします。

Azure Functions Core Tools の操作 | Microsoft Docs参照

Azure CLI入れてあるなら下の手順はスキップ

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg

次に

sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$(lsb_release -cs)-prod $(lsb_release -cs) main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-get update

さらに

sudo apt-get install azure-functions-core-tools

準備

作業ディレクトリ作る & 移動

mkdir works/azure
cd !$

ローカル関数プロジェクトを作成

func init MyFunctionProj
cd MyFunctionProj

venv環境作成

python3 -m venv .env

venv環境へ移動(毎回最初に実行)

ource .env/bin/activate
pip install -r requirements.txt

ローカル設定ファイルlocal.settings.jsonで AzureWebJobsStorageの接続文字列を編集する。 設定しないとfunctionはなにも動かないので仕方がない。 Azure ストレージ エミュレーターも使えるらしいのだが、Linux版が無い。

ストレージ接続文字列の取得を参考にして接続文字列を得る。

この設定はあとでfunc azure functionapp fetch-app-settings <APP_NAME>で上書きされる。 先にポータルでfunction作ってからのほうが楽かもしれない。

関数つくる。中身は空で。

func new --template "Http Trigger" --name HttpTrigger1
func new --template "Timer Trigger" --name TimerTrigger1

ホスト起動

func host start

関数を呼ぶ。とりあえず引数無しで。

HttpTrigger1の方

$ curl --get http://localhost:7071/api/HttpTrigger1?name=Azure%20Rocks
Hello Azure Rocks!

TimerTrigger1の方

curl -i http://localhost:7071/admin/functions/TimerTrigger1

これでJSONがずらずら帰ってくれば、とりあえずOK。

一方Storageの方に azure-webjobs-hostsというのができてるはず。

venvの環境は~/.env/lib/python3.6/site-packagesからモジュールを読むので

pip install -r requirements.txt -U -t ~/.env/lib/python3.6/site-packages

みたいなことが必要(当たってる?)。

InsightsのLog Analytics(Azure Monitor)で使えるクエリサンプル

参考:

普通のlogっぽい出力を得る

traces | top 100 by timestamp desc | project timestamp, message

過去60分以内のerrorレベルのログを出す。

union traces
| union exceptions
| where timestamp > ago(60m)
| where customDimensions.LogLevel == "Error"
| order by timestamp desc

これは実際に使った。 count>0のとき、メール送るアクショングループを起動する、という感じで(期間60分頻度5分)

Azure Functions Core Toolsのインストール

Azure Functions Core Tools

Windowsの場合

まとめると、今現在(2019-10)では

  1. node 10.xを先に入れる(12もLTSだが、Azure Functions Core Toolsが対応していない) - これ12.xも使えるようになった(2020-04)
  2. Chocolatey入れる
  3. ChocolateyでAzure Functions Core Toolsいれる

の順で。

WindowsだとChocolatey でインストールしないとfuncが動かない。 (npmでもproxyが邪魔で入らない場合があるけど、それとは別)

C:\>func -v
internal/child_process.js:366
    throw errnoException(err, 'spawn');
(略)

何かがたりないんだと思うけど、何だかはわからない。

管理者権限で

choco install azure-functions-core-tools

結果

C:\>func -v
2.7.1724

そもそもChocolateyが入ってない場合は Chocolatey Software | Installing Chocolatey 参照。

Azure Functionsのデプロイがめんどくさすぎる問題

開発をしない、デプロイだけする人のことを考えたときに(SIer的な) AWS Lambdaみたいな「ポータルからZIPでデプロイ」が無いのは辛い、という話。

開発者にとっては、かなり便利() Azure Functions のデプロイ テクノロジ | Microsoft Docs

発端

たとえばnodejsの場合、 チュートリアル Visual Studio Code を使用して Azure で初めての関数を作成する によれば、

を揃えて、なおかつPortalでいろいろやんなくちゃならないのは辛い。 apt/yum、msi/msixまではともかく、 AWS Lambdaみたいにzipでなんとかならないのか(なるよね?) を確かめる。

参考: Azure Functions の zip プッシュ デプロイ | Microsoft Docs

調査

まず上のような開発環境で作る & 動作確認

できあがったものがこちら → heiwa4126/hello-function: Azure Functions & nodejs。vscodeを使った開発環境と、デプロイ用のzipを作るテスト

結論

Azure CLIでzipを発行するのが

ポータルで、該当functionから、プラットフォーム->デプロイセンター 様々なデプロイが選べる。

  • 継続的配置 (CI/CD)
  • 手動配置 (プッシュ/同期)

の2種類がある。とりあえず手動配置(構成後「同期」ボタンをおして配信)の方から選ぶ。

結論0

Azure Functions の zip プッシュ デプロイ にある通りのAzure PowerShell(Azure CLIとは違う)を使ったデプロイ。

※ Azure CLI (python版)にも同じコマンドがあるので、 無理にpowershell版をいれなくてもOK。 下のコマンドも行継続キャラを'^'にするだけでbatになる。Linuxとかでも同様にできる。

ポータルでfunctionを作り、azure powershellでazureにlogin後、

az functionapp deployment source config-zip `
 -g <functionのリソースグループ> `
 -n <function名> `
 --src <zipfile名>

実際に実行すると出力はこんな感じ(Powershell版)

az : WARNING: Getting scm site credentials for zip deployment
At C:\Users\heiwa4126\Documents\Projects\func-check-url-nodejs-zip\deploy1.ps1:1 char:1
+ az functionapp deployment source config-zip `
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (WARNING: Gettin... zip deployment:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

WARNING: Starting zip deployment. This operation can take a while to complete ...
{
  "active": true,
  "author": "N/A",
  "author_email": "N/A",
  "complete": true,
  "deployer": "Push-Deployer",
  (略)
}

ログ出力代わりにwarning出すな、といいたい(Python版のAzure CLIでは警告でません)。

Azure powershellのインストールがめんどくさいので、 最初の1回とか、二度と変更しないような場合に使う。

Azure Functions Core Toolsが入っていれば

func azure functionapp publish <app name> --build remote

の方が楽。

結論1

自分でデプロイするなら、External。

パブリックの Git または Mercurial リポジトリからデプロイします。

「パブリックの」はインタネット上の、ぐらいの意味で、pullさえできれば GitHubのprivateレポジトリでもOK

プラットフォーム->デプロイセンター->External->続行->App Service のビルド サービス->続行

  • リポジトリ
  • ブランチ
  • リポジトリの種類 - Mercurial|Git
  • プライベート リポジトリ - いいえ|はい
  • ユーザー名 (プライベート リポジトリを「はい」にしたとき)
  • パスワード (プライベート リポジトリを「はい」にしたとき)

最初の1回目は自動的にpull & npm install & functionの再起動が行われる。 2回め以降は「同期」ボタン。

これはなかなか便利なので、TODO:

  • AWS lambdaでも同様のことができないか試す。
  • 継続的配置のGitHubのほうも試す。

結論2

gitってなんだ? っていう人が扱う場合には、FTPS

zipのダウンロードは

ポータルで、該当functionから、 アプリのコンテンツのダウンロード サイトのコンテンツ、「ダウンロードにアプリ設定を含める」はチェックしない ダウンロードボタン (たぶんcliでできる)

FTPSクライアントはWinSCPが使える。

ポータルで、該当functionから、

プラットフォーム->デプロイセンター->FTP->ダッシュボード

FTPSエンドポイント アプリの資格情報タブで ユーザ名 パスワード

これをWinSCPにコピペして、オープンしたら、 zipの中身を上書きコピーする。

functionsの再起動はしないようなので、 関数の停止/開始を行う(再起動ではダメだった)。

gitでデプロイ、と違って、npm installはやってくれないみたいで、 node_modules以下も必要で、転送サイズが大きくなりがち。

Linux

Azure FunctionsでLinuxを使うとデプロイセンターが使えない。

nodejs v12 LTS

(この項は古い。2020-04現在12.x使える)

nodejs v12.13 LTSが出たので、アップグレードしたら Azure Functions Core Tools が、

[2019/10/23 2:32:53] [error] Incompatible Node.js version. The version you are using is
v12.13.0, but the runtime requires an LTS-covered major version (ex: 8.11.1 or 10.14.1). LTS-covered versions have an even major version number (8.x, 10.x, etc.) as per https://github.com/nodejs/Release#release-plan. For deployed code, change WEBSITE_NODE_DEFAULT_VERSION in App Settings. Locally, install or switch to a supported node version (make sure to quit and restart your code editor to pick up the changes).

とか言って死ぬ。

npm update -g azure-functions-core-tools

してもダメだった。

Functionsの開発環境はしばらく10.xで。

未整理メモ

「とりあえず」仕様

出力はInsightsのLog Analyticsに特殊な先頭文字付きで出し、 Kustoクエリで

traces
| where (cloud_RoleName == "hello9vaglet") and (isempty(severityLevel) != true ) and ( message matches regex "^\\*\\*\\*\\*\\ " )
| project timestamp, message

みたいな感じで。

queueに出力も簡単にできるのだが、意外とリードアウトがめんどくさい。

欠点: Log Analyticsへの出力が死ぬほど遅い。

ホスティング プラン

Azure Functions のスケールとホスティング | Microsoft Docs

よく使うfuncコマンド

デプロイ

func azure functionapp publish <APP_NAME> --build remote

--build remoteオプションをつけるとリモートビルドする( pip install -r requirements.txtnpm installをリモートでやってくれるらしい)

設定のダウンロード

func azure functionapp fetch-app-settings <APP_NAME>

local.settings.jsonに設定をダウンロードしてくれる。

HTTPトリガのauthLevel

functio.jsonのauthLevelで

invoke

AWS CLIの aws lambda invoke に相当するものがないらしい。

たぶん以下のどちらかで実現できる

これも使えるかも。

テレメトリー

Telemetry
---------
The Azure Functions Core tools collect usage data in order to help us improve your experience.
The data is anonymous and doesn't include any user specific or personal information. The data is collected by Microsoft.

You can opt-out of telemetry by setting the FUNCTIONS_CORE_TOOLS_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.

ということなので~/.profileなどにFUNCTIONS_CORE_TOOLS_TELEMETRY_OPTOUT=1とか書いておく。

see: Azure/azure-functions-core-tools: Command line tools for Azure Functions

Docker

Azure Functionsでdockerを使うと、Functionを停止しても料金が発生するので、辛い。

Linuxベースのfunctions(Pythonとか)はそうではなかったような気がする。

時は流れて2022-09

コマンド ラインから Python 関数を作成する - Azure Functions | Microsoft Docs

それでもCLIコマンドたくさん必要で、 ちょっとしたスクリプト用意しないといけない。 プロジェクトをgit cloneして sam build && sam deploy --guided みたいには行かない。

デプロイ全般にわたって遅い。 リソースグループのデプロイが空だ(ARM templateが一切使われていない)。

リソースグループ消すと全部消えるのは好き。

これ便利。az config param-persist on 永続化されたパラメーター オプション – Azure CLI | Microsoft Docs

Terraformのほうがよさそう。 Deploy Azure Functions with Terraform