[Functions] ローカルプロジェクトをデプロイ - Azure - Memo

# 概要
(自分用メモ)
ローカルPCで作成したFunctionAppプロジェクトをデプロイ

[目次: Azure Development](https://qiita.com/search?sort=&q=tag%3AAzure+tag%3Adevelopment+user%3Ashokkaa)

# 環境
- Ubuntu 20.04
- [Node.js v20.18.1 / npm 10.8.2](https://qiita.com/shokkaa/items/6f83b3a107006ccc598b)
- [Azure CLI 2.67.0](https://qiita.com/shokkaa/items/e38803a481b9df33ee7a)
- [Azure Portal](https://portal.azure.com/)のアカウント

ローカルPC上でAzure Portalにログイン済(`az login`)

## Azure Portal上にリソース準備
```sh:リソースグループrg1,関数アプリapp230101関数,アプリ用ストレージsapp230101作成
RESGR=rg1
LOCATION=westus
FUNCAPP=fa230102
STORAGE=s$FUNCAPP
az group create -n $RESGR --location $LOCATION   # リソースグループ作成
az storage account create -n $STORAGE -g $RESGR  -l $LOCATION  # Functions用ストレージ作成
az functionapp create -n $FUNCAPP -c $LOCATION -g $RESGR --storage-account $STORAGE --os-type Linux --functions-version 4 --runtime node --runtime-version 20  # FunctionAppリソース作成
```
- APIはURL(上記の場合 https://$FUNCAPP.azurewebsites.net)に生成される。
- 指定しなければ`consumption plan`(従量課金)

WebでAzure Portalにログインしリソースが作成されていることを確認。

## ローカルプロジェクト作成
```sh:例: Node.js用プロジェクト生成
func init . --worker-runtime node --language typescript
```
```sh:関数func1を生成
func new --template "Http Trigger" --name func1
```
サンプルコード`src/functions/func1.ts`が用意される。
`local.settings.json`は公開ダメ(.gitignoreの設定によってコミットされない)

## ビルド
```shell
npm i
npx tsc
```
```:生成物
node_modules/*
dist/index.js
```

## ローカルテスト
```sh
func start -p 7071
```
※: Azure Functions Emulatorでは 使えるnode.jsのバージョンが限定されるので注意。
ここでは 'v20.18.1' を使用。


ブラウザで`http://localhost:7071/api/func1?name=Shokkaa`を開き、`Hello, Shokkaa!`と応答あればOK.

## クラウドにデプロイ
[local.settings.json](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-develop-local#local-settings-file)整備。
- AzureWebJobsStorage: Function用ストレージへの接続キー
```sh:Function用ストレージへの接続キー採取
az storage account keys list --resource-group $RESGR --account-name $STORAGE
```

```json:local.settings.json(例)
{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "AzureWebJobsStorage": "6yoM....=="
  }
}
```

```sh:デプロイ
func azure functionapp publish $FUNCAPP --publish-local-settings -y
```


```sh:テスト
wget -q -O - https://$FUNCAPP.azurewebsites.net/api/func1?name=Shokkaa
# Hello, Shokkaa! 表示されればOK
```

## [参考]スクリプト
1. [クラウド上のリソース設定](https://github.com/kyoya-p/samples/blob/7586228f820c17765945a27b4537c438328ae192/2022/AzureSamples/CosmosDB/deploy.sh#L1-L17)
2. [ローカルでのプロジェクト作成](https://github.com/kyoya-p/samples/blob/7586228f820c17765945a27b4537c438328ae192/2022/AzureSamples/CosmosDB/Readme.md?plain=1#L18-L20)
3. [ローカルプロジェクトをデプロイ](https://github.com/kyoya-p/samples/blob/7586228f820c17765945a27b4537c438328ae192/2022/AzureSamples/CosmosDB/Readme.md?plain=1#L23)


# VSCode の Azure Tools pluginを使用する場合 

## FunctionAppプロジェクトをローカルPCに作成
[Plugin]➔[Azure]➔[WORKSPACE]➔[+]➔[Create HTTP Function...]
➔[Select Language:] TypScript
➔[Create New HTTP Trigger:] (例)func1
api/func1以下に関数本体(index.ts)等が作成される

## ローカルテスト
1. F5押下しデバッグ実行
2. ブラウザで`http://localhost:7071/api/httpTriggerTest?name=abc`開く

## クラウドにデプロイ
事前にAzure PortalでFunctionAppを作成しておく[(参照)](https://qiita.com/shokkaa/items/ee33b6d7736e81119be7)
[Plugin]➔[Azure]➔[WORKSPACE]➔[Deploy to Function App...] FunctionsAppを選択

Azure PortalでアクセスURL取得[(参照)](https://qiita.com/shokkaa/items/ee33b6d7736e81119be7)


# 参照

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-develop-local

https://qiita.com/shokkaa/items/ee33b6d7736e81119be7