Riak CSへのアクセス方法
Riak CS にアクセスする場合、CSをs3.amazonaws.comにアクセスするためのProxyとして使うアクセス方法と
、CSに直接アクセスする方法がある。
http://docs.basho.com/riakcs/latest/cookbooks/configuration/Configuring-Riak-CS/#Proxy-vs-Direct-Configuration
Riak CSにAWS SDKを使って直接アクセスする場合の問題点
Riak CSにAWS SDKを使って直接アクセスすると、以下のような例外が発生する。
com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: Access Denied), S3 Extended Request ID: null
Riak CSにAWS SDKを使って直接アクセスする場合、AmazonS3Client.setEndpoint()
でエンドポイントを指定する。
エンドポイントを指定すると、AWS SDK内部のリクエスト署名アルゴリズムがversion 4の形式に変更される。
Riak CSがversion 4の署名アルゴリズムに対応していないため、認証が失敗することになる。
対処方法
AmazonS3Client のコンストラクタに渡す ClientConfiguration で、以下のように署名アルゴリズムタイプを指定する。
ClientConfiguration.withSignerOverride("S3SignerType")
'S3SignerType' を指定すると、エンドポイントを設定しても署名アルゴリズムがv2のままになるので、認証が成功する。