0
0

モノレポ ( Turborepo ) の Azure Functions(Node Typescript)のデプロイで関数がない状態になることの対応をしたメモ

Last updated at Posted at 2024-07-20

概要

前回はTurborepoに管理されていないフォルダでFunctionsをデプロイしていた。今回、Turborepoの管理にいれたところ、func startで動いたAPIがデプロイ時にはなくなってしまう現象が発生した。
結論からいうと、デプロイ時は別フォルダにコピーを作って行った。

ソースコード

現象

動作確認では下画像のようにAPIが見えていた。

image.png

func azure functionapp publish $APP_NAMEを行ったところ、デプロイは終わっても関数が作成されなかった。
エラーのトラブルシューティングにおける"Azure Functions ランタイムに到達できない" についてデプロイ後に関数が見つからないをみてもピンとこない。

調査

ぐぐったらIssueがいろいろ引っかかった。
How to support monorepo
True support for multiple function apps in a monorepo

Turborepoで作っているため、node_modulesがルートに作成され、そこに Azure Functionsのライブラリが入っているのが原因のようだ。apiフォルダ内に必要らしい。

公式でNode.js v4 プログラミング モデルの monorepo ワークスペースの依存関係を管理すると言ってる割にあまり参考にならなかった。

試行錯誤

EsBuildを使ってnode_modulesの階層から解き放とうとしたが、CJSではなくESMとして出力されて頓挫した。

Honoを使ってうまく行ったという人もいたので試したが、ビルドの問題は解決しなかった。
Hono+EsBuildだと1ファイルにまとまるので、CJSにさえ簡単にできればこれでいけそうだったかも。惜しい。

ソースコード

apps/api/package.json
{
  "name": "api",
  "scripts": {
    "prebuild": "npm run clean",
    "build": "tsc && tsc-alias",
    "watch": "tsc -w",
    "clean": "rimraf dist",
    "predev": "npm run build",
    "dev": "func start --port 7071",
    "lint": "eslint",
    "deploy": "dotenv -e .env -- bash -c 'bash deploy.sh'"
  },
  "dependencies": {
    "@azure/functions": "^4.5.0",
    "date-fns": "^3.6.0",
    "hono": "^4.5.0"
  },
  "devDependencies": {
    "@async-ttrpg/eslint-config-custom": "*",
    "@async-ttrpg/tsconfig": "*",
    "@types/mssql": "^9.1.5",
    "@types/node": "^20.x",
    "dotenv-cli": "^7.4.2",
    "rimraf": "^6.0.1",
    "tsc-alias": "^1.8.10",
    "typescript": "^5.5.3"
  },
  "main": "dist/src/{app.js,functions/*.js}"
}
apps/api/deploy.sh
#!/bin/bash

BUILD_DIR=build
rimraf $BUILD_DIR
mkdir $BUILD_DIR
cp -r dist $BUILD_DIR
cp host.json $BUILD_DIR
cp local.settings.json $BUILD_DIR
# package.json から devDependencies を削除して、本番環境用の node_modules を作成 (@async-ttrpg/typescript-configなどmonorepoの機能で参照しているパッケージがエラーを引き起こすため)
jq 'del(.devDependencies)' package.json > temp.json && mv temp.json $BUILD_DIR/package.json

cd $BUILD_DIR && npm install --omit=dev \
   && func azure functionapp publish $APP_NAME --subscription $AZURE_SUBSCRIPTION_ID
apps/api/.env
APP_NAME=HOGEHOGEfunctionsapp
AZURE_SUBSCRIPTION_ID=d2345678-1234-1234-1234-1234567890af
.vscode/settings.json
{
  "azureFunctions.deploySubpath": "apps\\api",
  "azureFunctions.projectSubpath": "apps\\api",
  "azureFunctions.postDeployTask": "npm install (functions)",
  "azureFunctions.projectLanguage": "TypeScript",
  "azureFunctions.projectRuntime": "~4",
  "debug.internalConsoleOptions": "neverOpen",
  "azureFunctions.projectLanguageModel": 4,
  "azureFunctions.preDeployTask": "npm prune (functions)",
}

サブスクリプションID

関数に表示されているものを使って環境変数AZURE_SUBSCRIPTION_IDに記載

image.png

ソースコード

ビルドパイプラインを作ってみた (2024.08.01 追記)

HonoでRPCをしたAzureFunctionsをAzureDevOpsのパイプラインからデプロイしたメモ

参考

esbuild に CJS として import してほしいのに ESM として import されちゃうときのプラグイン

0
0
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
0
0