技術情報 - はじめてのAzure Functions

はじめに

Azure Functions は、ユーザーが作成した関数を外部クラウド含むさまざまなクラウドサービスと連携して動作させるサーバーレスソリューションである。仮想マシンを必要としないサーバーレスな環境のため、プログラム開発に集中することができる。

トリガー

Azure Functions で作成した関数は、以下のトリガーで駆動することができる。

「トリガーを使用して Azure 関数を実行する」より抜粋

  • タイマー:設定した間隔で関数を実行する。
  • HTTP:HTTP要求を受信したときに関数を実行する。
  • Blob:Azure Blob Storage 内にファイルがアップロードされたとき、または Azure - Blob Storage 内のファイルが更新されたときに、関数を実行する。
  • キュー:Azure Storage キューにメッセージが追加されたときに、関数を実行する。
  • Azure Cosmos DB:コレクション内のドキュメントが変更されたときに、関数を実行する。
  • イベント ハブ:イベント ハブで新しいイベントが受信されたときに、関数を実行する。

開発言語

複数の開発言語がサポートされており、用途にあった言語を選択することができる。また、外部ライブラリを使用するときは、対象ライブラリがサポートしているランタイム環境により、開発言語を決定することができる。例えば、Node.js モジュールを使用したいときは、JavaScript or TypeScript を開発言語とすることで、外部ライブラリを使用することができる。

言語ランタイム備考
C#.NET
F#.NET
PowerShellPowerShell
PythonPython
JavaJava
JavaScriptNode.js
TypeScriptNode.jsJavaScript変換

環境構築

本書では、以下の環境構築例を示す。

  • 開発マシン: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のターミナルからインストール
  • リモート:クラウド開発ツールのコンソールからインストール

デバッグ

デバッグは、以下の操作をすることでソースラインデバッグが可能になる。

  1. 「実行とデバッグ」から「デバッグの開始」を選択する。
  2. 「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;