かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Azure Functionsで外部パッケージを使おう(node.js) もんにょり編

便利な機能は割と npm から入れることがあると思います。 そのやり方を試してみました。

Azure Functions の作業してるフォルダのルートで以下のコマンドを打ちます。

npm init

そして適当なパッケージをインストールします。 今回はなんでもいいので、CPUの状態を取ってくれるやつを試してみましょう。

www.npmjs.com

npm install cpu-stats

そして、適当な関数を用意してこんな感じのコードにします。

var cpuStats = require('cpu-stats')

module.exports = function (context, req) {
    cpuStats(1000, function(error, result) {
        if (error) {
            context.bindings.res = {
                status: 500,
                body: error
            };
            context.done();
            return;
        }

        context.bindings.res = {
            status: 200,
            body: result
        };
        context.done();
    });
};

そして、func runを使って実行してみます。 こんな感じの結果になりました。動いてますね。

PS C:\Users\kaota\Documents\Visual Studio Code\Projects\CICDFuncAppLab\AzureFunctionsLab> func run Echo
NOTE: the 'func run' command only supports POST for HTTP triggers. For other verbs, consider a REST client like cURL or Postman.
Response Status Code: OK
[{"cpu":30.80708661417323,"user":23.129921259842519,"nice":0,"sys":6.1023622047244093,"idle":69.19291338582677,"irq":1.5748031496062991},{"cpu":10.826771653543307,"user":7.6771653543307092,"nice":0,"sys":1
.5748031496062991,"idle":89.1732283464567,"irq":1.5748031496062991},{"cpu":39.039039039039039,"user":28.128128128128125,"nice":0,"sys":10.910910910910911,"idle":60.960960960960961,"irq":0},{"cpu":18.7,"use
r":15.6,"nice":0,"sys":3.1,"idle":81.3,"irq":0}]

では、Azureに公開しましょう。

func azure functionapp publish npmpackagelab

無事公開されたらポータルから動かしてみます。

f:id:okazuki:20170813214942p:plain

動いてますね。めでたしめでたし。

とはなりません。今回ローカルのフォルダからコマンドでさくっと公開したときにnode_modulesフォルダがまとめてアップロードされたために動いたと思われます。Function Appのコンソールでdirコマンドを打ってみるとこんな感じの結果が得られます。

D:\home\site\wwwroot

> dir
D:\home\site\wwwroot
Volume in drive D is Windows

 Volume Serial Number is 9E2F-1C0D



 Directory of D:\home\site\wwwroot



08/13/2017  12:45 PM    <DIR>          .

08/13/2017  12:45 PM    <DIR>          ..

08/13/2017  12:46 PM    <DIR>          Echo

08/13/2017  09:46 PM                 3 host.json

08/13/2017  12:46 PM            67,063 hostingstart.html

08/13/2017  12:46 PM    <DIR>          node_modules

08/13/2017  09:46 PM               311 package-lock.json

08/13/2017  09:46 PM               500 package.json

08/13/2017  09:46 PM               955 README.md

               5 File(s)         68,832 bytes

               4 Dir(s)  5,497,557,942,272 bytes free

ばっちりnode_modules入ってますね。

VSTSみたいなところからデプロイすると…

では、node_modulesフォルダは.gitignoreしてるようなVSTSのリポジトリからデプロイしてみましょう。

手順は以下に書いてあるので割愛します。

blog.okazuki.jp

VSTS からデプロイした関数を実行してみると…

f:id:okazuki:20170813215639p:plain

あれ…?動いた…

このページに

docs.microsoft.com

こういう記述があるので

package.json ファイルがアップロードされたら、Kudu リモート実行コンソールで npm install コマンドを実行します。
この操作によって、package.json ファイルに示されているパッケージがダウンロードされ、関数アプリが再起動されます。

てっきり自分でしないといけないと思ったのですが違うんですかね?

このページに書いてある

docs.microsoft.com

Azure App Service では package.json および npm-shrinkwrap.json ファイルが認識され、これらのファイルのエントリに基づいてモジュールをインストールできます。

これが働いてるんでしょうか。ちょっとAzure Functionsでの記述を見つけられない…もんにょり。