読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

S3 AWS SDK: エンドポイントによるパススタイルの違い

S3は, (bucket, filename)を指定した場合,

  1. パススタイル: host => xxx, path => bucket/filename
  2. 仮想ホストスタイル: host => bucket.xxx, path => filename

という2つのスタイルをとることが出来る. (参考: http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/VirtualHosting.html, AWS - S3のバケットURL(仮想ホスト形式とパス形式) - Qiita) デフォルトはDEFAULT_PASS_STYLE_ACCESS(=false)で決まる.

これについてAWS SDKの恐ろしい挙動を知ってしまった.

cli.setRegion(Region.AP_Tokyo.toAWSRegion)
val url = cli.getUrl("bucket", "filename") // (1)
cli.setEndpoint("http://127.0.0.1:8080")
val url = cli.getUrl("bucket", "filename") // (2)
cli.setEndpoint("133.145.228.249:80")
val url = cli.getUrl("bucket", "filename") // (3)
cli.setEndpoint("http://127.0.0.1:8080")
cli.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(false))
val url = cli.getUrl("bucket", "filename") // (4)
cli.setRegion(Region.AP_Tokyo.toAWSRegion)
cli.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true))
val url = cli.getUrl("bucket", "filename") // (5)
cli.setEndpoint("s3-ap-northeast-1.amazonaws.com")
val url = cli.getUrl("bucket", "filename") // (6)

これはそれぞれ, どちらのスタイルになるだろうか?

  1. 仮想ホストスタイル
  2. パススタイル
  3. パススタイル: 2,3より, http/httpsは関係ないことが分かる
  4. "パススタイル" (omg): withPathStyleAccess(false)が効いていない
  5. "パススタイル": withPathStyleAccess自体は動いているようだ
  6. "パススタイル": 1,6より, setRegionとsetEndpointのどちらを使うかという実装には依存していない.

2,3,4が驚き. これらの結果より私の推測は: AmazonのS3サーバじゃないと仮想ホストスタイルが使えない. 独自S3実装にはパススタイルしか飛んでこない. withPathStyleAccessで強制しようとしても無理である.

私はウェブサーバのことはよく分かっていないが, この理由の推測は: AWS SDKが, 独自S3に対しては, 仮想ホスティングを期待しないことにしている. ではないかと思う.

本当の理由は何だろうか?知ってる人がいたら教えてください.