背景
ある日、DynamoDBをローカルで動かすようなプログラムをいつものように実行したら、プロキシ関係のエラーではまった。
結局は単純だったが、かなり時間かけてしまったので、ほかに自分みたいな人間が生まれないように、記録。
起きたこと
JavaプログラムからAWS SDkを使用して、Awsのサービスにアクセスしようとした。
これまでは、問題なくアクセスできていたが、サービスにアクセスできない事態が発生。
スタックトレースには、以下のエラーが発生。
com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: null (Service: AmazonDynamoDBv2; Status Code: 502; Error Code: null; Request ID: null; Proxy: proxy.*****)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1862)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1415)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1384)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1154)
原因
少し前にAWS CLIからインスタンスの起動と停止をできるように、システム環境変数に
- HTTPS_PROXY
- HTPP_PROXY
を追加した。
以下に記載があるが、AmazonHttpClientは、システムプロパティと、システム環境変数を見にいくような実装になっている。
そのため、意図しない形で、プロキシ設定が対象のアプリケーションに設定されてしまっていた。
AmazonDynamoDB のクライアント作成メソッド内で、
引数のclientConfigurationは特に何も指定せずデフォルトでクライアントビルダーを生成している。
そしてAmazonDynamoDBClient.build()を実行すると、内部的に、SystemのProperty("http.proxyHost")と同期され、
設定されていなければ、SystemのEnv(HTTP(S)_PROXY)と同期しに行くようになっている。