御成門プログラマーの技術日記

Microsoft AzureやAngularなどの技術情報を発信します

Azure Functionsの拡張機能「Durable Functions」の基礎を知るためにとりあえずデプロイしてみた

最近「Azure Functions」がらみでよく話に出る「Durable Function」のクイックスタートをやってみました。
備忘録的に作った際のメモを残そうと思います。

Durable Functions の概要

概要については公式ページ参照 docs.microsoft.com

Durable Functions の主な用途は、サーバーレス アプリケーションにおける複雑でステートフルな調整の問題をシンプルにすることです。 次のセクションでは、Durable Functions を使用することでメリットがある、いくつかの典型的なアプリケーションのパターンを示します。
パターン #1: 関数チェーン
パターン #2: ファンアウト/ファンイン
パターン #3: 非同期 HTTP API
パターン #4: 監視
パターン #5: 人による操作

Azure Functionsを連続、並列で実行したりする機能なのかなぁってイメージです。
機能、事例とかを知るためにTechSummit2018でMicrosoftの牛尾さんがDurable Functionsのセッションやってたから見てみようかなと思っています。

さらっと作ってみた

Azure Functionsのプロジェクトを作る

Visual Studioから作ります。
新しいプロジェクトで「Visual C#」→「Cloud」→「Azure Functions」 f:id:tt-suzukiit:20181210184506p:plain

バージョンを「Azure Functions v2(.NET Core)」
テンプレートは「なし」
ストレージアカウントは「ストレージエミュレーターf:id:tt-suzukiit:20181210184522p:plain

プロジェクトに新しい関数を追加する

「プロジェクトを右クリック」→「追加」→「新しいAzure関数...」
f:id:tt-suzukiit:20181210184906p:plain

「Azure関数」を選択し、名前を付けて追加をクリック
f:id:tt-suzukiit:20181210184959p:plain

「Durable Functions Orchestration」を選択してOKを選択する f:id:tt-suzukiit:20181210185056p:plain

下記のようなDurable Functionsのコードが自動生成される。

using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace DurableFuncApp
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<List<string>> RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            var outputs = new List<string>();

            // Replace "hello" with the name of your Durable Activity Function.
            outputs.Add(await context.CallActivityAsync<string>("Function1_Hello", "Tokyo"));
            outputs.Add(await context.CallActivityAsync<string>("Function1_Hello", "Seattle"));
            outputs.Add(await context.CallActivityAsync<string>("Function1_Hello", "London"));

            // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
            return outputs;
        }

        [FunctionName("Function1_Hello")]
        public static string SayHello([ActivityTrigger] string name, ILogger log)
        {
            log.LogInformation($"Saying hello to {name}.");
            return $"Hello {name}!";
        }

        [FunctionName("Function1_HttpStart")]
        public static async Task<HttpResponseMessage> HttpStart(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]HttpRequestMessage req,
            [OrchestrationClient]DurableOrchestrationClient starter,
            ILogger log)
        {
            // Function input comes from the request content.
            string instanceId = await starter.StartNewAsync("Function1", null);

            log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

            return starter.CreateCheckStatusResponse(req, instanceId);
        }
    }
}

HttpStartで関数を起動し、RunOrchestrator(名前はFunction1)で
「Function1_Hello」関数を3回連続で実行するコードみたいですね。

デバッグ実行で試す

デバッグ実行に成功すると、ローカルホストのURLが出力されるので、
このURLをブラウザ上で実行する。 f:id:tt-suzukiit:20181210190509p:plain

ブラウザ上でURLをたたくと下記のような文字列が出力される。 f:id:tt-suzukiit:20181210190647p:plain

{"id":"4fbb74e39ae04151a6fce230198617f4","statusQueryGetUri":"http://localhost:7071/runtime/webhooks/durabletask/instances/4fbb74e39ae04151a6fce230198617f4?taskHub=DurableFunctionsHub&connection=Storage&code=JJ8MNcYXpnllJD4LkpJdXQ3/jSbW0R0qad/Hs3W/PayFCSlrf5V/2w==","sendEventPostUri":"http://localhost:7071/runtime/webhooks/durabletask/instances/4fbb74e39ae04151a6fce230198617f4/raiseEvent/{eventName}?taskHub=DurableFunctionsHub&connection=Storage&code=JJ8MNcYXpnllJD4LkpJdXQ3/jSbW0R0qad/Hs3W/PayFCSlrf5V/2w==","terminatePostUri":"http://localhost:7071/runtime/webhooks/durabletask/instances/4fbb74e39ae04151a6fce230198617f4/terminate?reason={text}&taskHub=DurableFunctionsHub&connection=Storage&code=JJ8MNcYXpnllJD4LkpJdXQ3/jSbW0R0qad/Hs3W/PayFCSlrf5V/2w==","rewindPostUri":"http://localhost:7071/runtime/webhooks/durabletask/instances/4fbb74e39ae04151a6fce230198617f4/rewind?reason={text}&taskHub=DurableFunctionsHub&connection=Storage&code=JJ8MNcYXpnllJD4LkpJdXQ3/jSbW0R0qad/Hs3W/PayFCSlrf5V/2w=="}

上記文字列の中から「statusQueryGetUri」をコピーし、ブラウザ上で実行すると実行結果が表示されました。

出力結果

"Hello Tokyo!","Hello Seattle!","Hello London!"が出力されており、
「Function1_Hello」関数が3連続で呼ばれていることがわかりました。

{"instanceId":"4fbb74e39ae04151a6fce230198617f4","runtimeStatus":"Completed","input":null,"customStatus":null,"output":["Hello Tokyo!","Hello Seattle!","Hello London!"],"createdTime":"2018-12-10T08:58:29Z","lastUpdatedTime":"2018-12-10T08:58:37Z"}

Azureに発行する

発行する方法はいつもと変わらないので省略します。
動作は、デバッグ実行時と変わりません。

参考ページ

docs.microsoft.com

【Azure Functions 2.0】NUnitを使用して、自動テストを行う

今回はAzure Functionsの関数に対してNUnitを使って、自動テストを行います。

前準備

前回の記事でVisualStudioから作ったソースコードをそのまま使用します。
ソースコードの元の内容については下記を参照。 onarimonstudio.hatenablog.com

テストプロジェクトを作成します

テスト用のプロジェクトを新規で追加します。

NUnitを使用するためにパッケージをインストールします。
「プロジェクト」→「Nugetパッケージの管理」
下記5点のパッケージをインストールします。
NUnit
NUnit3TestAdapter
Microsoft.NET.Test.Sdk
Moq
Microsoft.AspNetCore.App

テストコードを記述します

追加したテストプロジェクトにクラスを追加し、
テストコードを記述します。

using Microsoft.AspNetCore.Http;
using Moq;
using NUnit.Framework;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Mvc;

namespace Tests
{
    public class Tests
    {
        [Test]
        public async Task 出力結果が正しいかのテスト()
        {
            var httpRequestMoq = new Mock<HttpRequest>();
            httpRequestMoq.Setup(x => x.Query["name"]).Returns("onarimonprogram");
            httpRequestMoq.Setup(x => x.Body).Returns(new MemoryStream());
            var response = await HelloFunctionsAppHttpTrigger.Function1.Run(httpRequestMoq.Object, new Mock<ILogger>().Object);

            //関数の実行が成功しているかをテスト
            Assert.True(response is OkObjectResult);

            var responseOkResult = (OkObjectResult)response;
            //出力値が正しく出力されているかをテスト
            Assert.AreEqual("Hello, onarimonprogram", responseOkResult.Value);
        }
    }
}

テストを実行してみる

「テスト」→「ウィンドウ」→「テスト エクスプローラー」
全てを実行を押すと、テストが実行され、結果が出力されました。 f:id:tt-suzukiit:20181206204816p:plain
これで自動テストができるようになりました。

最後に

自動テストができるようになったので、
今度、FunctionsのCI/CDを紹介できたらと思います。

参考ページ

blog.okazuki.jp

【Azure Functions 2.0】Visual Studioを使って関数を作成し、デバッグ実行後、Azure上へ発行する

今回は以前AzurePortalから作成したAzure FunctionsのHelloWorld関数をVisual Studioから ローカル実行を行い、その後、Azure上に発行する方法を紹介します。

Azureポータルから作成する方法

onarimonstudio.hatenablog.com

VisualStudioからプロジェクトを作成する

VisualStudioの新規プロジェクト作成画面を開き、
「Visual C#」 → 「Cloud」 と選択すると、「Azure Functions」があるのでこちらを選択して作成します。 f:id:tt-suzukiit:20181205202530p:plain

Functionsの設定画面が開くので下記の通り設定します。
今回はアクセス権の設定は行いません。

f:id:tt-suzukiit:20181205202750p:plain

項目 設定値
バージョン Azure Functions v2(.NET Core)
テンプレート Http trigger
ストレージアカウント ストレージエミュレーター
Access right Anonymous

設定後、OKを押すと、自動的にHTTPトリガーのテンプレートが展開されます。

自動作成されたコード

Function1.cs

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;

namespace HelloFunctionsAppHttpTrigger
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "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;

            return name != null
                ? (ActionResult)new OkObjectResult($"Hello, {name}")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }
    }
}

デバッグ実行してみたら、エラーが発生

とりあえずこの時点でデバッグ実行できるはずなので、F5を押して実行してみたらエラーになった。 f:id:tt-suzukiit:20181205203950p:plain

致命的なエラーが発生し、デバッグを終了する必要があります。詳細については、MicrosoftヘルプとサポートWebサイトを参照してください。HRESULT=0x8000ffff。エラーコード=0x0。

Visual Studioのアップデートを最近していないことが原因だった

なんかアップデート周り怪しいなと思い、「ヘルプ」→「更新プログラムの確認」
思った通り、Visual Studioのアップデートを最近してなかったので、更新したら解決した。

いざ再デバッグ実行

デバッグ実行が成功するとこんなコンソールが出てくる。 f:id:tt-suzukiit:20181205211209p:plain コンソールのURLをコピーしてブラウザ上で実行してみる。

http://localhost:7071/api/function1?name=onariomonprogram

「ハロー御成門プログラマー」ということでデバッグ実行は通った。
f:id:tt-suzukiit:20181205204816p:plain

Azure上に発行する

「ソリューションエクスプローラー」→「ソリューションを選択して右クリック」→発行
このままプロファイルの作成をクリック f:id:tt-suzukiit:20181205205139p:plain

Azure上のアプリ名とかサブスクリプション名を聞かれるので適当に設定して作成をクリック。
下の画面が出たら「発行」を押す。
Azureの関数のバージョンを更新するか聞かれたら「はい」を選択。 f:id:tt-suzukiit:20181205211436p:plain

Azure上の関数を動かす

作成した関数を実行するURLは下記のような感じになります。
https://<作成したアプリ名>.azurewebsites.net/api/function1?name=onariomonprogram

ブラウザで実行してみると、成功!! f:id:tt-suzukiit:20181205210236p:plain

最後に

今回はVisual Studioから簡単なAzure Functionsの関数の作成、デプロイを行いました。 Visual Studioから作ることでAzure Functionsもソース管理、自動テストやCI/CDを組んだりできるようになるので、
今後、紹介していきたいと思います。

参照ページ

docs.microsoft.com

Microsoft AzureのMCP資格が2018年12月31日で廃止!!、MCPサポートに詳細を問い合わせてみた【MCP 70-533試験など】

「MCP 70-533」試験が廃止されるようなので、 MCPサポートに問い合わせてみました。
その際の内容について共有を行ないます。

2019年5月20日追記

Azureの認定資格について下記ページに最新情報をまとめました。
最新情報はこちらをご覧ください。
onarimonstudio.hatenablog.com

MCPサポートとの会話内容

廃止される試験について

廃止される試験については下記ページに記載されている。
Retired Certifications

Azureでは、下記3点のMCSE、MCSA認定試験に関連するMCP試験が廃止されるとのこと

試験の廃止日程

2018年12月31日に廃止されます。
廃止試験について、既に購入を行ってしまったバウチャーはこの日までに受検しないと無効になるとのことです。

Retakeポリシーについて

試験を落ちても複数回受検できるRetakeバウチャーを持っている場合、
前回受検から次に受検できるまでに期間を開ける場合があるので注意が必要。

  • 1回目受検後から2回目の受検まで:48時間経過後
  • 2回目受検後から3回目の受検まで:14日間経過後
  • 1年に5回まで受検可能

次に開始されるAzure認定試験について

次に開始されるAzure認定試験「Microsoft Role-based Certifications」については下記ページを参照。
Microsoft Technical Certifications | Microsoft Learning

Azure Administrator Associateを取得する場合は下記2点の方法がある

  • MCP70-533とAZ-102を取得する
  • AZ-100とAZ-101を取得する → 2019年5月1日に廃止になりました。
  • AZ-103(2019年5月1日より開始)に合格する

但し、新試験については2018年11月29日現在
日本語対応が行われる予定がないとのこと。 AZ-102試験ですが、
2019年5月20日現在、日本語で受けられるようになっています。
AZ-102試験の期限は6/30までなので気を付けてください。

結論

  • 現在のMCP資格のバウチャーを購入してしまっている人は2018年12月31日までに受検をするようにしましょう。
  • AzureのMCPは終了しております。
    代わりにAzure認定試験「Microsoft Role-based Certifications」が始まっています。

  • Retakeバウチャーを持っている方はRetakeポリシーに気を付けましょう。

  • 新試験については

前回記事(Azure新試験について)

onarimonstudio.hatenablog.com

【Azure Functions 2.0】AzureBlobストレージへのファイルアップロードを捕捉し、ファイル情報をログ出力する

前回のAzure Functions 2.0基礎編に引き続き、 今回も基礎的な内容を試してみようと思います。

初めに

前回作成したFunctions Appをそのまま使い回しています。
Function Appの作成は下記を参照してください。 onarimonstudio.hatenablog.com

今回やりたいこと

Blobストレージ内でファイルがアップロードされたことをトリガーにして、
ファイルの名前と容量を取得し、ログに出力する。
※Azureポータルからの簡単な作成。

作成手順

監視するBlobストレージを作成します

Functionsで認識できるようにするため、
ストレージの種類を"汎用アカウント"で作成してください。 f:id:tt-suzukiit:20181127185351p:plain

作成したBlobストレージにコンテナーを追加します。

f:id:tt-suzukiit:20181127191642p:plain

項目名 入力値
名前 今回はsamples-workitemsと入力
パブリックアクセスレベル プライベート

Azure Blob Storage Triggerを使用した関数を作成します

まず、前回作成したFunctions Appを開き、関数の右にある"+"ボタンをクリックします。
そうすると下記の画面が表示されるため、"Azure Blob Trigger"を選択します。
f:id:tt-suzukiit:20181127185738p:plain 下記のように拡張機能がインストールされていません」とメッセージが表示されたときは、インストールをクリックします。
f:id:tt-suzukiit:20181127185956p:plain

関数の設定画面を入力します

f:id:tt-suzukiit:20181127190211p:plain

項目名 入力値
名前 関数の名前を各自設定してください
パス <管理するコンテナー名>/{name}
今回はsamples-workitems/{name}と入力します。
このように設定するとBlob のファイル名は、name パラメーターとしてバインディングで渡されます。
ストレージアカウント接続 今までFunction Appに接続したストレージのリストが表示されます。
今回監視を行うストレージアカウントを選択しましょう。
リストにない場合は"新規"ボタンをクリックしてストレージを追加します。
汎用ストレージ以外は表示されないようなので注意です。

作成を押すと、関数が自動的に作成されます。 コードも下記のようなコードが自動的に作成されていると思います。

public static void Run(Stream myBlob, string name, ILogger log)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}

ログ監視ウィンドウを開く

作成した関数画面の一番下にログボタンがあるのでクリックするとログを表示する画面が表示されます。
現在はストレージに何もアップロードしていないのでログは表示されていません。
何かトリガーが動いた場合、こちらに情報が出力されます。
f:id:tt-suzukiit:20181127192051p:plain

Blobストレージにファイルをアップロードする

今回はパソコンに入ってた"salmon.PNG"をアップロードします。
f:id:tt-suzukiit:20181127192327p:plain
作成したストレージアカウント→コンテナ→アップロード
サーモン?の画像をアップロードします。
f:id:tt-suzukiit:20181127192352p:plain

そうすると先ほどのログ画面にアップロードしたファイルの名前と容量が下記の通り出力されました。

2018-11-27T09:31:16  Welcome, you are now connected to log-streaming service.
2018-11-27T09:32:16  No new trace in the past 1 min(s).
2018-11-27T09:33:16  No new trace in the past 2 min(s).
2018-11-27T09:34:07.830 [Information] Executing 'Functions.BlobTriggerTest1' (Reason='New blob detected: samples-workitems/salmon.PNG', Id=c040abbf-4c8c-41bc-8340-65a79d34d710)
2018-11-27T09:34:07.860 [Information] C# Blob trigger function Processed blob
 Name:salmon.PNG 
 Size: 39635 Bytes
2018-11-27T09:34:08.116 [Information] Executed 'Functions.BlobTriggerTest1' (Succeeded, Id=c040abbf-4c8c-41bc-8340-65a79d34d710)

完成!!

functions2.0「Blob Storage Trigger」の使い道

以前、Tech Summit 2018で参加した服部さんのセッションでは、
モバイルアプリで取った写真をBlobにアップロードして、
自動的に写真をスケーリングするシナリオが紹介されていました。 f:id:tt-suzukiit:20181127193202p:plain

服部さんのセッションについて、詳しくはこちら onarimonstudio.hatenablog.com

blobストレージにアップロードした画像を自動的に加工したり、移動したりする用途で使われるのかなと思います。

参考ページ

docs.microsoft.com

Microsoft Tech Summit 2018 セッション要約「今日から始める Azure Functions 2.0」

登壇者情報

日本マイクロソフト株式会社
クラウド&ソリューション事業本部 インテリジェントクラウド統括本部
テクノロジーソリューションプロフェッショナル
服部さん

セッション内容要約

まずは今までのAzure Functionsの基礎的な話から

Azure Functions入門

f:id:tt-suzukiit:20181122175401p:plain イベントに反応して、コードをもとに行動する
イベントは「HTTP要求に対するトリガー」、「BLOBストレージ」、「タイマー」などのイベントがある。

サーバーレスアーキテクチャ

f:id:tt-suzukiit:20181122174901p:plain Azure Functionsといったらサーバーレスアーキテクチャ
サーバーレス=「コードに集中できる環境」 とくに従量課金であることが大事

Functionsのコンセプト

f:id:tt-suzukiit:20181122175736p:plain バインディング:他のサービスとの連携部分はマイクロソフトがあらかじめ定義しているので、コードだけに注力できる。
ロジックだけに注力すればいいのがFunctions

Functionsのシナリオ

Functionsのシナリオはこんな感じ
f:id:tt-suzukiit:20181122180409p:plain 全てのシナリオに共通しているのは、イベントをトリガーとして処理を行っていること。

よくある話で既存の大きなスクリプトをそのまま用いて、スクリプトの動作に時間がかかることがある。
そういう使いかたは好ましくない。既存のスクリプトを分割する。

その他のFunctions1.0のお話
  • ログ収集
    Application Insightを使用する。
    Application Insightはこれから日本リージョンで使えるようになる。

  • プロキシ、スロットあるよ。

Azure Functions 1.0における課題点

f:id:tt-suzukiit:20181122181457p:plain

ここから2.0のお話

Function2.0 GAのアナウンス

f:id:tt-suzukiit:20181122181627p:plain ↑の5点を押さえておけば大丈夫

  • 言語環境の変更 Functionsが言語別に分割された。 →立ち上がりが早くなる →クイックスタートのビューが変更 内部のランタイムが.NET Coreに変わった

  • 新しいプラットフォーム 待望のLinux対応 インスタンスを使った分だけという需要がある

Azure Functionsのホスティングプランについて

f:id:tt-suzukiit:20181122182312p:plain プランに関して何を使っていいかという質問が多い

  • コンサンプションプラン

    • 実行1回ごとの課金
    • 迅速で無限大のスケールアウト
      インスタンス0のスケールインがあるので時間がかかってしまう(コールドスタート)。
  • App Service Plan

    • 時間ごとの課金
    • オートスケールが遅い 2分から3分くらい
    • 仮想ネットワークに接続可能
プランに関してはコンサンプションプランで使える仕組みにするのがいい

f:id:tt-suzukiit:20181122183357p:plain * 理想はコンサンプションプランを使う * 課金を定額の課金にしたければApp Service Planを用いる(↑に記載のデメリットあり)

2.0から「Functions プレミアム プラン(プライベートプレビュー)」が登場

f:id:tt-suzukiit:20181122182936p:plain 今までの2つのプランのあいのこ、いいとこどり

コールドスタートは2.0で最適化された

f:id:tt-suzukiit:20181122183040p:plain Functionsを長く使っていないことでインスタンスが0になってしまうことで発生。
2.0で最適化された

FunctionはOSSプロジェクト

f:id:tt-suzukiit:20181122183738p:plain github.com

Visual Studioからでもビジュアルを変えず編集できる。
デバッグのコールスタックでFunctions中のコードもステップインしていくことができる。

モニタリングはApplication Insightを用いる。

パッケージからの実行が追加

f:id:tt-suzukiit:20181122184131p:plain パッケージからの実行が追加される。
使用中のファイルがロックされない。 起動も早くなる。

Functions 開発パイプライン

f:id:tt-suzukiit:20181122184343p:plain

Durable Functions

f:id:tt-suzukiit:20181122184600p:plain ↑がFunctionsの弱点

Durable Functions 複数のFunctionsをオーケストレーションする仕組み f:id:tt-suzukiit:20181122184722p:plain

Functions 1.0 から 2.0の移行方法

f:id:tt-suzukiit:20181122184835p:plain 言語のランタイムバージョンが変わっていることに注意

2.0ユースケース

イベントストリーミング

f:id:tt-suzukiit:20181122185109p:plain

  • イベントハブは受け身
  • イベントグリッドは自らイベントをとってくる
  • イベントの発生がどこなのかで判断する コスモスDBと、つなげる場合はパーティションすることをわすれない
ワークフロー自動化

f:id:tt-suzukiit:20181122185225p:plain

  • イベントかトランザクションかで、イベントグリッドかキューかを選択する
  • 順序を保持するか
サーバーレスWebAPI

f:id:tt-suzukiit:20181122185347p:plain functionsだけでapiを作るのは危険
セキュリティ部分を外部に出す(waf、apimanafement)

まとめ

f:id:tt-suzukiit:20181122185433p:plain

以上です。他のセッションもまとめています

onarimonstudio.hatenablog.com

【基礎】Azure Functions 2.0でhttp要求をトリガーにして"Hello World"を出力する

最近"サーバーレスアーキテクチャ"として話題のAzure Functionsを学んでいこうと思うので、
情報を共有していこうと思います。

Azure Functionsについてはほとんど触ったことがなかったので、
お恥ずかしながら、基礎の基礎的な内容から始めていきます。

Azure Functionsの概要

docs.microsoft.com

Azure Functions は、小規模なコード ("関数") をクラウドで手軽に実行できるソリューションです。 目の前の問題に必要なコードだけを記述すればよく、アプリケーション全体や、コードを実行するインフラストラクチャのことを考える必要がありません。

サーバーレスアーキテクチャとは

読んで字のごとく、サーバーを気にしないアーキテクチャのことです。
アプリ作成時にサーバーのことを気にしなくていいので、
周りのインフラを気にせず、コードのみに集中することができます。

azure.microsoft.com

実装

ポータルからAzure Functionsを作成する

f:id:tt-suzukiit:20181121202038p:plain

開発環境の選択で「ポータル内」を選択

今回はとても簡単な開発のため、Azureポータル内で編集します。 f:id:tt-suzukiit:20181121202101p:plain

「webhook + API」を選択

今回はHTTP要求をトリガーとするので「webhook + API」を選択する。 f:id:tt-suzukiit:20181121202108p:plain

コードが生成されるので、変更して保存する。

「Hall0」から「Good Morning!!」にコードを変更して保存ボタンをクリックする f:id:tt-suzukiit:20181121202119p:plain

関数のURLをコピーする

f:id:tt-suzukiit:20181121202124p:plain

URLをブラウザで叩いて実行する

メッセージが出力できることを確認できた。 f:id:tt-suzukiit:20181121202724p:plain
確かにインフラのことを全く気にすることなく、
コードのみを変更してアプリを実装できることがわかっていただけたと思います。

Chorme拡張の「Restlet Client」を使って実行すると「401 Unauthorized」エラーになる

原因調査中 「POSTMAN」だったら動いた。

次回予告

先日参加した"Microsoft Tech Summit2018"でマイクロソフトの服部さんが発表された
「今日から始める Azure Functions 2.0」のセッションの要約を行いたいと思います。

【追記】記事作りました。 onarimonstudio.hatenablog.com

Microsoft Tech Summit 2018 セッション要約「クラウド ネイティブなセキュア アプリケーションの作り方に PCI DSS を添えて」

登壇者情報

シグマコンサルティング株式会社
冨田さん

株式会社 kyrt
近江 武一

セッション内容まとめ

セッション資料

www.slideshare.net

安全とは

  • 安全とは危険を考えること
  • 危険を回避する行動が計画され、実行されていること
  • 安全のためには危険を認識する必要がある

金融におけるリスクとは

f:id:tt-suzukiit:20181120184829p:plain
用語集 ダウンサイドリスク「リスク管理」

  • 期待していた結果に対する揺れの幅
  • いい結果でも期待していた結果がでなければリスクである
    →アップサイドリスク

PMBOKにおけるリスクとは

  • リスクとは、それが発生すれば少なくともスコープ、スケジュール、コスト、品質といった
    プロジェクト目標に影響を与える不確実な事象・状態

つまり

  • リスクには定義がある
  • 金融の世界のリスクと、プロジェクトマネジメントの世界のリスクは、ほぼ同じ意味で定義されている。

こんなのはセキュアじゃない

f:id:tt-suzukiit:20181120185038p:plain

  • OSにはパッチを当ててはいけないと信じている
  • 誰かに相談したら「特定のアプアライセンス製品を入れないと認証準拠できない」と言われたのでかった。
  • 台帳で管理しろと言われたので、何に使うかわからないけど大量のEXCEL台帳を作った。
  • いろんなものが秘伝のたれで動いている。

本セッションでいいたいこと

f:id:tt-suzukiit:20181120185509p:plain

セキュアなアプリケーションの定義

f:id:tt-suzukiit:20181120191024p:plain

必要な人だけが必要な情報にアクセスできる仕組みを備えている
  • 認証と認可の仕組みが備わっている。
何かにアクセスしたというログが残る仕組みを備えている
  • Azureのリソースを追加・変更・削除したログ(アクテビティログ)
  • アプリケーションに対するアクセスログ(アクセスログ)
  • データに対してアクセスしたログ(監査ログ)

Key Goal Indicator(KGI)

クラウドは「脅威」なのか「好機」なのか
クラウドはセキュリティリスクではなく好機である f:id:tt-suzukiit:20181120190137p:plain

Key Performance Indicator(KPI)

  • PCI DSSの要件に対してどれだけ準拠できているか

情報セキュリティ - CIA

クラウドネイティブなセキュリティ f:id:tt-suzukiit:20181120192708p:plain * Confidentiality(気密性)
* Integrity(完全性)
* Availability(可用性)

CIA対策の方針
  1. 認証、アクセス制御
    AzureAD認証、RBAC、SQL Database アクセス制御
  2. 不正アクセス防止
    ネットワーク分離、セキュリティパッチ適応
  3. 操作、監査、ログ、監視
    Activity Log、Diagnotics Log、Azure Monitor
  4. 暗号化 -鍵管理
    Azure Key Vault

認証、アクセス制御

ネットワーク、サーバー、データベース等の設置、設定変更、撤去への認証とアクセス制御
  • 重要:すべてのリソース構成、設定はアクセス制御化でコード実施可能
  • 適切なアクセス制御とコードによる設定を実装した環境下では、構成基準が明確化され、定期的な確認も現実的に実行可能となる。
    PCI DSS要件では構成基準の作成と、保持を求めている。
  • Azureではリソースの作成時に、ユーザー指定の管理アカウントを作成する。あるいはランダムに作成したキーを使用する。
    PCI DSS要件

Azure Resources

Azure Resourcesが持つアクセス制御機能
  • SQL Database
    User,Login
  • Cosmos DB
  • Azure Key Vault
    Data Planeアクセス
  • Azure Storage
    Shared Access signature(SAS)

Unauthorized Access -不正アクセス

AAD認証を経由した不正アクセス
  • パスワード漏洩
    →MFA、パスワードロック
  • 内部犯行
    →暗号化、監査ログ
経由しないアクセス
  • ネットワークセキュリティ →VNet、NSG、LB
  • セキュリティパッチの自動化
    →PaaS利用
  • 多段防御・・攻撃を受けた場合多段な防衛線は効果的
    • Vnetにサービスを配置
    • 役務ごとにサブネットを割り当てる
    • サブネット間の通信はNSGで制限する
    • データは暗号化して保存する
    • 鍵管理はKey Vaultを利用する
不正アクセスへの防御は、脅威分析を行い軽減策を検討する
ネットワーク分離と通信制
  • 仮想ネットワーク(VNet)で、専用のプライベートアドレス空間を用意し、外部からのアクセスを制限
  • VNetへのアクセスは、AzureLB(L2)、AzureGateway経由とする
  • Subnet間通信をNetwork Security Group(NSG)で必要なものだけに制限
  • SQL Database棟等のマネージド・サービスとの通信は、Virtual Network Service Endpointで制限

ログ、監視

ログの種類
  • Application Log
    アプリケーションによって作成されたログ
  • Diagnotics Log
    • Tenant log:Azure ADなどSubscriptionの外側で作成されるログ
    • Resource log:NSGや、StorageなどResourcesが生成するログ
  • Activity Log
    • 主にAzure Resource Managerで発生したアクテビティを記録
    • リソースの作成、更新、削除など
ログの保管
Application Insight
  • アプリケーションログの保存に利用。
  • 容量が増えやすいログが多いので容量課金ではない。
  • SQL分のトラッキングなどリッチなクライアントライブラリ
  • 高速で柔軟なクエリが可能。
Log Analytics
  • AzureResource、インフラのログ
  • 容量課金で長期保存向け
  • 主にインフラのログ用
  • 監査などで保存期間が定められている場合にも対応

暗号化、鍵管理

データの暗号化
  • 暗号化自体のコストは低い →AzureではデフォルトでSQLDatabase, Storageなどの内容は暗号化される。

  • 問題は鍵管理 →鍵管理のために、Azure Key Vaultがある

Azure Key Vaultへのアクセス
  • 管理プレーンへのアクセスはAzureAD+RBACで保護
  • データプレーンへのアクセスはアクセス権で保護
仮想ネットワークサービスエンドポイント
  • 特定の仮想ネットワークからのみアクセス可
  • 制限はデータプレーンのみ
お得情報
  • Azure Key Vaultは高度なセキュリティが求められているアプリでなくても使うと便利。
  • Webとバッチで別のWeb Appsになっていて、設定が2か所のAppSetingsに分かれてしまうなどの場合、簡単に便利に使える

最後に

f:id:tt-suzukiit:20181120201628p:plain Azureでは、セキュアで低コストなサービスがそろっているので、使いましょう。 自分で作ったら負けです。

以上です。他のセッションもまとめています

onarimonstudio.hatenablog.com

Microsoft Tech Summit 2018 セッション要約「企業内ネットワークでも Azure PaaS でビジネスをスピードアップ! ~今知っておくべき PaaS と VNET のイイ関係~」

登壇者情報

日本マイクロソフト株式会社
クラウド&ソリューション事業本部 インテリジェントクラウド統括本部
テクノロジーソリューションプロフェッショナル

小丸さん

セッション内容まとめ

Azure PaaSのタイプ

Azure App Serviceプラン

f:id:tt-suzukiit:20181119174155p:plain

  • 社内システムを内製化したいお客様が増えている
  • 早くやりたい
  • アジャイル開発
    ↑PaaS向き

Azure PaaSタイプは大きく分けて2つある

マルチテナント型

比較的安く、スケールメリットがある。 デプロイやスケールの速度が速い。 f:id:tt-suzukiit:20181119174749p:plain
マルチテナント型の主なサービス

  • Azure App Service
  • Azure Storage Services
  • Azure SQL Database
  • Azure CosmosDB
  • Azure KeyVault
  • Azure Database services for PostgreSQL
  • Azure Database services for MySQL
  • Azure SQL Datawarehouse
  • Azure Event Huubs
  • Azure service bus
VNETインジェクション型

仮想ネットワークにデプロイできるサービス。 少し割高、比較的小規模でデプロイやスケールに時間がかかる。
f:id:tt-suzukiit:20181119175341p:plain

Public型のセキュリティ

IPフィルタリング

f:id:tt-suzukiit:20181119182805p:plain パブリックIPアドレスでアクセス制限を行う。

IPフィルタリングの注意点
  • 同じパブリックIPを持つ組織はだれでもアクセスできる。

    • 同じ組織のNATルーターからのアクセス。
    • ExpressRouteMSぴあリングのNATルーターからのアクセス。
    • 送信元IPアドレスを共有しているタイプのサービスからのアクセス f:id:tt-suzukiit:20181119183949p:plain
  • Azure仮想マシンからのアクセスでは下記の問題がある。

    • Azure仮想マシンにパブリックIPを割り当てたくない。
    • その場合、Azure仮想マシンからのOutBound通信のIPは不定
    • パブリックIPアドレスが変わった場合、新たなオーナーからアクセスされるリスクがある。
サービスエンドポイント

Azureサービスへのアクセスを特定のサブネットからのみに限定できる。 f:id:tt-suzukiit:20181119184330p:plain f:id:tt-suzukiit:20181119185128p:plain

サービスエンドポイントポリシー(Preview)
セキュリティ グループ サービス タグ

NSG + サービスタグによるOutbound規制を行う Azure のセキュリティ グループの概要 | Microsoft Docs

PaaSのセキュリティについてまとめ

PaaSのセキュリティにはサービスエンドを使おう。 ためならIPフィルタリングを使う。

App Service Environment

AppServiceを仮想ネットワーク上に配置できる。 これを使っている人は内部で閉じて使う人がほとんど。 f:id:tt-suzukiit:20181119190142p:plain

その他サービス紹介

ここから先のサービスについてはいまいち理解がしきれなかったのですが、 とりあえず、情報だけ載せておきます。 あとあと、編集すると思います。

Azure Firewall FQDN Tag

docs.microsoft.com
+10万ぐらいの費用かかる f:id:tt-suzukiit:20181119190414p:plain

ProjectSwiftとPaaSのVNET統合の新しいパターン

f:id:tt-suzukiit:20181119190826p:plain f:id:tt-suzukiit:20181119190855p:plain

AppServiceの新しいVNET統合(プレビュー)

f:id:tt-suzukiit:20181119191012p:plain

Azure Container Instancesの場合(プレビュー)

f:id:tt-suzukiit:20181119191106p:plain

Azure Database/DWHの場合

f:id:tt-suzukiit:20181119191254p:plain

AppServiceVnet統合の今後のロードマップ

f:id:tt-suzukiit:20181119192553p:plain

  • Vnet統合は2018年までにAppServiceが対応するようになります。
  • 2019年以降にAppServiceでPrivateIPを振ることができるようになります。←実質閉域のAppService
  • blobストレージにもPrivateIPつくようになるよ。

MicrosoftはPaaSに注力していく宣言

以上です。他のセッションもまとめています

onarimonstudio.hatenablog.com

Microsoft Tech Summit 2018 セッション要約「これから始めるコンテナーの基本と始め方」

登壇者情報

日本マイクロソフト株式会社
マイクロソフトテクノロジーセンター
Azure テクニカル アーキテクト

吉田 雄哉さん (パクえさん)

セッション内容まとめ

コンテナーについて

f:id:tt-suzukiit:20181116174056p:plain アプリケーション、ミドルウェア、ランタイムをまとめるものだよ。
コンテナの中をガンガン変更するのは適していない。

f:id:tt-suzukiit:20181116174907p:plain OS上で動くので、一つ一つはアプリのようなものです。

f:id:tt-suzukiit:20181116175151p:plain コンテナとOSは分離しているので、
OSの影響を受けづらく、OSより下を変更しやすい。

f:id:tt-suzukiit:20181116175256p:plain コンテナへの詰め込み作業はプログラムで実行する。
そのため、自動化しやすく、手順をバージョン管理できる。

コンテナが使われるケース

f:id:tt-suzukiit:20181116175725p:plain

リフト&シフト

OSから切り離して、運べる。

DevOpsのプラットフォーム

f:id:tt-suzukiit:20181116183443p:plain

マイクロサービスやサーバーレス

コンテナどうしがセパレートになっているのでとても使いやすい。

配布
  • 開発環境を揃えたい
  • これを使ってビルド、開発する
  • アプリケーションを配る
  • 環境の提供

コンテナ採用に当たり考えること

f:id:tt-suzukiit:20181116180520p:plain 方針がとても重要 「方針」→「スタイル」と考えたうえで手段として「コンテナ」を選択する。

ロックインは引っ越しができるのであれば、そんなに悪いことではない。

コンテナはソースコードでできているので、ソースコードが一番重要。

コンテナ関連のサービス

Container Instance

AzureでDockerが動く環境を用意してくれる。
課金が秒単位
手軽に使えていいが、どちらかというとインスタント環境に使用してください。

Azureポータルのプレビュー

Azureポータルはプレビュー版が使える。

Container Registry

azure.microsoft.com

App Service

コンテナ使える。Linux版は裏はコンテナを使ってる。
イメージドッカーでコンテナを選択する。

Azure Kubernetes Service(AKS)

azure.microsoft.com
AKSについては、このページがよく書かれているので見てください。
AKS使用者の例や使用例などが載ってる。

ぱくえさん 一番おすすめの本

f:id:tt-suzukiit:20181116183038p:plain

Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services

Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services

以上です。他のセッションもまとめています

onarimonstudio.hatenablog.com