AWS Synthetics Canary で謎エラーが発生したのを解消した話
最近、AWS Synthetics Canary で外形監視をしているサイトで、サイトに問題がないにも関わらずちょこちょこ謎のエラーが頻発していました。
以下が Canary のログです。
- Canary のランタイムバージョンが 3.8 の場合
ERROR: Canary error:
Error: Protocol error (Target.activateTarget): Session closed. Most likely the page has been closed. Stack: Error: Protocol error (Target.activateTarget): Session closed. Most likely the page has been closed.
at CDPSession.send (/opt/nodejs/node_modules/puppeteer/lib/cjs/puppeteer/common/Connection.js:195:35)
at Page._screenshotTask (/opt/nodejs/node_modules/puppeteer/lib/cjs/puppeteer/common/Page.js:1084:28)
at /opt/nodejs/node_modules/puppeteer/lib/cjs/puppeteer/common/Page.js:1081:62
ERROR: Adding execution error: Unable to stop har generation
Error: Session already detached. Most likely the page has been closed.
INFO: Browser closed
ERROR: Adding execution error: Unable to write har file. Har content is null
- Canary のランタイムバージョンが 5.1 の場合
2023-08-26T00:16:59.045Z ERROR: Canary error:
Error: Protocol error (Target.activateTarget): Session closed. Most likely the page has been closed. Stack: Error: Protocol error (Target.activateTarget): Session closed. Most likely the page has been closed.
at CDPSessionImpl.send (/opt/nodejs/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.js:316:35)
at CDPPage._CDPPage_screenshotTask (/opt/nodejs/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.js:1031:62)
at /opt/nodejs/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.js:721:99
2023-08-26T00:16:59.046Z ERROR: Adding execution error: Unable to stop har generation
Error: Session already detached. Most likely the page has been closed.
2023-08-26T00:16:59.046Z INFO: Browser closed
2023-08-26T00:16:59.046Z ERROR: Adding execution error: Unable to write har file. Har content is null
どちらも Page._screenshotTask
や _CDPPage_screenshotTask
などの処理で死んでいるため、ウェブサイトのスクリーンショットを撮影する処理で死んでいそうです。
そのため、スクリーンショット撮影の処理をオフってみたところ、エラーは発生しなくなりましたが、それはそれでサイトのスクショが取れなくなるので微妙感があります。
というわけで、AWS サポートに聞いたりしたところ、原因の一つとして Canary が利用している Lambda のエフェメラルストレージが枯渇している可能性がある、との回答をもらいました。
AWS Synthetics Canary は、内部的には Lambda を使用し、 Lambda 内で Puppeteer を使用してサイトにアクセスすることで、外形監視を行っています。
実際に AWS Synthetics Canary を作成すると、 同時に cwsyn-${CANARY_NAME}-${CANARY-ID}
という名前で Lambda も作成されます。
今回は、この Lambda のエフェメラルストレージが使っているうちに枯渇してしまい、スクリーンショットが撮れなくなったことが原因だそうです。
そのため、このエフェメラルストレージを増やせば良いそうです。
その際、Canary の設定から Lambda のエフェメラルストレージを増やすことはできないため、以下のような手順を踏む必要があります。
1. Canary の Lambda の設定を開いてエフェメラルストレージのサイズを大きくする
Lambda の設定を直接いじって増やします。
デフォルト 512 MB なので、今回は 1024 MB にしました。
2. AWS Synthetics Canary の変更を行う
AWS サポートの方曰く、 AWS Synthetics Canary は、 Canary の変更をしない限り変更前の Lambda を使い続けるそうです。
そのため、 Canary 側に変更を加えることで、新しいバージョンの Lambda を使用してくれるようになるとのこと。
なので、影響がない範囲で適当に Canary のソースを修正します。
上記の対応をしたところ、無事にエラーが出なくなりました 🎉
ちなみに、 Lambda Insights を導入して、エフェメラルストレージの使用状況をモニタリングできないかサポートの方に聞いてみたところ、Canary が作成した Lambda では Lambda Insights が使えないそうです。
確かに、 Lambda Insights は、モニタリングに Lambda Layer を使用しているため、 Layer 周りをいじれない Canary の場合は対応が難しそうでした。
また、現状エフェメラルストレージが枯渇しそうかの状況をモニタリングできるメトリクスはないそうです。
もし同様の問題が起きた方がいれば、エフェメラルストレージを増やしてみれば良いかもしれません。
Discussion