2017年11月2日

ブロードバンドタワー緒方です。今回は、Azure Functions で R スクリプト実行を試してみたので紹介させていただきます。

※ご注意※ この記事は、2017/10/24 時点での情報です。アップデートにより変わる可能性があります。

事の発端

2014年 の AWS re:Invent で Lambda が発表された際、これぞクラウドコンピューティングだ、と思ってから早幾年。個人的にですが、あまり萌えてませんでした、サーバーレスコンピューティングに。

使いどころが具体的に思いつかなかったという理由もあるのですが、一番の理由が R 言語がサポートされていない という ( 自分のプログラミング言語の幅が狭いというだけの問題 ) のがありました。

そんなこんなで、AWS Lambda や Azure Functions などのサーバーレスコンピューティングサービスは遠くから生暖かい目で見ておりました。が、たまたまこんなブログの記事を見つけてしまいました。

どうやら、Azure Functions で R のスクリプトが実行できるらしい、ということで試してみました。

R is not natively supported ?

先ほど紹介させていただいたブログ Go serverless with R Scripts on Azure Function の始めの方に R is not natively supported と気になる一文があります。

え、Azure Functions で R スクリプトが実行できるって書いてあるのに、R is not natively supported ってどういうこと ? となったのですが、実行する仕組みを見ていくとなるほど合点がいきました。

結論なのですが、Azure Functions 経由で Natively に対応している PowerShell スクリプトを実行します。で、実行する PowerShell スクリプトに R スクリプトを実行するコードを書くという 2 段構え (?) な仕組みになっています。

とりあえず R スクリプトが実行できるという事実があれば OK ということで進めていきます。

目次

1 Function App の作成

まずはじめに、Function App を作成します。

Azure Portal の左上にある、+新規 をクリックして、Function App をクリックします。

Function App の作成画面が開きますので、必要な情報を入力します。 今回は、アプリ名を RBBTowerConsumption としてみました。

ホスティングプランの選択肢が、従量課金プランApp Service プラン の 2 種類が選択できます。

ざっくりと言って、従量課金プラン は、実行環境が共有スペースで、App Service プラン は実行環境を占有スペースになります。

プランの詳細に関しては、Microsoft の公式ホームページの Azure Functions のホスティング プラン を参照ください。

パフォーマンスのことを考えると、App Service プラン の方がよいのですが、今回はお手軽に 従量課金プラン で検証してみます。

しばらくすると、通知が来ました。

Go to resource をクリックします。

2 R 環境の構築

先ほどの Go to resource をクリック後、下記のような画面が表示されると思います。

表示された画面にある、プラットフォーム機能 のタブをクリックします。

その後、切り替わった画面にある 高度なツール (Kudo) をクリックします。

Kudo の画面が表示されますので、右上の Site extensions をクリックします。

クリック後の画面に、Gallery とあるタブをクリックします。

インストール可能な Extension が色々と表示されると思いますが、ここから R 3.3.3 x64 を探し出して、+ をクリックします。

インストールの確認画面が表示されますので、Install をクリックしてインストールを実行します。

コーヒーを一杯くらいのんびり飲めるくらい待つと、+ ボタンがクルクル回るのが止まります。

画面を上にスクロールさせると Failed to install R 3.3.3 x64 と表示される場合があります。( この記事を書いている際も出ました ) この場合はあわてず騒がず、画面のリロードをしてあげます。

Gallery のタブから Installed のタブをクリックして移動します。

Installed のところに R 3.3.3 x64 がインストールされていることを確認して、画面右上の Restart Site ボタンをクリックしてサイトの再起動を実施します。

最後に必要なファイルの展開を実施します。

この作業も Kudo 上から実施します。

Kudu 画面上の Debug console から PowerShell をクリックします。

画面下に背景が濃い青色のコンソールが表示されていますので、ここで unzip -n D:\home\SiteExtensions\R-3.3.3x64\R-3.3.3.zip -d D:\home と入力します。

ファイルが展開されますので、気長に待ちます。

PS D:\home> unzip -n D:\home\SiteExtensions\R-3.3.3x64\R-3.3.3.zip -d D:\home
Archive:  D:\home\SiteExtensions\R-3.3.3x64\R-3.3.3.zip
   :
  inflating: D:\home/R-3.3.3/unins000.dat  
  inflating: D:\home/R-3.3.3/unins000.exe
PS D:\home>  

コマンドプロンプトが表示されれば、無事終了です。

3 R 環境の動作検証

それでは、R が実際に動作するか検証してみます。

検証作業も Kudo 上から実施します。

Kudu 画面上の Debug console から、今回は CMD をクリックします。

画面下に背景が黒色のコンソールが表示されていますので、ここで R --no-save と入力します。

D:\home>R --no-save

R version 3.3.3 (2017-03-06) -- "Another Canoe"
Copyright (C) 2017 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

R のコンソールに入ることができました。試しに sessionInfo()$running を実行して、R 実行環境の情報を取得してみます。

> sessionInfo()$running
sessionInfo()$running
[1] "Windows Server >= 2012 x64 (build 9200)"

どうやら、Windows Server 上に動いているみたいです。これでとりあえず動いていることが確認できました。

q() を入力して、R のコンソールから抜けます。

4 R サンプルスクリプトの作成

次に、Azure Functions の動作検証を行うための R サンプルスクリプトを作成します。

R スクリプト作成も Kudo 上から実施してみましょう。

Kudo の画面左上にある + ボタンをクリックして、New File をクリックします。

ファイル名を script.r とします。

script.r の左にある、鉛筆の形をしたボタンをクリックしてファイルの編集を行います。下記のサンプルコードを入力して、画面左上の Save をクリックして保存します。

message <- "i love R "
write(message, file= paste0(format(Sys.time(),"%Y%m%d-%H%M%S"), "_message.txt"))

ちなみに、このコードは YYYYMMDD-hhmmss_message.txt というファイル名でファイルを作成します。ファイルには i love R という文字列を埋め込みます。

以上でサンプルスクリプトの作成は完了です。

5 関数の作成

それでは、Function App の関数を作成してみます。

先に作成した Function App の RBBTowerConsumption にある、関数の右にある + をクリックします。 その後、画面右に表示されている カスタム関数を作成する をクリックします。

カスタム関数を作成する をクリック後、画面が遷移します。

言語の PowerShell を選択し、表示された TimerTrigger - PowerShell をクリックします。

下記設定は Default のままで、作成 ボタンをクリックします。

  • 関数名の指定
    • TimerTriggerPowerShell1
  • タイマー trigger
    • スケジュール: 0 */5 * * * *

今回は、5 分毎に PowerShell のコードを実行する設定にしてみました。スケジュールの */5 の部分で 5 分間隔の指定をしています。

少し待つと画面が遷移しますので、ここで下記の PowerShell のサンプルコードを入力します。

cd D:\home
D:\home\R-3.3.3\bin\x64\Rscript.exe script.r 2>&1

サンプルコードを入力後、画面上部にある 実行 ボタンをクリックします。ボタンをクリック後、先ほど入力した PowerShell のコードが実行されます。

ログ出力の最後に、2017-10-17T02:10:07.093 Function completed (Success, Id=ea58faf6-74db-445a-9e46-7e5d4b4edd7e, Duration=7088ms) と表示されていますので、とりあえず正常に終了したようです。

6 実行状況の確認

作成した関数 TimerTriggerPowerShell1 が意図したとおり、5 分毎に実行されているのか確認してみましょう。

Function App の RBBTowerConsumptionTimerTriggerPowerShell1 を選択して、モニター をクリックします。

右にある起動ログを見てみると、赤枠で囲っているところで 5 分毎に関数が実行されていることが確認できました。

関数が実行されると、ファイルが作成されますので実際にファイルが作成されているか Kudo 上か確認してみます。

ファイルが 5 分毎に作成されていることが確認できます。 どれか一つファイルの鉛筆の形をしたボタンをクリックしてファイルの内容を確認してみると、i love R と意図した文字列が保存されていることが確認できました。

7 おかたづけ

一通り意図した関数が実行されて、R スクリプトが実行されることが確認できました。5 分毎に関数が実行されるため、このまま放置しておくと関数が延々と実行され続けてしまいます。

関数のステータスを無効にして、定期的な実行を停止させて対応してみましょう。

Function App の RBBTowerConsumption の関数のところをクリックすると、画面右に関数のステータスを変更できる画面が表示されます。

ここで、ステータスの丸ボタンをクリックすると、ステータスが 無効 になります。関数を削除する必要があれば、ゴミ箱 ボタンをクリックすれば削除されます。

最後に

以上で、Azure Functions で R スクリプトを実行する方法を説明させていただきました。直接 R のコードが実行できるようになればさらに便利に使えるのかな、と思います。私事ですが、業務で Azure 課金処理を R を利用して実行しています。月次処理なので定期的に実行する必要がありますので、月初に手動で R のコードを実行していました。Azure Functions で課金処理の実行を定期的に実行させればもっと楽に月初の処理ができそうです。

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

投稿者: 緒方 亮

主に Azure や AWS などの Public Cloud を担当しています。機械学習/深層学習で R を利用しているため、投稿する記事に R がよく登場します。