Azure Functions 超入門編

はじめに

今回はAzure Functionsをご紹介します。私もプロジェクト参画当初ははわからないことだらけでした。ですので、今回は当時の私のようなAzure Functionsって何?という人や、Azure Functionsを使ってみたいけど、使い方がわからない!という人に向けてAzure Functionsを解説していきたいと思います。

Azure Functionsの概要

Azure Functionsとは

Azure Functionsはマイクロソフトのクラウドである「Microsoft Azure」上でコードをサーバーレスで実行できるサービスです。サーバーの構築やリソースの割り当てをAzureが自動で行ってくれるので、私たちユーザー側はコードの開発のみに集中することができます。また、Azure Functionsでは拡張機能である「Durable Functions」を利用することで、従来のサーバーレスコンピューティングでは難しかった、ステートフルな(セッション情報を保持する)アプリケーションを簡単に構築することもできます。

また、 Azureはコンプライアンス対策やネットワークセキュリティ対策も備えられ、日々アップデートされているため、セキュリティ面においても、より安全な環境を手軽に利用することができます。

堅苦しく書きましたが、要は面倒な設定や管理を行うことなくアプリケーションを構築できるということです。

  1. Azure Functionsの利用料金

    料金は使用するリージョンによって異なりますが、2023年4月11日時点での東日本リージョンの価格は次の表のとおりになっています。

プラン 料金
App Serviceプラン 選択する仮想マシンの性能によって、¥11.503円~51.990/時間
従量課金プラン リソース使用量(¥0.002080/GB)+コード実行回数(¥25.995/100万回)100万回実行までは無料
Premiumプラン vCPU使用時間(従量課金:¥25.4751vCPU/時間、年間契約:\21.144333 vCPU/時間)+メモリ使用時間(従量課金:¥1.819650GB/時間、年間契約:\1.510310GB/時間)

参考:https://azure.microsoft.com/ja-jp/pricing/details/functions

Azure Functionsのユースケース

私が携わってきた案件や、その他にもAzure Functionsでできることをご紹介します。

    • ユースケース1:ファイルからデータを読み取ってDBに登録する

Azureストレージアカウント(ファイルなどを保存しておくAzureのサービス)や、DBと組み合わせることで、指定した時間になると、任意のフォルダのファイルからデータを読み取ってDB登録するといった処理を実現することができます。例えば、日々Excelで管理している商品の在庫状況を読み取って毎日12時にDBを最新の在庫状況に更新するといったことに活用できます。

    • ユースケース2:アプリケーション動作状況を監視する

Azure Functionsではユーザーが設定せずともCPU使用率や実行ログなどが取得できます。また、アラートを設定することで、CPU使用率が一定の値を超えた際や、アプリケーションの実行に失敗した際に通知を受け取ることも可能です。そうすることで、CPU使用率が100%の状態が続いてアプリケーションが動かないといった事態を未然に防ぐことができます。

 

Azure Functions使ってみた

それでは実際に、ゼロからAzure Functionsを始める方法についてご説明します。今回は、アクセスログをストレージアカウント上のファイルに出力するという簡単なプログラムの構築を行います。

  1. 導入環境

Windows10

Visual Studio Code(1.73.1)

Microsoftアカウント(無料で作成可能)

  1. Azure側の操作

まず初めにAzure Functionsを動かすためのリソースを作成していきます

    1. Azure Portalへサインイン

まずはご用意いただいたMicrosoftアカウントでAzure Portalへサインインします。この画面からAzureの各種操作を行っていくことになります。

    • サブスクリプションの作成

Portalへサインイン出来たら、まずはサブスクリプションを作成しましょう。サブスクリプションとは、リソースに対する支払いをグループ化したものです。Azureでリソースを作成する際に必要になります。新規サブスクリプションを作成する際はカード情報等の入力を求められますが、料金のかかるリソースを使用しない限りお金を請求されることはありません。上記画面の「Azureの無料試用版から開始する」の開始ボタン、もしくは検索ボックスに「サブスクリプション」と入力し、サブスクリプション管理画面の「+追加」ボタンから、必要項目を入力し、新規サブスクリプションを作成します。(お持ちでない場合はAzureアカウントもここで作成します)

サブスクリプション管理画面に新規でサブスクリプションが作成されればOKです。

    • リソースグループの作成

サブスクリプションが作成できたら次はリソースグループを作成します。リソースグループとはその名の通り、Azureのリソースをグループ化したものです。Azureでリソースを作成する際にはどこかのリソースグループに所属させる必要があるため、新規で作成します。

上部検索ボックスから「リソースグループ」と検索し、リソースグループ管理画面の「+追加」ボタンからリソースグループを作成します。

サブスクリプションに先ほど作成したサブスクリプションを選択します。リソースグループ名を今回は「FunctionsDemo」としました。また、リージョンは東日本リージョンを選択しました。

全ての項目が入力出来たら、「確認および作成」、「作成」ボタンからリソースグループを作成します。

先ほど同様、リソースグループ管理画面に作成したリソースグループが表示されれば作成完了です。

    • ストレージアカウントの作成

Azure Functionsでは、ソースコードを保存しておくためのストレージアカウントが必要になります。そのため、ストレージアカウントを事前に作成しておきます。

上部検索ボックスで「ストレージアカウント」と検索し、ストレージアカウント管理画面から「+作成」をクリックします。

サブスクリプション、リソースグループに先ほど作成したリソースを設定し、ストレージアカウント名、地域を選択します。その他の設定はデフォルトで大丈夫なので、「Review」、「作成」をクリックしてストレージアカウントを作成します。

ストレージアカウント管理画面に作成したストレージアカウントが表示されれば作成完了です。

ストレージアカウントが出来たら、アクセスログを保存しておくためのフォルダ(ファイル共有)を作成します。

「ファイル共有」ボタンをクリックし、「+ファイル共有」ボタンをクリックします。ファイル共有名入力後、「作成」ボタンをクリックし、ファイル共有を作成します。

また、ストレージアカウントへの接続文字列も必要になりますので、「アクセスキー」ボタンをクリックし、表示された接続文字列をメモしておいてください。(key1でもkey2でもどちらでも大丈夫です)

    1. 関数アプリ(Azure Functions)の作成

ではいよいよAzure Functionsを作成していきます。Azure Functionsのリソースはportal上では「関数アプリ」と呼ばれ、管理されています。上部検索ボックスで「関数アプリ」と検索し、関数アプリ管理画面から「+作成」をクリックします。

サブスクリプション、リソースグループ、関数アプリ名、ランタイムスタック(プログラム言語)、バージョン、地域を選択します。

ここでは開発で用いる言語に合わせてランタイムスタックを選択してください。

「監視」タブからApplication Insightsの有効化をオフにします。

※有効化をオフにしない場合、使用料金が発生する場合があります。

「確認および作成」、「作成」ボタンをクリックし、関数アプリを作成します。関数アプリ管理画面に作成した関数アプリが表示されれば作成完了です。

  1. VSCode側での操作

ではVSCodeを用いて実際に関数を作成してみます。

    • 拡張機能のインストール

VSCodeAzure Functionsの開発を行うにあたって、まずは拡張機能をインストールする必要があります。左タブ「拡張機能」から、「Azure Functions」をインストールします。インストール後は設定反映のためにVSCodeを再起動します。

    • Azureアカウントへのログイン

拡張機能をインストールすると、左タブにAzureのタブが追加されます。

Sign in to Azure…」をクリックし、Azureアカウントでログインします。

ログインが完了すると、作成したサブスクリプションが表示されます。その配下の「Function App」を確認すると、先ほど作成した「functionsdemo」が表示されます。

    1. プロジェクトの作成

functionsdemo」は表示されましたが、これだけではAzure上に受け皿は用意できていますが、中身は空の状態です。ですので、その中身にあたるプロジェクトを作成していきます。今回は指定されたURLにアクセスした際に実行されるファンクションを作成します。

WORKSPACE」の横の「+」ボタンをクリックし、「Create HTTP Function」をクリックします。

使用する言語(今回はC#)、ファンクション名、namespace、アクセス権を選択し、プロジェクトを作成します。

細かなコードの説明は省略しますが、ストレージアカウント作成の際にメモしておいた接続文字列を用いて、ファンクションが実行された際、ストレージアカウント上のログファイルにアクセスログを追記する処理を記述します。


using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Azure.Storage.Files.Shares;
using System.Text;
using Azure.Storage.Files.Shares.Models;

namespace HttpTriggerFunction
{
    public static class HttpTriggerFunction
    {
        [FunctionName("HttpTriggerFunction")]
        public static async Task Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            string responseMessage = string.IsNullOrEmpty(name)
                ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                : $"Hello, {name}. This HTTP triggered function executed successfully.";

            // 接続文字列、フォルダ名、出力文字列の設定
            string storageConnectionString = "*****************";
            string folderName = "log";
            string outputText = $"[{DateTime.Now.ToString()}]に{name}さんからアクセスがありました";

            // ストレージに接続
            ShareClient share = new ShareClient(storageConnectionString, folderName);
            ShareFileClient file = share.GetRootDirectoryClient().GetFileClient("accesslog.txt");

            // 出力文字列をバイトに変換
            var byteOutput = Encoding.UTF8.GetBytes(outputText);
            // 出力文字列のサイズで書き込みサイズを定義
            var openOptions = new ShareFileOpenWriteOptions() { MaxSize = byteOutput.Length };
            // 出力用ファイルをstreamで開く
            using (var stream = file.OpenWrite(true, 0, openOptions))
            {
                // 出力文字列をファイルに書き込む
                stream.Write(byteOutput,0,byteOutput.Length);
            }

            return new OkObjectResult(responseMessage);
        }
    }

 

    • プロジェクトをデプロイする

プロジェクトをデプロイするには、作成した関数アプリの上で右クリック、「Deploy to Function App…」をクリックします。

どのストレージアカウントにソースコードをデプロイするか聞かれるので、作成したストレージアカウントを選択します。

右下にデプロイ完了の通知が出れば問題なくデプロイできています。

  • 動作確認

Portalの関数アプリ管理画面、関数タブを見てみると、先ほどデプロイした関数が表示されています。

デプロイした関数を選択し、「コードとテスト」タブから関数のURLを確認します。

Bodyに「name=佐藤」を加え、URLにアクセスしてみると、ファンクションが動作していることがわかります。

ログファイルも確認してみましょう。

ストレージアカウント管理画面から、作成したファイル共有を見てみると、「accesslog.txt」ファイルが生成されています。

ダウンロードし、中身を見てみると、きちんとアクセスログが取得できていることがわかります。

 

おわりに

このようにAzure Functionsでは他サービスと組み合わせることで、様々なサーバーレスWebアプリケーションを作成することができます。弊社でもAzureを用いた開発を行っていますので、ご興味があればお気軽にご連絡ください。

最新情報をお届けします!

RPAに関する最新コラムやイベント情報をメールで配信中です。
RPA領域でお仕事されている方に役立つナレッジになりますので、ぜび登録してください!

最新情報を受け取る方はこちら

もっと知りたい方はこちら


ページトップ