[アップデート] Amazon CloudWatch Synthetics で Java ランタイムがサポートされました

[アップデート] Amazon CloudWatch Synthetics で Java ランタイムがサポートされました

Clock Icon2025.05.29

いわさです。

Amazon CloudWatch Synthetics ではスケジュールに従ってスクリプトを実行することで API エンドポイントや Web サイトを監視することが出来ます。
さらに、Puppeteer あるいは Selenium Webdriber が使えるのでブラウザ上の複雑なユーザー操作を再現することも出来ました。

これまでは Node.js と Python がサポートされていたのですが、今朝のアップデートで新たに Java ランタイムがサポートされました。

https://aws.amazon.com/about-aws/whats-new/2025/05/amazon-cloudwatch-synthetics-java-runtime-lightweight-api/

Java ランタイムの Canary では、特定のブラウザサポートやフレームワークを含まずに、Java Lambda 関数で実装可能なすべての実装が可能となっています。
ただし、ブループリントなどからの作成が出来ず、コンパイル後に Zip パッケージ化したアーティファクトを S3 バケットにアップロードし、そこから Canary を作成する形のみとなっています。

EFEF9A78-9E89-405F-8002-3C719ACE8CF8.png

今回検証用の Canary を作成してみたので手順などを紹介します。

アーティファクトの作成

公式ドキュメントでは Gradle や Maven の作成例が記載されていますが、Jar ファイルを Zip パッケージに含めれれば良いので、コンパイルできて Lambda ハンドラーとして指定出来れば何でも大丈夫です。

https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Synthetics_WritingCanary_Java.html

上記公式ドキュメント記載のように次のようなサンプルコードを用意します。

src/main/java/canarypackage/ExampleCanary.java
package canarypackage;

import java.net.HttpURLConnection;
import java.net.URL;

// Handler value: canarypackage.ExampleCanary::canaryCode
public class ExampleCanary { 
  public void canaryCode() throws Exception { 
      URL url = new URL(System.getenv("TESTING_URL"));
      HttpURLConnection con = (HttpURLConnection)url.openConnection();
      con.setRequestMethod("GET");
      con.setConnectTimeout(5000);
      con.setReadTimeout(5000);
      int status = con.getResponseCode();
      if(status != 200) {
        throw new Exception("Failed to load " + url + ", status code: " + status);
      }
  }
}

コンパイル & JAR ファイル作成を行います。

javac -d build/classes/java/main src/main/java/canarypackage/ExampleCanary.java
jar -cf java-canary.jar -C build/classes/java/main .

JAR ファイルが作成されるので、これを次のような構造で Zip パッケージ化します。

simple-canary.zip
    └ lib/
    |  └ java-canary.jar  # コンパイルされたカナリアコード
    └ synthetics.json     # カナリア設定ファイル

事前に synthetics.json を用意しておきます。
Canary に指定可能なオプションファイルです。デフォルトは以下のようになっていまして、今回はこのまま使いたいと思います。

synthetics.json
{
    "handler": "canarypackage.ExampleCanary::canaryCode",
    "step": {
        "stepSuccessMetric": true,
        "stepDurationMetric": true,
        "continueOnStepFailure": false,
        "stepsReport": true
    },
    "logging": {
        "logRequest": false,
        "logResponse": false
    },
    "httpMetrics": {
        "metric_2xx": true,
        "metric_4xx": true,
        "metric_5xx": true,
        "aggregated2xxMetric": true,
        "aggregated4xxMetric": true,
        "aggregated5xxMetric": true
    },
    "canaryMetrics": {
        "failedCanaryMetric": true,
        "aggregatedFailedCanaryMetric": true
    }
}
mkdir -p canary-package/lib
cp java-canary.jar canary-package/lib/
cp synthetics.json canary-package/
cd canary-package
zip -r ../simple-canary.zip *
cd ..

Zip パッケージの作成まで出来ました。

Canary の作成

あとは Zip パッケージを S3 にアップロードし、Synthetics Canary の作成を行います。
先ほど作成できた Zip パッケージを次のように S3 バケットにアップロードしておきました。

B6B22040-D713-48A8-ADF4-3C49B3B7B91C.png

新規 Canary を作成します。
作成方法は「S3 からインポート」を選択しましょう。ブループリントやインラインエディタではランタイムバージョンにsyn-java-1.0を選択できないので注意してください。

ランタイムバージョンと Zip パッケージの S3 パスを指定し、関数ハンドラも指定します。

0143455B-7CB5-4FD7-A0BC-7076436DA2EF.png

作成後、自動で Canary に紐づいた Lambda 関数が作成されます。

FD44B06F-F57A-40AD-B99F-FE92414AF1E9.png

今回はスケジュールではなくオンデマンドで実行してみましたが無事実行できました。

12A0EE12-7DF1-4945-B4AB-B15A1B1B29A0.png

さいごに

本日は Amazon CloudWatch Synthetics で Java ランタイムがサポートされたので使ってみました。

Zip パッケージの構造を把握してなかったり、関数ハンドラで Lambda を意識しきれてなかったりと、あまり深く考えずに普通の Java コードを作成するとちょっと手こずります。
ハンドラが見つかりませんというエラーが何度も発生しました。

通常の Node.js や Python よりも事前準備が少し大変ですが、既存のテストコードや Java に依存したライブラリを使いたい場合などに採用出来そうです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.