ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure Static Web Apps の自動ビルドがタイムアウトしやすくなった状況に対応した件

弊社では、事業部ごとの技術ブログを集約する Hub のようなサイトを Azure Static Web Apps で構築しています。
最近、Azure Static Web Apps にデプロイする GitHub Actions がタイムアウトで失敗する現象が頻発するようになったので、対応を行いました。
gooner.hateblo.jp

現象

このサイトは、ビルド時に事業部ごとの技術ブログの RSS フィードを取得し、その結果を静的コンテンツとしてデプロイする仕組みです。そのため、ソースコードの変更に関わらず、Schedule トリガーで毎日デプロイしています。
最近、この GitHub Actions がタイムアウトで失敗する頻度が増えてきました。以前は、数か月に1回くらいの割合でした。

エラーログを見ると、 RSS フィードを取得する際にタイムアウトになっていました。


原因

Azure Static Web Apps の自動ビルドのタイムアウトは、既定で15分に制限されています。試しに build_timeout_in_minutes: 30 を追加して 30分に延長してもタイムアウトになり、対処療法にすらなりませんでした。
learn.microsoft.com

そもそも RSS フィードの取得に 15分以上もかかりません。原因は、ビルドを実行している環境側にあり、Azure Static Web Apps 側のビルドで外部サイトに依存する処理を実行していることにありそうだと考えました。

対応方法

本来は RSS フィードの取得をビルドと分けることが望ましいですが、インパクトの大きな改修が必要になります。今回は、ビルド処理を Azure Static Web Apps 側の自動ビルドから GitHub Actions 側に移すことにします。

name: Azure Static Web Apps CI/CD Timer Trigger
on:
  schedule:
    - cron:  '0 6 * * *'
jobs:
  build_and_deploy_job:
    runs-on: ubuntu-latest
    name: Build and Deploy Job
    env:
      NODE_OPTIONS: --openssl-legacy-provider
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 18
          cache: yarn
      - name: Install dependencies
        run: yarn install --frozen-lockfile
      - name: Build site
        run: yarn build
      - name: Build And Deploy
        id: builddeploy
        uses: Azure/static-web-apps-deploy@v1
        with:
          azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_MANGO_TREE_0F24E2F00 }}
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          action: "upload"
          app_location: "out"
          api_location: ""
          output_location: ""
          skip_app_build: true

GitHub Actions 側で actions/setup-node を使って Node を固定し、yarn installyarn build を自前で実行させます。SWA deploy アクションでは skip_app_build: true にして、生成済み out だけをアップロードします。

さらに、RSS フィードの取得状況をログに出力しつつ、取得毎にタイムアウトも設定するようにしています。
修正内容の詳細は、こちらの Pull request を参照してください。
github.com

対応結果

Pull request をマージ後、3日くらい様子を見ましたが、1分半くらいでビルドとデプロイが完了するようになりました。


まとめ

Azure Static Web Apps の自動ビルドがタイムアウトしやすくなった状況に対して、GitHub Actions 側で RSS フィード取得とビルドを行い、Azure Static Web Apps 側では成果物だけをアップロードするようにしました。
今回の件で、Azure Static Web Apps 側の自動ビルドに余計な処理をさせ過ぎてはいけないという学びがありました。