Amazon Web Services ブログ

AWS SDK for Java v2のSmart Configuration Defaultsの紹介

(この記事はIntroducing Smart Configuration Defaults in the AWS SDK for Java v2を翻訳したものです。)

AWS SDK for Java v2 のデフォルト設定がよりスマートになりました。AWS SDK for Java v2 (バージョン 2.17.102 以降) の Smart Configuration Defaults という SDK の新機能を発表できることを嬉しく思います。この機能は一般的な使用パターンに合わせて事前定義された実用的なデフォルト値のセットを提供します。この新しいオプトイン機能により、AWS SDK のベストプラクティスに準拠するように調整済みの設定で、最適化された SDK クライアントをすぐに利用できます。この機能は、.NET 用 AWS SDK、JavaScript v3、Ruby v3、Go v2、Python、PHP でも利用できます。この投稿ではこの機能について説明しAWS SDK for Java v2 でその機能を活用する方法を示します。

Smart Configuration Defaults とは?

AWS SDK for Java v2 ではリトライポリシーや接続タイムアウトなどの様々なオプション設定が公開されており、それらが設定されていない場合はデフォルト値が提供されます。Smart Configuration Defaults のデフォルト値では利用シナリオに基づいてこれらの設定の既定値が拡張されます。この機能はどのデフォルト値を読み込むかを決定するデフォルトモードと呼ばれる設定で有効にできます。

SDKでは、 legacystandardin-regioncross-regionmobileauto の 6 つのデフォルトモードがサポートされています。各モードについては、後のセクションで詳しく説明します。Smart Configuration Defaults を有効にするには、デフォルトの legacy の値をユースケースに合った値に置き換えるだけで済みます。

デフォルトモードの設定方法

設定方法にはいくつかの選択肢があります。

オプション1 : サービスクライアントのビルダー

SDKクライアントのデフォルトモードはサービスクライアントビルダーから直接設定できます。以下は S3Clientauto デフォルトモードを設定するサンプルコードです。

S3Client s3Client = S3Client.builder()
                   .defaultsMode(DefaultsMode.AUTO)
                   .build();

オプション2:システムプロパティー

システムプロパティにaws.defaultsMode を設定してデフォルトモードを指定できます。有効化するためには SDK クライアントの初期化の前にシステムプロパティを設定する必要があります。

System.setProperty("aws.defaultsMode", "auto");

オプション3:環境変数

環境変数に AWS_DEFAULTS_MODE をセットして使用したいモードを設定できます。上記のオプションと同様に有効化するためにはSDK クライアントの初期化を実行する前にご利用の環境で環境変数を設定する必要があります。

export AWS_DEFAULTS_MODE=auto

オプション4:AWSの設定ファイル

AWSの設定ファイルにデフォルトモードを設定できます。

[default] 
defaults_mode = auto

どのデフォルトモードを選ぶべきか

デフォルトモードの設定方法がわかったので、アプリケーション用にどのモードを選択するかを見てみましょう。SDK でサポートされているデフォルトモードは次のとおりです。

  • standard — AWS SDK が推奨する最新プラクティスに従い、ほとんどのシナリオで安全に実行できるデフォルト値を提供します。
  • in-region — standard モードに基づいて構築され、リージョン内のAPI リクエストに対する SDK クライアントの耐障害性がさらに向上します。同じ AWS リージョン内から AWS サービスを呼び出すアプリケーション向けに調整されています。たとえばアプリケーションが us-east-1 で実行されていて us-east-1 の AWS サービスにリクエストを送信するだけの場合、これは適切なデフォルトモードです。
  • cross-region — standardモードに基づいて構築されクロスリージョンのAPIリクエストに対する SDK クライアントの耐障害性がさらに向上します。これは異なるリージョンの AWS サービスを呼び出すアプリケーション向けに調整されています。たとえばアプリケーションが us-west-2 で実行されていてus-east-1 で AWS サービスにリクエストを送信している場合、これは適切なデフォルトモードです。
  • mobile — standard モードに基づいて構築され、モバイルアプリケーション向けにさらに最適化されています。
  • auto — SDKは最初に実行環境の検出を試みます。たとえばアプリケーションがモバイルで実行されているか、SDK クライアントがクロスリージョンコールを行っているかを確認し、それに応じてデフォルト値を提供します。自動検出はヒューリスティックベースであるため、100% の精度は保証されないことに注意してください。

auto モードを除くすべてのモードは静的デフォルトモードです。つまり最適化されたコンフィギュレーションのデフォルトはコンパイル時に決定されます。一方 auto モードは実行環境を検査して実行時に適用する適切な静的デフォルトモードを決定しようとするため動的です。ランタイム環境を決定できない場合は standard モードの値が使用されます。自動検出によってEC2 インスタンスのメタデータとユーザーデータがクエリされますが、その場合シナリオによってはレイテンシーが発生することがあります。アプリケーションが起動レイテンシーの影響を受けやすい場合は、静的なデフォルトモードの中から選択することをお勧めします。

選択するモードを決定するには、次のフローチャートをガイドラインとして使用できます。

Smart Configuration Defaults Flowchart

どの設定オプションが最適化されるのか?

特定のモードで最適化される設定オプションを見てみましょう。AWS SDK とツールのリファレンスガイドで各モードの値を確認できます。

  • retryMode: SDK が再試行を試みる方法を指定します。RetryMode のドキュメントを参照してください。
  • s3UsEast1RegionalEndpoints: us-east-1リージョンの Amazon S3 と通信するために使用する AWS サービスエンドポイントを SDK がどのように決定するかを指定します。AWS_S3_US_EAST_1_REGIONAL_ENDPOINT をご覧ください。
  • connectTimeoutInMillis: ソケットに対する最初の接続を試みた後、クライアントがハンドシェイクの完了を受け取らなかった時にクライアントが操作を失敗と扱う時間を設定します。NettyNioAsyncHttpClient.Builder#connectionTimeout をご覧ください
  • tlsNegotiationTimeoutInMillis: TLS ハンドシェイクが許可される最大時間、CLIENT HELLO メッセージが送信された時点からクライアントとサーバーが暗号を完全にネゴシエートして鍵を交換し終わるまでの最大時間を指定します。NettyNioAsyncHttpClient.Builder#tlsNegotiationTimeout をご覧ください。

SDK クライアントで明示的に設定した値は Smart Configuration のデフォルト値よりも常に優先されます。たとえば SDK クライアントで接続タイムアウトを 2 秒に設定している場合、デフォルトモードは設定値をオーバーライドしません。

この機能によって設定されるデフォルト値は SDK のベストプラクティスの進化に伴って変更される可能性があるため、SDK をアップグレードするたびにアプリケーションを入念にテストすることをお勧めします。

まとめ

この追加によりAWS SDK for Java v2 の設定がさらに簡単になることを願っています。AWS SDK とツールのリファレンスガイドから詳細を学ぶことができます。この機能に関するフィードバックや、今後実装を希望するその他の改善点があれば幸いです。GitHub の issue を作成してお知らせください。

翻訳は、ソリューションアーキテクト紙谷が担当しました。原文はこちらです。

Zoe Wang

Zoe Wang

ZoeはAWS SDK for Javaを担当しているソフトウェアエンジニアです。彼女はデベロッパーエクスペリエンスの向上に情熱を注いでいます。彼女を見つけるにはGithub @zoewanggから探してください。