技術情報 - はじめてのAzure Functions
はじめに
Azure Functions は、ユーザーが作成した関数を外部クラウド含むさまざまなクラウドサービスと連携して動作させるサーバーレスソリューションである。仮想マシンを必要としないサーバーレスな環境のため、プログラム開発に集中することができる。
トリガー
Azure Functions で作成した関数は、以下のトリガーで駆動することができる。
- タイマー:設定した間隔で関数を実行する。
- HTTP:HTTP要求を受信したときに関数を実行する。
- Blob:Azure Blob Storage 内にファイルがアップロードされたとき、または Azure - Blob Storage 内のファイルが更新されたときに、関数を実行する。
- キュー:Azure Storage キューにメッセージが追加されたときに、関数を実行する。
- Azure Cosmos DB:コレクション内のドキュメントが変更されたときに、関数を実行する。
- イベント ハブ:イベント ハブで新しいイベントが受信されたときに、関数を実行する。
開発言語
複数の開発言語がサポートされており、用途にあった言語を選択することができる。また、外部ライブラリを使用するときは、対象ライブラリがサポートしているランタイム環境により、開発言語を決定することができる。例えば、Node.js モジュールを使用したいときは、JavaScript or TypeScript を開発言語とすることで、外部ライブラリを使用することができる。
言語 | ランタイム | 備考 |
---|---|---|
C# | .NET | |
F# | .NET | |
PowerShell | PowerShell | |
Python | Python | |
Java | Java | |
JavaScript | Node.js | |
TypeScript | Node.js | JavaScript変換 |
環境構築
本書では、以下の環境構築例を示す。
- 開発マシン:macOS 11.3, Apple M1(arm64)
- 開発環境:Visual Studio Code
- ランタイム:Node.js 14.15
- 開発言語:TypeScript
開発マシン
Appleシリコン(arm64)を搭載した開発マシンを利用することで、Core i9クラスの環境を安価に構築することができる。
開発環境
開発環境は、ローカルでの開発とリモート(クラウド上)での開発を選択することができる。ローカルでの開発は、Azure Functions Core Toolsとの組み合わせて行う必要がある。なお、ローカル開発とリモート開発を混在させることはできない。
- Visual Studio Code:ローカル開発(こちらを推奨)
- 任意のエディタ:ローカル開発
- ポータルでの開発:リモート開発
Visual Studio Code
Visual Studio Code に以下のプラグインをインストールする。
Azure Functions Core Tools
Core Toolsは、Appleシリコンに正式対応していなかったため、推奨バージョンをインストール後に、grpcを手動でインストールする必要があった。
$ # 推奨バージョンをインストール
$ npm i -g azure-functions-core-tools@3 --unsafe-perm true
$ # grpcを手動でインストール
$ npm i -g grpc
$ # usernameを確認し、シンボリックリンクを手動で設定
$ ln -s /Users/username/.nvm/versions/node/v14.15.5/lib/node_modules/grpc/src/node/extension_binary/node-v83-darwin-arm64-unknown /Users/username/.nvm/versions/node/v14.15.5/lib/node_modules/azure-functions-core-tools/bin/workers/node/grpc/src/node/extension_binary
ランタイム
Node.jsは、arm64へ移行途中だったため、ソースからビルドする必要があった。このとき、ソースの取得とビルドは、nvmコマンドを使用することで自動化することができる。
nvm
公式サイトを参考に以下のコマンドを実行する。
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
Node.js
推奨バージョンを参考に以下のコマンドを実行する。
$ # 推奨バージョンをインストール
$ nvm install v14.15
開発言語
TypeScriptは、Visual Studio Codeを使用することで、ローカル(Node.js)環境での開発が可能になる。具体的には、以下のような操作が可能になる。
- ファイル操作:プロジェクトの作成、ファンクションの作成、モジュールのインストール
- デバッグ操作:ローカル環境でのソースラインデバッグ
- デプロイ操作:ビルド済みJavaScriptのアップロード
ファイル
ファイルは、以下の操作をすることで作成することができる。
- プロジェクトの作成は、「フォルダ⚡︎」ボタンを押下する。
- ファンクションの作成は、「⚡︎」ボタンを押下する。
モジュールは、ローカルまたはリモートからインストールすることができる。
- ローカル:VS Codeのターミナルからインストール
- リモート:クラウド開発ツールのコンソールからインストール
デバッグ
デバッグは、以下の操作をすることでソースラインデバッグが可能になる。
- 「実行とデバッグ」から「デバッグの開始」を選択する。
- 「Azure」から対象の関数を選択し、「今すぐ関数を実行する」を選択する。
デプロイ
デプロイは、Azureメニューの↑ボタンを押下するとアップロード先のプロジェクトを選択することができる。なお、リモート開発中のプロジェクトにローカルからデプロイするとクラウド上のデータが削除されるため、注意する必要がある。
実装例
実装のポイントと汎用的なHTTP Clientの例を示す。
- ポイント:同期スタイルと静的クライアント
- HTTP Client:axios
ポイント
実装のポイントとして、同期スタイルと静的クライアントが挙げられる。
同期スタイル
async と await キーワードを使用してコードを記述することが推奨されている。
静的クライアント
クライアントのインスタンスは、再利用できるように静的クライアントが推奨されている。
HTTP Client
Azureから汎用的なHTTPリクエストを送信する方法を示す。axios は、広く使用されるHTTPクライアントの一つである。詳細は、npm trends を参照
- インストール:axios
- サンプルコード:HTTP GETリクエスト表示
インストール
以下のコマンドを実行し、モジュールをインストールする。
$ npm i axios
サンプルコード
HTTP GETリクエストの結果をブラウザに表示する例を以下に示す。
import { AzureFunction, Context, HttpRequest } from "@azure/functions"
import axios from 'axios';
const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const url = req.query.name ? req.query.name : 'https://www.yahoo.co.jp';
try {
const res = await axios.get(url);
context.res = {
// status: 200, /* Defaults to 200 */
body: res.data
};
context.log(res);
} catch (err) {
console.error(err);
}
};
export default httpTrigger;
開発支援ソリューションページも是非ご確認ください。