AWS App Runner上での可観測性向上に向けた取り組み(Spring Bootを使った実装例)

はじめに

SREとして語られるものの一つに可観測性というものがあります。単純にログを吐けば良いというものから、どのようなリクエストが行われているのかや各種メトリックスなどの情報を取得することが必要となってきています。ここではAWS App Runner上で動くコンテナ化したSpring Bootアプリケーションの可観測性に関する実装を行なっていきます。

前提事項

今回の検証では以下のバージョンを使いました。

  • Java 21
  • Gradle 8.5
  • Spring Boot 3.2.2
  • Jib 3.4.0
  • AWS OpenTelemetry Agent 1.32.0

アプリケーションの実装

まずは、ライブラリとしてAWS OpenTelemetry Agentを使用します。

aws-otel.github.io

build.gradleに以下の記述を追加します。

dependencies {
    // 省略
    javaAgent 'software.amazon.opentelemetry:aws-opentelemetry-agent:1.32.0'
}

javaAgentという記述は、Gradleのconfigurationを使って依存性の管理をするように宣言しておきます。

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    javaAgent
}

今回Jibを使ってコンテナイメージを作成するので、AWS OpenTelemetry Agentをコンテナイメージに取り込み、起動時にjavaagentオプションで指定する記述を追加してあげます。

task agentLibs(type: Copy) {
    from configurations.javaAgent.singleFile
    into 'myagent'
    rename 'aws-opentelemetry-agent-.*\\.jar', 'aws-opentelemetry-agent.jar'
}
jib.from.image = 'eclipse-temurin:21-jre'
jib.container.jvmFlags = ['-javaagent:./myagent/aws-opentelemetry-agent.jar']

jib {
    container {
        appRoot = '/app'
        workingDirectory = '/app'
        extraDirectories {
            paths {
                path {
                    from = './myagent'
                    into = '/app/myagent'
                }
            }
        }
    }
}

tasks.jibDockerBuild.dependsOn agentLibs

これでアプリケーション側の準備はOKです。

App Runnerの設定

App Runnerは2022年にX-Rayのサポートを開始しました。

aws.amazon.com

具体的な実装は、英語&Pythonの例ですが以下に記述があります。

aws.amazon.com

ポイントは、IAM Roleです。AWSXRayDaemonWriteAccessが付与されていないとX-Rayには何も表示されないので注意が必要です。

今回、Spring Boot 3.2を使うためにJava 21を使用しました。2024年1月時点でApp RunnerはJava 11までしかサポートしていないので、最新のSpring Bootを使いたい場合はアプリをコンテナ化する必要があります。

docs.aws.amazon.com

環境変数として以下を設定しておきます。

項目 備考
OTEL_PROPAGATORS xray
OTEL_METRICS_EXPORTER none App RunnerのOpenTelemetryサポートはメトリックスに未対応のため
OTEL_RESOURCE_ATTRIBUTES service.name=任意の名前

App Runnerの可観測性のトレースのスイッチをオンにすることも忘れずに。

実行

App Runnerにアプリをデプロイし、いくつかアクセスを行うとX-Rayにトレースやトレースマップが表示されます。

トレースには各リクエストごとにレスポンスコードや応答時間などが取られていることがわかります。

上はトレースマップ。単純な例なのであまり面白い結果ではないですが、どのようなサービスを利用しているかが図として表示されます。

考察

可観測性の重要性はよく語られますが、実際に実装しようとすると思いのほか面倒臭かったです。今回たまたまAWS OpenTelemetry Agentの存在を知り、動作させることを思い立ったのですが、Jibの設定が手間でした。

また、App RunnerのOpenTelemetryサポートはメトリックスに未対応ということもあったのが残念でした。ここについては、Spring Boot Actuatorで取れるのかなと思いますので、今後実装してみようかなと思います。

また、App RunnerがコードビルドとしてサポートしているJavaのバージョンが2024年1月時点では若干古い(Java 11まで)ので、最新のSpring Bootを使いたい場合はコンテナ化一択となる点も注意かなと考えました。