Perl Hackers Hub

第54回 サーバレスでもPerl―Microsoft Azure Functionsで動かそう!(3)

この記事を読むのに必要な時間:およそ 3.5 分

Functionsリソースへの環境変数の設定

task.pl(2)で,環境変数からFace APIのエンドポイントURLのFACEAPI_URLと,アクセスキーのFACEAPI_KEYを参照している箇所がありました。これらの環境変数をFunctionsリソースに設定します。

まず,次のコマンドでFace APIのエンドポイントURLを調べます。

Face APIのエンドポイントURLを調べる

$ az cognitiveservices account show \
  --resource-group face-detect \
  --name face-detect-test |
  grep endpoint
  "endpoint": "https://japaneast.api.cognitive.microsoft.com/face/v1.0",
  ↑実行結果。エンドポイントURLなのでメモしておく

--resource-groupにはリソースグループ名を,--nameにはCognitive Serviceアカウント名を指定します。

続いて,次のコマンドでFace APIのアクセスキーを調べます。--resource-group--nameの指定は先ほどと同じです。

Face APIのアクセスキーを調べる

$ az cognitiveservices account keys list \
  --resource-group face-detect \
  --name face-detect-test |
  grep key1
  "key1": "ba74XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  ↑実行結果。アクセスキーなのでメモしておく

Face APIのエンドポイントURLとアクセスキーの両方がメモできたら,次のコマンドでFunctionsリソースに環境変数を設定します。

Face APIの各設定をFunctionsリソースの環境変数に設定する

$ az functionapp config appsettings set \
  --resource-group face-detect \
  --name face-detect-app1001 \
  --settings \
    FACEAPI_URL=https://japaneast.api.cognitive.microsoft.com/face/v1.0 \
    FACEAPI_KEY=ba74XXXXXXXXXXXXXXXXXXXXXXXXXXXX

Azureへのデプロイ

できあがったコードをAzureにデプロイします。

Functionsでは,GitHubやOneDriveなど,いくつかのデプロイ方法に対応しています。本稿では比較的容易なZIPファイルによるデプロイを紹介します。

まず,プロジェクトフォルダをZIP形式で圧縮します。プロジェクトフォルダ内で次のコマンドを実行してください。

プロジェクトフォルダをzipコマンドで圧縮

$ zip -r FaceDetectProject.zip ./

できあがったZIPファイルのFaceDetectProject.zipをデプロイします。

できあがったZIPファイルをデプロイ

$ az functionapp deployment source config-zip \
  --resource-group face-detect \
  --name face-detect-app1001 \
  --src FaceDetectProject.zip

--resource-groupにはリソースグループ名を,--nameにはリソース名を,--srcには先ほど作成したZIPファイルのパスを指定します。

これで,Perlで作られた関数をFunctionsリソースにデプロイできました。

ブラウザで動作確認

ブラウザでアクセスして動作を確認します。アクセス先URLは関数のエンドポイントURLで,Perlで表現すると次のルールで割り当てられます。

関数のエンドポイントURLの割り当てルールをPerlで表現

# Functionsリソース名。この例では"face-detect"
my $functionapp_name = "face-detect";

# 関数名。この例では"FaceDetect"
my $funcname = "FaceDetect";

# エンドポイントURL
my $endpoint_url = sprintf(
    'https://%s.azurewebsites.net/api/%s',
    $functionapp_name,
    $funcname
);

print $endpoint_url;

上記の実行結果,つまりこの関数のエンドポイントURLはhttps://face-detect.azurewebsites.net/api/FaceDetectです。

また,動作確認に利用できる顔画像のURLが必要となります。各自画像URLを用意してください。先ほどの関数のエンドポイントURLに顔画像URLをimageパラメータとして付加すると,https://face-detect.azurewebsites.net/api/FaceDetect?image=顔画像URLとなります。

ブラウザでこのURLにアクセスすると,次のような結果が返ってくることでしょう。

完成した関数のレスポンス

{
  "faces":[
    {"gender":"male","age":56},
    {"age":58,"gender":"male"}
  ]
}

これは,指定した画像から2名の顔を認識した結果です。性別と推測年齢を人物ごとに抽出できていることが確認できますね。

まとめ

本稿を通じて,Functionsを使い,サーバレス環境上でPerlを利用できることをご理解いただけたと思います。Functionsについてより詳しく知りたい人は,Microsoft Learnをご覧ください。

Perlの強みは,後方互換性の高さにあります。筆者が管理するシステムでは,Perlで書かれたビジネスロジックがFunctions上で稼働しています。古いロジックであるにもかかわらず,Functionsでそのまま動作したことは,筆者にとっても驚きでした。

さて,次回の執筆者は東邦之さんで,テーマは「Perlコードを速くする書き方」です。

WEB+DB PRESS

本誌最新号をチェック!
WEB+DB PRESS Vol.111

2019年6月24日発売
B5判/160ページ
定価(本体1,480円+税)
ISBN978-4-297-10657-7

  • 特集1
    新機能の数々をコミッターが最速解説!
    詳解Rails 6
    新コンポーネント,複数DB対応,並列テスト,オートロード刷新
  • 特集2
    動的かつ高速!
    はじめてのJulia
    科学技術計算のための新言語
  • 特集3
    見える化大作戦
    進捗,成果,無理/ムダ,個人の気持ち……
  • 一般記事
    Elm入門
    型安全な関数型言語によるフロントエンド開発