23
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Azure Functions V2 を Mac+VSCode で動かすまでの手順

Posted at

サーバレス系スタックの代表格のひとつである Azure Functions は最近どんどん進化しており、今ではMacでも普通に動かせるようになっています。メインの開発がSPAやネイティブでフロントエンドを開発な人も、さくっとバックエンドをサーバレスで作れるようになっておくと便利ですよね。

Azure Functions 開発環境に必要なライブラリ・ツール群

Mac + VSCodeでAzure Functionsを動かすためには、ざっと以下のようなツール群を入れておく必要があります。なお、MacではAzure Functions V2のみがサポートされています。V2は執筆時点ではプレビューです。

  • Node.js
  • .NET Core SDK
  • Azure Functions Core Tools
  • Azurite

Node.js

Macで開発している人でNode.jsが入っていない人はいないと思いますが、Azure Functions V2の実行で必要なバージョンが入っているかは確認しておく必要があります。執筆時点では、8.4.0以上が必須要件になっています。

自分のMacでは Nodebrew を使ってNodeのバージョンを管理しています。やりたいことに合わせてバージョンを切り替えられるので、とても便利です。

.NET Core SDK

Node.jsで開発するのに.NET Coreが必要になるのは若干違和感がありますが、現状ではFunctionsのExtensionを導入する場合に必須なので、 .NET Downloads for macOS から.NET Coreを導入しておきましょう。今のところHomebrewでのインストールはサポートされていませんが、Issueはあるのでそのうち実現されるかも。

Azure Functions Core Tools

Azure FunctionsをCLIで実行するためのツールです。もちろんMacもサポートされており、こちらは最近Homebrewでのインストールがサポートされました。

Homebrewを使ったインストール

brew tap azure/functions
brew install azure-functions-core-tools 

これでFunctionsを開発するためのfuncコマンドが使えるようになります。

Azurite

Azure Functionの実行にはAzure Storageが必須になりますが、ローカル開発ではエミュレータの利用が推奨されます。
ただし、Azure Storage Emulator は残念ながらMac環境ではサポートされていないので、最近コミュニティからAzure公式のGithubリポジトリに移管された Azurite というエミュレータを導入します。

Azuriteのインストール

npm install -g azurite

Azuriteの起動は-lオプションで実行ディレクトリを指定できます。

azurite -l ~/azurite

Azurite実行後は、通常のAzure Storageと同様に、 Azure Storage Explorer で操作が可能です。

Azure Functionsの開発

ここからは個別のFunctionsをローカルで開発する方法です。上記の開発環境が出来ている場合はここからはじめられます。

プロジェクトの作成

まず、以下のコマンドを実行してFunctionsプロジェクトを初期化します。

func init my-function-app

Azure Functionsの実行には Azure Storage が必須なので、プロジェクトディレクトリに自動作成されたlocal.settings.jsonでストレージアカウントを設定します。ローカル開発環境では通常以下のようにストレージエミュレータを使うように指定します。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true"
  }
}

Functionの作成

プロジェクトを作成しただけでは実際に実行するFunctionがひとつも無い状態です。なお、プロジェクトには複数のFunctionを作成できますが、 local.settings.json は共有されるので、接続文字列などの環境変数を共有して良い場合は同一プロジェクト内に複数のFunctionを作成して良いと思います。

以下コマンドでは対話形式でFunctionを作成できます。開発言語とテンプレートを聞かれますので、好きな種類を選択して下さい。

$ func new
Select a language:
1. C#
2. JavaScript
Choose option: 2
JavaScript
Select a template:
1. Blob trigger
2. Cosmos DB trigger
3. Event Grid trigger
4. HTTP trigger
5. Queue trigger
6. SendGrid
7. Service Bus Queue trigger
8. Service Bus Topic trigger
9. Timer trigger
Choose option: 5
Queue trigger
Function name: [QueueTriggerJS]
$

この例では、言語を JavaScript に、テンプレートに Queue trigger を選択しました。
これでFunction名のディレクトリができ、配下に以下のファイルが生成されます。

  • function.json: Functionの設定ファイル
  • index.js: 実行コード

これ以外に readme.mdsample.dat ができますが、必要なければ削除して下さい。

Functionの実行

実際には、ここでコードを編集していきますが、初期生成直後の時点でも稼働確認はできるので、以下コマンドを実行します。

func host start

以下のようなエラーが出る場合は、ストレージエミュレータが実行されていません。

[2018/xx/xx xx:xx:xx] QueueTriggerJS: Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.QueueTriggerJS'. Microsoft.Azure.WebJobs.Host: Please verify that the Azure Storage Emulator is running. Microsoft.WindowsAzure.Storage: An error occurred while sending the request. System.Private.CoreLib: An error occurred while sending the request. System.Net.Http: Couldn't connect to server.

Azuriteを使っている場合は、別のターミナルセッションで以下コマンドを実行しておきましょう。

azurite -l ~/azurite

ターミナルにAzure Functionsのアスキーアートやその他実行ログが出力され、最終的に Job host started が表示されれば、Functionがトリガーを待っている状態で正しく起動したことになります。今回はQueueトリガーで作成しましたので、Storage Explorerを使ってキューを作成すればFunctionは問題なく実行されるはずです。

これで、Mac + VSCode環境で Azure Functions のローカル開発環境ができました。あとは好きなようにコードをガンガン書いてデプロイするだけです。

拡張機能のインストールやAzureへのデプロイなどについては、以下の公式ドキュメントを参照して下さい。

23
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?