Azure DevOps: 組織とプロジェクトを作成する

Michaelです。

今回は、Visual Studio Team ServicesがリブランドされたAzure DevOpsを検証していきます。
まずは、Azure DevOpsの使い始めとして組織とプロジェクトを作成していきます。

Azure DevOps概要

Azure DevOpsは、アプリケーションの共同開発、運用を支援するクラウドサービスです。従来、このサービスはVisual Studio Team Services (VSTS)として提供されており、VSTSの機能が個々のサービスとして切り出され、Azure DevOpsのサービス群としてリブランドされています。
Azure DevOpsには、以下の5つのサービスが含まれており、計画、開発からデプロイ、自動化に至る一連の開発、運用を管理できます。

 サービス  概要
Azure Boards かんばんボード、バックログ、チームダッシュボード、およびカスタムレポートによる作業追跡
Azure Repos 無制限のクラウドホスト型プライベートGitとTFVC(Team Foundation Version Control)リポジトリ
Azure Pipelines あらゆる言語、プラットフォーム、クラウドで動作するCI / CDパイプライン
Azure Test Plans オールインワンの計画的で探索的なテストソリューション
Azure Artifacts パブリックおよびプライベートのソースの Maven、npm、NuGet のパッケージを作成、共有

組織とプロジェクトの作成

Azure DevOpsのサービス群を使用するには、組織とプロジェクトを作成する必要があります。
組織の作成は、こちらのリンクを開いてAzure DevOps の組織を作成するMicrosoftアカウントにサインインします。
初めて組織を作成する場合は、そのまま組織作成ウィザードへ遷移するため「Continue」をクリックして作成を開始します。

任意の組織名とプロジェクトをホストするリージョンを入力して「Continue」をクリックすると、組織の作成が開始されます。

組織の作成が終わるとAzure DevOpsのポータルが表示され、そのまま新規プロジェクトの作成となります。
プロジェクト名とアクセスポリシー、詳細設定としてバージョン管理システムと開発手法を入力、選択します。
詳細設定では、バージョン管理システムに「Git」、および「TFVC」、開発手法として「Agile」、「CMMI」、および「Scrum」が選択可能で、それぞれAzure Reposのバージョン管理、Azure Boardの作業進捗管理に違いが生じるため、開発チームのポリシーに合わせて選択します。

プロジェクトを作成すると概要ページが表示されます。

組織、プロジェクトにユーザーを追加する

プロジェクトにメンバーを追加する場合は、あらかじめ組織にユーザーを追加しておく必要があります。
組織にユーザーを追加するには、「Organization settings」から「Users」を選択し、「+ Add new users」をクリックします。

追加するユーザーとアクセスレベルを設定します。
「Users」にはセミコロン区切り( ; )で複数のユーザーを追加できます。「Add to projects」はユーザー追加と同時にプロジェクトにユーザーを追加することができます。
設定したら「Add」をクリックしてユーザーを追加します。

追加されたユーザーは招待メールに記載されたリンク、またはAzure DevOpsの組織ページ(https://dev.azure.com/{組織名})にアクセスして招待を承諾します。

Microsoftアカウントにログインし、詳細情報を入力していくとAzure DevOpsの組織ページにログインできるようになります。
招待されたユーザーは許可されたプロジェクトにのみアクセスすることができます。

まとめ

今回は、Azure DevOpsの組織、プロジェクト作成とユーザーの追加を行いました。
ユーザーのアクセス権限については開発チームの体制やポリシーによってもっと細かく設定する必要はありますが、Azur DevOpsを使い始めるにあたっての組織やプロジェクトの作成は5分かからずに設定でき、簡単に共同開発の環境を作成することができました。


Azure Functions 2.0を試す ②: Visual Studio CodeでJavaScript関数をデプロイする

Michaelです。
前回、「Azure Functions 2.0を試す ①」にてAzure Functions 2.0のFunction Appを作成しました。
今回は、Visual Studio Code (VS Code)から作成したFunction AppにJavaScript関数をデプロイしてみます。

事前準備

VS CodeからFunction Appに関数をデプロイする方法は、Azure Functions 1.0でも提供されていましたが、2.0へのアップデートに伴って、Function Appの仕組みやランタイムバージョンが変更されているため使用するツールが異なっています。そのため、2.0向けに関数を作成するための事前準備が必要になります。
WindowsでAzure Functions 2.0用JavaScript関数を作成する場合には、以下のツール、ランタイムが必要となるためインストールしていきます。

.NET Core 2.1

.NET Downloads のサイトからOSに合わせた.NET Core 2.1インストーラーをダウンロードしてインストールします。

Node.js 8.5以降

Node version manager (nvm-windows)かNode.jsのインストーラーを使用してNode.js 8.5以降とnpmをインストールします。

Azure Functions Core Tools バージョン 2.x

下記コマンドでAzure Functions Core Tools バージョン 2.xをインストールします。npmでインストールするため、Node.jsを先にインストールしておく必要があります。
[crayon-5f2cae8996d0e628154687/]

Azure Functions 拡張機能

VS Codeの拡張機能から「Azure Functions」を検索して、拡張機能をインストールします。

Azure Functions 拡張機能をVS Codeに追加するとアクティビティバーにAzureアイコンが追加され、サイドバーに「FUNCTIONS」の領域が追加されます。

VS CodeでAzureにログイン

サイドバーの「Sign in to Azure」をクリックすると、ウィンドウ右下にメッセージが表示されます。
メッセージの「Copy & Open」をクリックすると、ブラウザのログインページに誘導され、クリップボードにログイン用のコードがコピーされます。

ログインページのテキストボックスにログイン用のコードを入力して続行をクリックすると、そのままMicrosoftアカウントのログインページとなるため、使用するAzure サブスクリプションでログインします。

ログインに成功するとサイドバーにログイン中のサブスクリプションが表示されます。

プロジェクトの作成

はじめに、Function Appに関数を発行するためのプロジェクトを作成します。
「FUNCTIONS」領域にマウスオーバーで表示される「Create New Project」アイコンをクリックするとウィンドウ中央上部に対話形式でプロジェクトを作成するダイアログが表示されます。
まずは、プロジェクトを作成するフォルダを選択します。プロジェクトは1つのFunction Appに相当するため、複数Function Appを作成する予定であれば、プロジェクトごとにフォルダ分けします。

続いて、言語を選択します。今回はJavaScript関数を作成するため、「JavaScript」を選択します。

最後にプロジェクトをどこで開くか選択します。今回は既存のVS Codeのワークスペースに追加して作業するため「Add to workspace」を選択します。

以上を行うと、そのままダイアログが終了します。プロジェクト作成で選択したフォルダを開くと、Function Appの設定ファイルが自動で作成されていることを確認できます。

関数の作成

プロジェクトが作成出来たら、関数を作成します。今回は、HTTPトリガーの関数を作成していきます。
プロジェクト作成時と同様に「FUNCTIONS」領域にマウスオーバーし、「Create Function」アイコンをクリックします。

ウィンドウ中央上部に表示される対話形式のダイアログに沿って作成を進めます。
はじめに、関数を作成するプロジェクトを選択します。

続いて、作成する関数のテンプレートを選択します。今回は、HTTPトリガーの関数を作成するため、「HTTP trigger」を選択します。

関数名を入力します。関数名は、デフォルトではAPIエンドポイントのパスになります。

「HTTP trigger」のテンプレートでは、APIのアクセスレベルを設定します。「Anonymous」はパブリックアクセスが可能な権限、「Function」、「Admin」はそれぞれアクセスにAPIキーが必要な権限が割り当てられるので、必要に応じて設定します。

設定が終わると、ダイアログが閉じて「HTTP trigger」テンプレートのコードが表示されます。
テンプレートのコードは、クエリ、またはリクエスト本文の「name」の値を読み取って、「Hello {name}」のレスポンスを返すものになっています。


[crayon-5f2cae8996d28004632210/]

関数のテスト

Azure Functions Core Toolsをインストールしているため、作成した関数はローカル上でテストできます。
テストする場合は、F5キーでVS Codeのデバッグモードを実行します。
デバッグを開始するとウィンドウ下のターミナルにログが流れ、関数のローカルホストのURLが表示されます。

URLをブラウザに入力し、クエリに「name=Michael」を追加して開くと、「Hello Michael」の文字列が返ってくることが確認できました。

関数が正常に動作することが確認出来たら、デバッグモードを終了します。

Function Appに関数をデプロイ

関数をFunction Appにデプロイします。
「FUNCTIONS」領域にマウスオーバーし、「Deploy to Function App」アイコンをクリックします。
ウィンドウ中央上部に表示される対話形式のダイアログで、まずデプロイするプロジェクトを選択します。

続いて、デプロイ先のFunction Appを選択します。

確認用のダイアログウィンドウが表示されます。デプロイするとFunction Appの関数がすべて上書きされてしまうため、デプロイ先が正しいことを確認して「Deploy」をクリックします。

ウィンドウ右下にデプロイ中のメッセージが表示されるため、完了になるまで待機します。

AzureポータルのAzure Functionsを開くと関数が追加されていることが確認できました。

デプロイした関数の使用

デプロイした関数を実際に使用してみます。
Function App上の関数のURLは、サイドバーの「FUNCTIONS」のツリーからデプロイした関数を探して、右クリックメニューの「Copy Function Url」を選択します。

コピーしたURLをブラウザに入力し、ローカルデバッグと同様にクエリに「name=Michael」を追加して開くと、「Hello Michael」の文字列が返ってくることが確認できました。

まとめ

VS Codeを使用したAzure Functionsの開発は、関数の作成からデバッグ、デプロイまでの一貫して1つのウィンドウで行えるため非常に便利です。
デバッグに関してはローカル上で行うことができるため、余計なコストをかけることなく実施できることもメリットです。


Azure Functions 2.0を試す ①

Michaelです。

今回は、Microsoft Ignite 2018でGAが発表されたAzure Functions 2.0の変更点とリソースのデプロイについてご紹介します。

Azure Functions 2.0の変更点

Azure Functions 2.0では、1.0から多くの変更が加えられています。

言語とランタイムバージョン

Azure Functions 1.0では、1つのFunction Appで複数の言語の関数を実行することができました。
Azure Functions 2.0では、1つのFunction Appで対応する言語が1つに限定され、言語に合わせたホストの最適化によるパフォーマンス向上が図られています。
また、対応する言語とランタイムバージョンも変更されています。対応言語とバージョンは以下のようになります。

言語 Functions 1.0 Functions 2.0
C# GA (.NET Framework 4.7) GA (.NET Core 2)
JavaScript GA (Node 6) GA (Node 8、10)
F# GA (.NET Framework 4.7) GA (.NET Core 2)
Java × プレビュー (Java 8)
Python 試験段階 Linuxホストでプレビュー (Python 3.6)
TypeScript 試験段階 JavaScript へのトランスパイリングでサポート
PHP 試験段階 ×
バッチ (.cmd、.bat) 試験段階 ×
Bash 試験段階 ×
PowerShell 試験段階 ×

トリガーとバインド

Azure Functions 2.0では、HTTP トリガーとタイマートリガーを除いて、関数で使用するトリガーとバインドを拡張機能としてインストールするように変更されています。これに伴って、関数の function.json やプロパティにいくつかの変更が生じています。

開発/実行環境

Azure Functions 2.0のランタイムは .NET Core 2 で実行されるようになり、macOSやLinuxなど、.NET Core でサポートされるすべてのプラットフォームで実行できるようになりました。Azure Functionsだけでなく、PC、オンプレミス、エッジデバイスといった様々なデバイス上で開発、実行ができるようになっています。

ホスティングプランとSLA

従来、App Serviceプランのみ99.95%のSLAとなっていましたが、新たに従量課金プランでも99.95%のSLAが適用されるようになりました。
また、App Serviceプランのみでしか利用できなかったLinuxホストが従量課金プランでも利用できるようになりました。

Durable Functions

関数のオーケストレーションが可能なDurable FunctionsがGAになりました。

1.0から2.0への移行の注意点

Azure Functions 2.0では大幅な変更が加えられているため、1.0から2.0への移行は、2.0のFunctions Appを新規作成して、手動で関数コードを移植する必要があります。
この時、ランタイムバージョンやトリガー、バインドなど2.0で変更された箇所に関しては、ランタイムバージョンやAPIの互換性に合わせてコードを書き直す必要があります。

リソースの作成

Azureポータルでは、Azure Functions 2.0のリソースを作成できるようになっています。
リソースを作成する場合、「+リソースの作成」、もしくはApp Service画面の「+追加」から「Function App」を検索します。

表示されるペインのテキストボックスに必要事項を入力していきます。
項目の中にAzure Functions 1.0ではなかった「ランタイムスタック」が追加されており、Function Appで使用する言語を選択できるようになっています。
すべて入力したら、「作成」をクリックしてFunction Appを作成します。

作成できたFunction Appを開いて、関数を新規作成するとこれまでとは異なる画面が表示されます。
「JavaScript用のAzure Functions - 作業の開始」とあるようにFunction AppがJavaScript専用に作成されていることがわかります。

まとめ

Azure Functions 2.0では、言語やバインドの扱いなど多くの点で変更が行われており、1.0から2.0への移行には注意が必要です。しかし、変更に伴って最適化が進んでおり、2.0に移行することで関数のパフォーマンス向上が期待できるため、既存のFunction Appも早い段階で2.0に移行していきたいものです。
次回からは、変更になった点を中心にAzure Functions 2.0を検証していきます。


Azure VMでData Science Virtual Machinesをデプロイする

Michaelです。

今回は、データサイエンスに特化したVM「Data Science Virtual Machines」の概要とリソースのデプロイについてご紹介します。

Data Science Virtual Machines概要

Data Science Virtual Machines (DSVM)は、データサイエンス専用にカスタマイズされたVM イメージで、データ分析や機械学習、ディープラーニングのトレーニングで使われる一般的なツールがプリインストールされています。
DSVMには、以下3つのエディションが用意されており、使用する目的に合わせてエディションを選択できます。いずれのエディションもマシンイメージの使用料は無料となっており、使用するVMインスタンスの時間課金のみで利用することができます。

エディション Windows Linux
2016 2012 Ubuntu CentOS
Data Science Virtual Machine
Deep Learning Virtual Machine ディープラーニング向けにチューニング × ×
Geo AI Data Science VM with ArcGIS ESRI 社のArcGIS Proを追加して地理空間分析機能を強化 × × ×

「Data Science Virtual Machine」に関してはWindows (2016、2012)とLinux (Ubuntu、CentOS)の4つのOS、およびバージョンがサポートされますが、プリインストールされるツールが一部異なっています。

大まかに、WindowsではMicrosoft Office Pro-Plus (要Officeライセンス)やPower BI DesktopといったOfficeスイートが搭載され、Linuxでは、Chainer、Caffe、Keras等のディープラーニングフレームワークが充実しているというような差異があります。

※含まれるツールの詳細はこちらを参照ください

対応インスタンスとリージョン

DSVMは、GPUインスタンスのNC (v1)、NCv2、NCv3、およびNDシリーズのみでデプロイできます。

2018年11月現在でこれらのインスタンスが利用できるリージョンは以下の通りです。

日本 米国 アジア太平洋 ヨーロッパ カナダ イギリス オーストラリア インド 韓国
製品 西日本 東日本 米国西部 2 米国中南部 米国中北部 米国東部 米国東部 2 東南アジア 西ヨーロッパ 北ヨーロッパ カナダ中部 英国南部 オーストラリア東部 インド中部 韓国中部
NC シリーズ
NCv2 シリーズ
NCv3 シリーズ H1
2019
Q1
2019
Q2
2019
ND シリーズ

日本の国内リージョンでは、NVIDIA Tesla V100搭載のNCv3シリーズが2019年上半期に東日本でGA予定となっており、それまでは海外リージョンでしかDSVMを利用できません。

クォータを確認

サブスクリプションに対してGPUインスタンス作成に制限が掛けられている場合があるため、DSVMインスタンスを作成する前に、インスタンスのクォータを確認します。

Azureポータルの「すべてのサービス」⇒「サブスクリプション」を選択して、インスタンスを作成するサブスクリプションを選択します。

メニューから「使用量+クォータ」選択し、検索フィルタを設定してクォータを表示します。
検索フィルタにはDSVMが利用できるNC、NCSv2、NCSv3およびNDSのvCPUについて、使用するリージョンのすべてのクォータを表示するように設定します。

作成予定のインスタンスファミリのvCPUクォータ残数を確認します。
作成するインスタンスのvCPU分のクォータが残っていない、もしくはインスタンスファミリのクォータがない場合はインスタンスが作成できないため、サポートで制限緩和申請を行う必要があります。
今回は、48 vCPU分のクォータが残っているNC (v1)シリーズの最小スペック「Standard NC6」(6 vCPU)で作成するため制限緩和申請は行いません。

インスタンスの作成

今回は、Windows 2016の「Data Science Virtual Machine」を作成します。

Azureポータルの「+リソースの作成」をクリックし、検索バーに「DSVM」を入力して検索します。
検索結果の中から「Data Science Virtual Machine – Windows 2016」を選択して、作成をクリックします。

インスタンスサイズの諸設定を入力していきます。今回は、インスタンスサイズに「Standard NC6」を選択しますが、NC (v1)シリーズのインスタンスを選択する場合にはディスクのオプションで必ず「Standard HDD」を選択する必要があります。
ネットワーク等、その他の設定に関してはデフォルト設定のまま進めても構いません。

基本

ストレージ

ネットワーク

管理

ゲストの構成

一通りの設定が完了したら確認画面が表示され、設定の検証が行われます。「検証が成功しました」の緑のチェックが表示され、設定事項に誤りがないことを確認したら「作成」をクリックしてインスタンスを作成します。

設定に沿ってVMインスタンスやネットワークインターフェースが作成されていきます。作成完了までは10~20分程度の時間がかかります。
すべてのリソースが作成されると「デプロイが完了しました」の表示とともに「リソースに移動」のボタンが表示され、作成されたインスタンスを確認することができます。

VMインスタンスへの接続

DSVMインスタンスが作成されたので、作成したインスタンスに対してリモートデスクトップ接続を試してみます。

作成したVMインスタンスの「概要」ページで「接続」ボタンをクリックします。表示されるブレードの「RDP」タブを開き、「RDPファイルのダウンロード」をクリックしてRDPファイルをダウンロードします。

ダウンロードしたRDPファイルを開くと自動的にVMインスタンスへのリモートデスクトップ接続が始まります。接続の際、VMインスタンスのWindows認証が表示されるため、インスタンス作成時に設定したユーザー名とパスワードを入力してログインします。

接続に成功するとWindows Server 2016のデスクトップが表示され、JupyterやPowerBIといったツールがインストールされていることが確認できます。

まとめ

DSVMは、使用できるインスタンスタイプの制限から現状で海外リージョンしか使用できないことや、サブスクリプションのクォータ制限によって下準備が思いのほか大変になることがあるため、若干利用する敷居は高くなっています。
ただ、デプロイさえすればツールをインストールする手間がなく、すぐにデータ分析やAI開発を始めることができるため、データ分析、AI開発やGPGPUのコンピューティングリソースとしての検証から使い始めてみてはいかがでしょうか。


雑コラBOTを作ろう⑦: Azure Functionsで画像加工をして雑コラを作る

Michaelです。

「雑コラBOT」の作成の過程からAzure Functionsの設定方法を紹介する「雑コラBotを作ろう」の7回目です。
今回は、いよいよ「雑コラ」を作る仕組みを作成し、雑コラBotを完成させます。

構成

画像処理用のPython関数に画像処理ライブラリを追加して、画像に顔を貼り付けられるようにします。
貼り付ける顔画像は、Blob Storageから取得します。

画像の準備

貼り付ける顔の画像を用意します。
画像は何でもいいですが、今回はFace API貼り付ける人物の顔をFace APIで検出して、顔の範囲を切り出したものを用意しました。

画像のファイルはBlob Storageの任意のパスにアップロードしておきます。

 

バインドの設定

貼り付ける顔画像を取得するためのバインドを設定します。
画像処理用の関数の「統合」メニューで「+新しい入力」をクリックし、「Azure BLOB ストレージ」バインドを選択します。
「Azure BLOB ストレージ input」のパスには、先ほどの画像を保存したBlob Storageのパスを指定し、保存をクリックします。

ライブラリのインストール

PythonライブラリをAzure Functionsにインストールします。
今回は、Pythonの画像処理ライブラリ「Pillow」を使ってコラ画像を作成するため、KuduのCMDコンソールで下記のコマンドを入力し、「Pillow」をインストールします。
※ ライブラリのインストールに関してはこちらの記事 も参照ください。
[crayon-5f2cae8998103116207897/]

スクリプト

スクリプトは以下のように作成しました。
[crayon-5f2cae8998113283899153/]

スクリプトの説明

  1. ライブラリの読み込み
    必要なライブラリを読み込みます。
    画像処理用の「Pillow」とBytes型で保持している画像データをPillowで読み込めるように「io」を追加しています。
  2. 画像データをPillowの形式に変換
    Bytes型の画像データをPillowで読み込みます。
    ここで、顔画像も同時に読み込んでおきます。
  3. 検出した顔の位置・サイズ情報を取得
    Face APIで顔を検出した顔のサイズを取得します。
    検出結果の「faceRectangle」キーから、顔の左上端の座標と顔の幅・高さのピクセル数が取得できます。
  4. 顔画像のリサイズ
    貼り付ける顔画像を貼り付け先の顔のサイズにリサイズします。
  5. 顔の貼り付け
    リサイズした顔画像を貼り付けます。
  6. 画像の出力
    Pillowで加工した画像データを保存します。
    Pillowから画像の保存ができるため、画像出力のスクリプトを置き換えています。

 

実行結果

Slackのチャンネルに画像のURLを投稿するとコラ画像が返ってきます

同様に画像を5人の子供の写真に変更しても、雑コラされた

まとめ

「雑コラBot」の紹介含め8回にわたった「雑コラBotを作ろう」は、今回の雑コラBot完成でようやく最終回となりました。このBotを使えば、たくさんのコラ画像を効率的に作成でき、業務最適化に役立てられます。
「雑コラ」なんてしないという方も、これまでに紹介した設定はAzure Functionsを使用する上での基本的なものであるため、Azure Functionsを使う場合にはぜひ参考にしてみてください。

ちなみに完成した「雑コラBot」は、記事作成の過程でパフォーマンス最適化を行ったことで、最初に紹介した雑コラBotと比較してレスポンス時間が1/3~1/2程度まで短縮されました。
次回は、Azure Functionsのパフォーマンス最適化について検証していきます。


雑コラBOTを作ろう⑥: Face APIで顔検出をしてみる

Michaelです。

「雑コラBOT」の作成の過程からAzure Functionsの設定方法を紹介する「雑コラBotを作ろう」の6回目です。
今回からはいよいよ「雑コラ」を作る仕組みを作成していきます。まずは、「雑コラ」を作るうえで重要な顔の位置を特定するために、Face APIを追加して顔の検出をしてみます。

構成

画像処理用のPython関数にFace APIをつなぎ、顔の検出をできるようにします。

Face APIの作成

Face APIを登録して、APIキーを取得します。
Azureポータルの新規作成画面で「Face API」を検索してリソースの作成を開始します。

リソース名、場所を設定します。
東日本リージョンでもFace APIが使えるようになっているので、雑コラBotの構成と同じ「東日本」で作成します。

リソースの作成が完了したらFace APIのリソース画面を開き、APIキーとエンドポイントをコピーして控えておきます。

スクリプト

スクリプトは以下のように作成しました。
[crayon-5f2cae899858b923121604/]
 

スクリプトの説明

  1. Face APIキー情報
    Face API作成時に取得したAPIキーとエンドポイントを設定します。
  2. Face APIへのリクエスト
    Face APIにリクエストし、画像内の顔を検出します。
    今回は、関数でダウンロードした画像の顔検出を行うため、リクエストヘッダの「Content-Type」に「application/octet-stream」を指定し、関数が保持するバイナリデータを直接送信して顔検出を行います。
  3. 顔検出結果の取得
    Face APIで顔を検出し、検出結果を取得します。
    Face APIの顔検出は個々の顔の情報を配列で返すため、配列の要素数を取得してメッセージとしてSlackに出力し、顔検出できていることを確認します。

 

実行結果

Slackのチャンネルに画像のURLを投稿すると顔の検出数がBotのメッセージで返されました。

同様に画像を5人の子供の写真に変更すると、顔の検出数は5となり、正しく顔を検出できていることが確認できました。

まとめ

Face APIを追加して顔検出ができるようになりました。あとは、検出した顔の情報をもとにコラ画像を作成すれば雑コラBotの完成です。
次回は、今回のコードに画像合成の処理を追加して雑コラBotを完成させます。


雑コラBotを作ろう⑤: Azure FunctionsからSlackにメッセージを投稿する

Michaelです。

「雑コラBOT」の作成の過程からAzure Functionsの設定方法を紹介する「雑コラBotを作ろう」の5回目です。
今回は、Azure FunctionsからSlackにメッセージを投稿する関数を作成し、Blob Storageにアップロードされた画像のSAS URLを投稿する仕組みを作ります。

構成

Queue Storageに格納されたメッセージをトリガーに関数を開始し、Blob Storageにアップロードした画像パスからSAS URLを生成して、Slackにメッセージとして投稿します。
投稿されたURLをもとにSlackが自動で画像を読み込み、メッセージに画像が表示されます。

関数の作成

Azure Functionsの関数をJavaScriptで作成します。
関数のテンプレートの一覧から「Queue trigger」を選択してJavaScriptで作成を開始します。

関数の作成ペインで関数名とトリガーバインドを設定します。
キューは画像処理関数でメッセージを出力したキューを指定します。

Slackカスタムインテグレーションの設定

Azure Functionsからメッセージを投稿できるようにSlackの設定をします。
SlackのAppディレクトリから「着信Webフック」を検索し、カスタムインテグレーションに追加します。

「着信Webフック」の設定を開き、メッセージを投稿するチャンネルを設定します。その他の項目は任意で設定をします。
「Webhook URL」は、Azure Functionsからメッセージを投稿する際に使用するため、メモにひかえておきます。

スクリプト

スクリプトは以下のように作成しました。
[crayon-5f2cae89989f1198522917/]
 

スクリプトの説明

  1. モジュールの読み込み
    処理に必要なパッケージを読み込みます。
  2. Slack着信WebフックのURL設定
    Slackに追加した着信WebフックのURLを設定します。
  3. SASトークン発行関数
    Blob Storageに保存された画像のパスからSASトークンを生成します。
    SASトークン発行に関しては、npm の「azure-storage」というパッケージでもっと簡単に記述できますが、パフォーマンスの観点からBlob Storage APIの使用に沿った関数で実装しています。
  4. HTTPリクエスト関数
    URLにHTTPリクエストする関数です。
    npm の「request」パッケージがNode.jsのHTTPクライアントとして一般的ですが、こちらもパフォーマンスの観点から標準パッケージの「https」でリクエスト用の関数を作成しています。
  5. SAS URLの生成
    SASトークン発行関数でBlobのSAS URLを生成します。
  6. 投稿用メッセージの作成
    Slackの着信Webフックのリクエスト形式に合わせてペイロードを作成します。
  7. HTTPリクエスト
    Slackにメッセージを投稿します。

実行結果

Slackのチャンネルに画像のURLを投稿すると、投稿時刻とほぼ同時に関数のログが表示され、Queue Storageとトリガーにより関数が開始されていることが確認できました。

SlackをみるとBotからメッセージが投稿され、URLの画像と同じ画像が表示されることが確認できました。

まとめ

今回は、Azure FunctionsからSlackにメッセージを投稿する仕組みを作成しました。これで、Slackに対してAzure Functionsから疑似的に画像を投稿する仕組みが出来上がりました。
あとは、顔に好きな画像を貼り付けてコラ画像を作成する仕組みをすれば雑コラBotの完成です。
次回は、画像処理関数にFace APIを付け加えてコラ画像作成に必要な顔検出の仕組みを追加します。


雑コラBotを作ろう④: Table StorageにAzure Functionsの実行履歴を保存する

Michaelです。

「雑コラBOT」の作成の過程からAzure Functionsの設定方法を紹介する「雑コラBotを作ろう」の4回目です。

今回は、Azure Functions のTable Storageバインドを設定して、画像処理用Functionの実行履歴をTable Storageに書き込む仕組みを作成します。ついでに、処理結果をSlackに投稿するための関数を起動するキューメッセージをQueue Storageに出力する構成も追加します。

追加する構成

Azure Functionsで画像処理した結果のステータスをTable Storageに出力します。
ついでに、処理結果をSlackに投稿するための関数を起動するキューをQueue Storageに出力する構成も追加します。

バインドの設定

実行結果のステータスを出力するためのバインドを設定します。
関数の「統合」メニューで「+新しい出力」をクリックし、「Azure Table Storage」のバインドを選択します。
「Azure Table Storage output」の設定でステータスを出力するStorage Accountとテーブルを設定し、保存をクリックします。

続けて、メッセージ投稿用の関数を起動するためのQueue Storageバインドも設定します。

スクリプト

スクリプトは以下のように作成しました。
[crayon-5f2cae8998e3d810370470/]

スクリプトの説明

  1. ライブラリの読み込み
    必要なライブラリを読み込みます。
    実行履歴としてダウンロードしたコンテンツのMD5値を書き出すため、「hashlib」を追加しています。
  2. バインド設定の読み込み
    関数に設定しているバインドの設定値を読み込みます。
  3. 出力メッセージ用データ作成
    Queue Storage、Table Storageに出力するデータを作成します。
    キューメッセージ、実行履歴に書き込むBlob Storageの出力パスとコンテンツのMD5値をここで生成します。
  4. 出力メッセージの設定
    Queue Storageに出力するメッセージを設定します。
    後にSlack投稿用関数で使用するための必要な値を含めます。
  5. キューメッセージの出力
    メッセージをQueue Storageに出力します。
    Blob Storageと同様に、環境変数で指定されるパスにファイルとして保存することで書き出すことができます。
  6. 実行履歴の書き込み
    Table Storageに実行履歴を書き込みます。
    Table Storageでは「PartitonKey」、「RowKey」を設定する必要があるため、Queue Storageに出力したメッセージに「PartitonKey」、「RowKey」を追加してTable Storageに書き込みます。

実行結果

Slackの設定したチャンネルにメッセージを投稿すると、Azure Functionsにログが表示され、4秒ほどで関数が終了していることがわかります。

Table Storageを見ると、設定した名称のテーブルが作成されており、関数の終了と同時刻にテーブルにデータが書き込まれていることが確認できました。

同様に、Queue Storageでも関数の終了と同時刻にメッセージが書き込まれていました。

注意点

Table Storageの出力バインドは、データの更新に対応しておらず、PartitionKey、RowKeyの組がすでにテーブルに存在する場合には、「EntityAlreadyExists」の関数エラーが発生します。
ここで注意すべき点は、出力バインドによるデータの追加は関数の実行完了時に行われるため、出力バインドに関わるエラーを関数の例外処理で対処できないことです。出力バインドにTable Storageを使用する場合は、PartitionKey、RowKeyの組がユニークとなるように設定する必要があります。

まとめ

今回は、Azure FunctionsのTable Storageバインドを設定しました。サーバーレスとNo SQL DBは、ログ保存等によく用いられる組み合わせで、Table Storageであれば予約スループットの課金がなく安価に構成できます。
次回は、Blob Storageに保存した画像のSAS URLを発行してSlackに投稿する関数を作成し、今回作成したQueue Storageのメッセージで連携させます。


雑コラBOTを作ろう③: Azure Functionsで画像をダウンロードしてBlob Storageに保存する

Michaelです。

「雑コラBOT」の作成の過程からAzure Functionsの設定方法を紹介する「雑コラBotを作ろう」の3回目です。

前回は、Slackに投稿されたメッセージを整形してQueue Storageに格納し、関数の連携ができる状態にしました。今回は、前回設定したキューメッセージをトリガーに起動する画像処理用Functionを作成し、キューメッセージ内のURLから画像をダウンロードしてBlob Storageに保存するように連携させていきます。

構成

Queue Storageに格納されたメッセージをトリガーに関数を開始し、メッセージ内のURLで画像をダウンロードしてBlob Storageに保存します。

関数の作成とバインドの設定

Azure Functionsの関数をPythonで作成します。
関数のテンプレートの「実験的な言語のサポート」を有効化し、一覧から「Queue trigger」を選択してPythonで作成を開始します。

関数の作成ペインで関数名とトリガーバインドを設定します。
キューは前回作成した関数の出力バインドと同じものを指定にします。

関数が作成されたら、出力バインドを設定します。
関数の「統合」メニューで「+新しい出力」をクリックし、「Azure BLOB ストレージ」のバインドを選択します。
「Azure BLOB ストレージ output」の設定で画像を出力するストレージアカウントとパスを設定し、保存をクリックします。
出力パスには「{blob_path}」のバインディング式を設定しており、前回設定したキューメッセージ(JSON)の「blob_path」キーの値がパスに代入されるようにしています。

Pythonバージョンの変更

関数のPythonバージョンをデフォルトの2.7系から3.6系に変更します。
Python3インストールに関してはこちらの記事 を参照ください。

スクリプト

スクリプトは以下のように作成しました。
[crayon-5f2cae89991eb928273369/]

スクリプトの説明

  1. ライブラリの読み込み
    処理に必要なライブラリを読み込みます。
  2. キューメッセージ読み込み
    Queue Storageに格納されたメッセージを読み込みます。
    Python関数ではファイルから読み込む形でキューメッセージを受け取ります。
  3. コンテンツのダウンロード
    Slackに投稿されたURLからコンテンツをダウンロードします。
  4. 画像フォーマット判定
    ダウンロードしたコンテンツのフォーマットを判定します。
    前段の関数ではURLの有無を確認するのみで、フォーマット判定を行っていないため、ここで判別を行います
    画像フォーマットは後に使うFace APIに合わせ、JPEG、PNG、BMP、GIFのみ処理を続行するようにしています。
  5. Blob Storageに画像を保存
    ダウンロードした画像をBlob Storage に保存します。
    Python関数では、環境変数で指定されるパスにファイルとして保存することでBlob Storageにファイルを書き出すことができます。

実行結果

Slackのチャンネルに画像のURLを投稿すると、投稿時刻とほぼ同時に関数のログが表示され、Queue Storageとトリガーにより関数が開始されていることが確認できました。

Blob Storageをみると、投稿したURLの画像と同じ画像が出力バインドで指定したパスに保存されており、画像のアップロードも正常に行えていることが確認できました。

まとめ

今回は、Queue StorageによるAzure FunctionsのPython関数のトリガーとBlob Storageの出力バインドを設定し、画像のダウンロードと保存までできました。

雑コラBotとしては、これに画像加工を行い、保存した画像をSlackに返送すれば一連の仕組みが完成しますが、次回は少し寄り道をして、Azure Functionsの実行履歴をTable Storageに保存する仕組みを追加します。


雑コラBotを作ろう②: Azure FunctionsのQueue Storage バインドでSlack のメッセージをQueue Storageに格納する

Michaelです。

「雑コラBOT」の作成の過程からAzure Functionsの設定方法を紹介する「雑コラBotを作ろう」の2回目です。

前回は、Azure FunctionsでSlackのオウム返しBOTを作成しました。今回は、Azure Functions同士を連携するために、受けたメッセージからURLを抽出してQueue Storageに格納する仕組みを追加します。

構成

Azure Functionsで受けたSlackのメッセージにURLが含まれる場合に、URLを抽出してメッセージとともにQueue Storageに格納します。

 

バインド設定

前回作成した関数に出力バインドを追加します。
関数の「統合」メニューで「+新しい出力」をクリックし、「Azure Queue Storage」のバインドを選択します。
「Azure Queue Storage output」の設定でキューを格納するStorage Accountとキュー名を設定し、保存をクリックします。

パッケージのインストール

メッセージを連携する画像処理用Functionでは、画像をBlob Storageに保存します。保存パスには、ランダムな文字列としてuuidを設定するため、「uuid」のパッケージをインストールします。
関数の「プラットフォーム機能」メニューで「高度なツール(Kudu)」をクリックします。

Kuduの画面で「Debug Console」→「CMD」を選択してコンソールを開き、パッケージをインストールする関数のディレクトリまで移動してnpmの初期化を実行します。
[crayon-5f2cae8999589103590204/]
npmの初期化を行ったら「uuid」のパッケージをインストールします。
[crayon-5f2cae8999598260977802/]

スクリプト

スクリプトは以下のように作成しました。
[crayon-5f2cae89995a2688926966/]

スクリプトの説明

  1. モジュールの読み込み
    必要なモジュールを読み込みます。
  2. 特定文字のアンエスケープ関数
    クエリのアンパサンド等decodeURIComponentでエスケープされてしまう文字をアンエスケープします。
  3. メッセージ内のURLを抽出
    正規表現を使って、メッセージ内のすべてのURLを配列として抽出します。
    メッセージはURLエンコードされているため、デコードとアンエスケープをしてからURLを抽出します。
  4. メッセージ内のURL有無のチェック
    メッセージ内にURLがない場合は処理を中断します。
  5. メッセージとURLをJSONで配列に格納
    メッセージをQueue Storageバインドに渡すために、URLごとにメッセージとURLをJSON化して配列に格納します。
    Queue Storageバインドに配列を渡すと、要素ごとにキューを追加できるため、複数URLが投稿された場合でも対応できます。
  6. Blob出力パスの設定
    URLを解析して画像を保存するBlob Storageのパスを設定します。保存パスは「{uuid}/{ファイル名}」の形になるようにしています。
  7. メッセージをQueue Storageに出力
    メッセージ内容、URLのJSONをQueue Storageに追加します。

実行結果

Slackの設定したチャンネルにまずはURLでないテキストを投稿します。
前回同様に「テスト」のテキストを投稿しても、BOTからのレスポンスはありません。

続いてURLを投稿すると、BOTから開始のメッセージが返されました。

Azure Storageを確認すると、Slackにメッセージを投稿した同時刻に、指定したキューにメッセージが格納されていることがわかりました。

まとめ

Queue StorageはAzure Functionsの関数間連携の方法として一般的なものとなります
出力バインドにより容易にメッセージを追加でき、それトリガーに他の関数を発火できるため、関数間連携としてきわめて容易に構成することができます。

次回は、Slackに投稿した画像のURLをもとに画像のダウンロードとBlob Storageへの保存を行う関数を作成し、今回作成したキューメッセージで連携させてみます。