[アップデート] Amazon CloudWatch Synthetics で Node.js 向けの新しいランタイムバージョン 5.0 が使えるようになりましたが、注意しながらアップグレードしましょう

2023.07.25

いわさです。

Amazon CloudWatch Synthetics は合成監視を行う CloudWatch のサービスのひとつです。
Synthetics では Canary を作成し監視処理を実装するのですが、Node.js (syn-nodejs-puppeteer) と Python (syn-python-selenium) のランタイムが存在しています。

本日のアップデートで CloudWatch Synthetics で syn-nodejs-puppeteer の 5.0 が利用出来るようになりました。

基本的に Synthetics のランタイムはアップグレード推奨なのですが、今回は依存ライブラリの破壊的変更が多く、いつもより少し注意してアップグレードする必要があります。
情報をまとめてみましたので紹介します。

いつか使えなくなるのでバージョンアップは必要

まず、そもそもバージョンアップする必要あるのか?というところなのですが、Synthetics のランタイムにはサポートポリシーが設けられています。
古いランタイムはサポートされなくなくなり、セキュリティアップデートなどを受けられなくなり「非推奨」という位置づけになります。

非推奨のランタイムバージョンは引き続き実行や、停止・開始を行うことは出来るのですが、新規で非推奨ランタイムバージョンの Canary を作成することは出来ません。
よって、基本的には最新版にアップグレードすることが推奨されています。

直近では syn-nodejs-puppeteer の 3.4 以前が 2022 年 11 月に廃止されています。

詳しくは次の公式ドキュメントも参照してください。

アップグレードしてみた

ではどのようにアップグレードするかですが、ランタイムバージョンのアップグレード自体は非常に簡単です。
今回 syn-nodejs-puppeteer-4.0 の Canary を対象にアップグレードしてみましたので手順を紹介します。
注意事項を後述するのでこの時点ではまだアップグレードしないでください。

対象 Canary を開くと次のようにアップグレードが推奨されます。

編集画面からランタイムバージョンを変更し保存して終わりです。簡単です。

また、Canary 一覧から対象 Canary を選択し、アクションメニューから「ランタイムを更新」することも出来ます。

こちらの機能では最大 5 つの Canary を一括でアップデート出来ます。

他、公式よりアップグレードスクリプトも用意されていますので複数の Canary を更新したい場合はそちらも利用可能です。

今回は破壊的変更が多いので注意

上記のようにお手軽にサッと更新しそうになるのですが、今回はいつもよりもより気をつけたほうが良いです。
対象ランタイム syn-nodejs-puppeteer ですが、 Puppeteer と Chromium の特定バージョンに依存しています。
今回の syn-nodejs-puppeteer-5.0 では Puppeteer のバージョンが最新に近いものまで一気に上がりました。

Puppeteer は Chrome/Chromium を API でコントロール出来る Node.js 向けのライブラリです。
サイトのクローリングをはじめ、パフォーマンス診断やスクリーンショット取得など、様々なブラウザ機能を利用することが出来ます。

前バージョンの syn-nodejs-puppeteer-4.0 は 2 ヶ月前に使えるようになったのですが、Puppeteer のバージョンは 2020 年 11 月に登場した v5.5.0 のままでした。

BREAKING CHANGES の抜粋

今回登場した syn-nodejs-puppeteer-5.0 は Puppeteer の v19.7.0 を使用しており 2023 年 2 月にリリースされたものです。
詳しくは次の Puppeteer のリリースノートを見ていただくのが良いですが、v5.5.0 からかなりの更新が入っています。

新しい機能も入っていますが、特に Puppeteer はメジャーバージョンのタイミングで何か破壊的な変更 (BREAKING CHANGES) がいくつか発生しています。
今回多くのメジャーバージョンを挟む形になるので、破壊的変更はひととおり確認しておきましょう。

GitHub のリリースノートから抜粋したものは以下となります。

  • v6.0.0
    • chromium: The built-in aria/ selector query handler doesn’t return ignored elements anymore.
    • typescript: Puppeteer now ships with built-in TypeScript definitions. This means you no longer need to install @types/puppeteer. We are aware that there are likely improvements that can be made to our types to improve the developer experience when using them; please open issues if you hit any problems with the built-in TS definitions, or notice areas where you feel types are lacking.
  • v7.0.0
    • page.screenshot makes a screenshot with the clip dimensions, not cutting it by the ViewPort size.
    • chromium: - page.screenshot cuts screenshot content by the ViewPort size, not ViewPort position.
  • v8.0.0
    • renamed type ChromeArgOptions to BrowserLaunchArgumentOptions
    • renamed type BrowserOptions to BrowserConnectOptions
  • v9.0.0
    • filechooser: FileChooser.cancel() is now synchronous.
  • v10.0.0
    • Node.js 10 is no longer supported.
  • v11.0.0
    • oop iframes: integrate OOP iframes with the frame manager (#7556)
  • v12.0.0
    • chromium: roll to Chromium 97.0.4692.0 (r938248)
  • v13.0.0
    • typo in 'already-handled' constant of the request interception API (#7813)
  • v14.0.0
    • strict mode fixes for HTTPRequest/Response classes (#8297)
    • Node 12 is no longer supported.
  • v15.0.0
    • type inference for evaluation types (#8547)
  • v16.0.0
    • With Chromium, Puppeteer will now attach to page/iframe targets immediately to allow reliable configuration of targets.
  • v17.0.0
    • remove root from WaitForSelectorOptions (#8848)
    • internalize execution context (#8844)
  • v18.0.0
    • fix bounding box visibility conditions (#8954)
  • v19.0.0
    • use ~/.cache/puppeteer for browser downloads (#9095)
    • deprecate createBrowserFetcher in favor of BrowserFetcher (#9079)
    • refactor custom query handler API (#9078)
    • remove puppeteer.devices in favor of KnownDevices (#9075)
    • deprecate indirect network condition imports (#9074)
    • deprecate indirect error imports (#9072)

Canary をクローンし、アップグレードの検証をしよう

Synthetics の Canary ですが、クローン機能があります。

今回の更新に限らずなのですが、アップグレードによる影響点を確認するために Canary をクローンしランタイムバージョンを更新して検証をしっかり行うようにしましょう。
公式ドキュメントでもクローンしてアップグレード検証する方法は推奨されています。

さいごに

本日は Amazon CloudWatch Synthetics で Node.js 向けの新しいランタイムバージョン 5.0 が使えるようになったので色々と確認してみました。

ランタイムアップグレード自体は簡単なのですが、アップグレード後に Canary のスクリプトが引き続き動作するかが保証されているわけではありません。
今回のランタイムバージョンでは特に依存ライブラリの更新で破壊的な変更も含まれているので注意しながらアップグレードしましょう。
アップグレードにあたっては事前に Canary のクローン機能を使って検証してください。