ある日突然発生したNotion APIの502エラーの原因と対処方法

Featured image of the post

はじめに

最近いきなりNotion APIで502エラーが頻発するようになった…💦

502エラーの原因と対処方法を調べたのでまとめる!

この記事で解決したいこと

✅502エラーの原因を知る!

✅今までどおりNotion APIを使った処理をできるようにする!

結論

✅502エラーはNotion側の原因っぽい(?)

✅502エラーが出てもリトライするようにすれば対処できそう!

遭遇した状況

いつもどおり「astro-notion-blog(Notionと連携してブログを書けるやつ)」でブログを更新しようとしたところエラーが発生した😰

Image in a image block

ログを見るとNotion APIで502エラーが出ている様子…!

Image in a image block

💡
これを解決するためにNotion APIの502エラーについていろいろ調べた!

502エラーの原因

✅502エラーはNotion側の問題っぽい(?)

どういうときにエラーが出る?

✅502エラーが出るときと出ないときがあり、具体的にどのような条件で発生するか不明。

🔗
こちらに同じような現象の方がたくさんいた。

https://github.com/makenotion/notion-sdk-js/issues/172

上記のページの意見を要約すると

  • 大量のブロックを持つページで502エラーが出た🥺
  • いやいや、少ないページでも502エラーが出るよ😰
  • なんか上手くいくときもあるし、失敗するときもある!現象出るのはランダムかも🤯
💡
特に2023年9月下旬から同じ現象の人が多い。

502エラーの原因

✅502が出るのはNotion側の問題(?)なので、こちらで502を完全になくすことはできなさそう…

対処方法

本来はNotion側が502エラーが出ないように修正してくれたらベスト◎

しかしいつ修正されるか分からないので、とりあえず動作する対処方法を考える⭐️

とりあえず動作するように対処する方法

「502エラーが出たときはリトライする」ように対処すればOK!!!

具体例

astro-notion-blogの場合の修正内容を抜粋。※言語はTypeScriptだが他の言語でもリトライするように修正すればOK

🔗
(自分で修正しようとしたらすでにastro-notion-blogが対応済みだった!!感謝🙏)

https://github.com/otoyo/astro-notion-blog/pull/145

修正前

502エラーが1回でも出たら中断する。

502エラーに1度でも引っかかるとその時点でアウト!

export async function getAllPosts(): Promise<Post[]> {
	省略

  let results: responses.PageObject[] = []
  while (true) {
    const res = (await client.databases.query(
      params as any
    )) as responses.QueryDatabaseResponse

    results = results.concat(res.results)

    if (!res.has_more) {
      break
    }

    params['start_cursor'] = res.next_cursor as string
  }

	省略
}

修正後

400番台以外のエラーなら最大2回までリトライする。

502エラーが2連続で発生することは少ないため、これで処理が通るようになる。

// ✅非同期処理でリトライするのに便利なやつ
import retry from 'async-retry'

const numberOfRetry = 2

export async function getAllPosts(): Promise<Post[]> {
  省略

  let results: responses.PageObject[] = []
  while (true) {
		// ✅リトライするように修正(ここから)
    const res = await retry(
      async (bail) => {
        try {
          return (await client.databases.query(
            params as any
          )) as responses.QueryDatabaseResponse
        } catch (error: unknown) {
          if (error instanceof APIResponseError) {
						// ただし400番台のエラーなら繰り返さない
            if (error.status && error.status >= 400 && error.status < 500) {
              bail(error)
            }
          }
          throw error
        }
      },
      {
        retries: numberOfRetry,
      }
    )
		// ✅リトライするように修正(ここまで)

    results = results.concat(res.results)

    if (!res.has_more) {
      break
    }

    params['start_cursor'] = res.next_cursor as string
  }

	省略
}

💡
非同期処理をリトライするので「async-retry」を使うのがいいみたい💭

上記の修正で無事にビルドが成功するようになった。

Image in a image block

まとめ

ある日突然502エラーが発生して困ったので調べたことをまとめてみて無事に対処できた😊

とりあえず502エラーが出る処理をリトライするようにすれば一時しのぎにはなりそう✅

💡
詳しくない部分もあるので間違っているところがあればX(Twitter)のDMでご指摘ください🙇‍♂️

最後に、リトライ処理もしっかりと対応してくださっているastro-notion-blog様ありがとうございます🙏