フォーム読み込み中
2022年9月26日掲載
Azure Functionはサーバレスコンピューティングプラットフォームであり、開発ユーザーは小さな関数のコードを作成するだけで、開発ユーザーはサーバをプロビジョニングすることなく、その関数のコードを実行することができます。
・参考記事
サーバレスってなに?Alibaba Cloud, AWS, Azure, Google Cloud のサーバレスサービスを比べてみました
本記事では、Azure Functionのデプロイ方法のひとつである、コンソールでNode.jsおよびPythonそれぞれをデプロイする方法を説明します。
Azure Functionはコンソール上にて関数のコードを入力するだけで実行もできますが、より大きなソースコード、およびAzure Functionコンソール上でデフォルトでは含まれていないライブラリがある場合でも、ZIPファイルを使うことでデプロイすることができます。
※本記事は 2022年9月時点の情報をもとにしております。実際のご利用にあたっては、必ず各社の最新情報をご確認ください。
Node.jsおよびPythonそれぞれのコードをZIPファイルとしてAzure Functionへデプロイする際の流れ、構成図としては次の通りになります。
Azureの場合、最初にコンソール画面で Function App を作成する必要があります。Azureポータルに入り、Azure Function コンソール画面で Function App を作成し、ランタイムとしてNode.jsを選択します。
Function App 画面にて `Create`ボタンをクリックし、新しい Function App を作成します
基本設定の空白を埋め、ランタイムとしてNode.jsを選択
`Next` ボタンをクリック
ストレージアカウントを設定し、今後の手順で使用されるリソースを設定します
レビュー画面に遷移し、設定・構成内容を確認します
作成プロセスはページに表示され、すべてが完了すると成功メッセージが表示されます。`Go to resource` ボタンをクリックして、ターゲット機能アプリの詳細を確認することができます。
Azure Function上での事前準備が出来たら、デプロイしたいNode.jsソースコードの準備をします。このソースコードはAzure Functionと紐づける設定が必要なので、先ほど作成した Function App の概要ページからhost.jsonをダウンロードします。
ローカルにてnode_test_zip_azという名前のフォルダを作成し、そこにダウンロードした設定ファイルを配置します。このコードにはmomentという名前のサードパーティの依存関係が必要なので、package.jsonに依存関係情報を追加します。
Sample Configuration:
{
"devDependencies": {
"moment": "^2.29.4"
}
}
次に、node_test_zipというサブフォルダを作成します。このフォルダは、配置プロセス中に関数として認識されます。
Azure Function用フォルダには2つのファイルがあります。ひとつはエントリポイント用、もうひとつはコンフィギュレーション用です。
index.jsは関数のエントリポイントであり、次のようになります。
上記のソースコードは次の通りです。
'use strict';
const moment = require('moment');
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
const responseMessage = "Azure CLI : " + moment().utcOffset(9).format('YYYY-MM-DD HH:mm:ss');
context.res = {
// status: 200, /* Defaults to 200 */
body: responseMessage
};
}
function.jsonは、トリガ定義を含む関数の設定です。ここでは、関数レベルで認証を行う基本的なHTTPトリガを使用します。
上記のfunction.jsonは次の通りです。
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}
ローカルプロジェクトの現在の構造は以下のようになります。
.
├── host.json
├── package.json
└── node_test_zip
├── index.js
└── function.json
npmコマンドを使用して、必要な依存パッケージをインストールします。package.jsonはすでにありますので、`npm i`をルートディレクトリで直接使用します。
すると、そこに`node_moudules`が生成されていることが確認できます。
Function App管理ページに戻り、新しい設定項目をWEBSITE_RUN_FROM_PACKAGE=URLとして追加します。
完了したら、ターゲットファンクションアプリはURLの下のZIPパッケージからコードと設定をロードします。URLは上記の手順でアップロードしたZIPパッケージのURLである必要があります。
ターゲットとなるFunction appのConfigurationへ移動します。
“Application Settings” タブを確認します。
WEBSITE_RUN_FROM_PACKAGE は、デフォルトではリストに含まれていません。その場合は、“New application setting” ボタンをクリックしてターゲット設定を追加します。そうでない場合は、構成アイテムの「編集」ボタンをクリックして値を更新します。ここでは、作成プロセスを例として説明します。
構成項目の正しい名前と値を入力してください
`OK`ボタンをクリックして変更を送信します。
`Save`ボタンをクリックして変更を保存します。
確認ボタンをクリックします。
一連の設定が完了すると、成功メッセージが表示されます。ZIPパッケージ内のターゲット関数が自動的に展開されます。
コンソール上でターゲットとなる関数コードを確認します。
`Test/Run` ボタンをクリックしてスクリプトをテストします。
スクリプトを実行する前に、スクリプトの返却値は事前に定義済の日付形式を使って出力するように設定します。
Function は 関数レベルで認証されるため、生成されたHTTPトリガーに直接アクセスするとエラー(HTTP ERROR 401) が発生します。
HTTPトリガーを使用して関数をテストするには、コンソールから関数のURLを取得し、Webブラウザでテストします。
Webブラウザで開いたところ、現在の日付情報が特定の形式で表示されます。以上が、Zipファイルを使ってNode.jsソースコードをAzure Function上にてデプロイする方法になります。
PythonソースコードをAzure Functionでデプロイする方法をご紹介します。上記のようにコンソールでPythonスクリプト用のFunction Appを作成します。注意として、PythonランタイムはLinuxでのみサポートされていますので、Linuxを選定する必要があります。
Azure Function上での事前準備が出来たら、ローカルにてデプロイしたいPythonソースコードの準備をします。Linuxモードでは、アプリコンテンツのダウンロードはサポートされていないので、python_test_zip_azという名前のローカルプロジェクトフォルダを、host.jsonなしで直接作成します。
コードには、HTTP通信用ライブラリのrequestsとAzure Function APIを介してコードを実行するためのazure-functionsというサードパーティの依存関係が必要なので、requirements.txtに依存関係情報を追加します。
上記の構成情報は次の通りです。
# Do not include azure-functions-worker as it may conflict with the Azure Functions platform
azure-functions
requests
python_test_zipという名前の関数フォルダを作成し、その中にpythonスクリプトファイル__init__.pyと設定ファイルfunction.jsonを作成します。
上記のソースコードは次の通りです。
import logging
import azure.functions as func
import requests
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
response = requests.get('http://google.com/')
return func.HttpResponse(
"This HTTP triggered function executed successfully. Access Google homepage with status code {0}".format(response.status_code),
status_code=200
)
上記のfunction.jsonは次の通りです。
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
ローカルプロジェクトの現在の構造は以下のようになります。
.
├── requirements.txt
└── python_test_zip
├── __init__.py
└── function.json
pipコマンドを使用して必要な依存パッケージをインストールします。requirements.txtはすでに用意されているので、ルートディレクトリで `pip3 install -r requirements.txt -t .` を直接使用してください。
依存パッケージがプロジェクトフォルダに追加されます。
さらに使用するために、フォルダをZIPファイルとして圧縮します。
デプロイしたいPythonソースコードの準備ができたら、Azure Function上のFunction Appの既存コンテナにZIPフォルダをアップロードします。
ファイルリンクもコピーします。
WEBSITE_RUN_FROM_PACKAGE = <ZIPファイルのURL> として新しい設定項目を追加します。このオプションは、Azureの消費プランでホストされているLinux上のパッケージから実行するオプションです。
Successメッセージが表示されると、ターゲット機能が正常にデプロイされます。
デプロイする関数コードをインラインエディタでチェックし、コンソールでテストします。上記のデプロイするスクリプトの中身は、Googleホームページにアクセスし、関連するHTTPステータスコードを返すものです。
これも上記Node.jsと同様、直接URLを入力しFunctionの結果を確認します。
テストの結果、HTTP 200が無事返却されたので、成功です。以上が、Zipファイルを使ってPythonソースコードをAzure Function上にてデプロイする方法になります。
コードを更新し、新しいZIPパッケージを準備します。
パッケージをBlobストレージにアップロードし、既存のパッケージを上書きします。パスとファイル名は変更しないので、URLは再利用できますし、Function Appの設定を変更する必要はないです。
アップロード処理後にFunction Appのコードを確認してみます。コードは変更されていないと思います。
コードを同期させるにはいくつかの方法があります。ここでFunction Appを再起動すると、新しいコードがZIPパッケージからロードされます。
・参考リンク
Deployment technologies in Azure Functions(Microsoft)
マネージドIDを使用してAzure Blob Storageからパッケージをフェッチするか、Shared Access Signature(SAS)でパッケージにアクセスします。
ここではSASを例に挙げます。まず、Blobストレージのアクセス・レベルを変更します。
次に、Function Appを再起動して更新をトリガーにします。
今回は、パッケージがprivateに設定されているため、Function Appランタイムが到達不能であるというエラーメッセージが表示されます。
ターゲットのZIPファイルを使用してSASを生成します。
関連する設定項目のURLを、生成されたSASリンクに置き換えます。
ここまでの更新情報を保存すると、Functionは通常通り動作します。
Node.jsおよびPythonそれぞれのコードをZIPファイルとしてAzure Functionにデプロイする方法をご紹介しました。
Azure Functionの場合、実行結果をURLベースで入力し確認することや、LinuxのほかWindowsランタイムがあるのは他クラウドにはなくユニークな面でもあります。
本記事では、Azure Functionに含まれていないパッケージなどをローカルで準備し、それをAzure Function Appとしてデプロイする際はZIPファイルを使ったアプローチが非常に役立つと思いますので、Azure Function Appを使ったサーバレスアプリケーションを構築する際はご参考になれば幸いです。
条件に該当するページがございません