メンチカツ

ロースカツが好きです

AWS SDKで、S3のバケット指定がうまくいかない

バケット名にドット(ピリオド)いれてませんか?

static final String BUCKET = "hoge.org";
 
AmazonS3Client client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey));
client.setEndpoint("s3-ap-northeast-1.amazonaws.com");
client.setRegion(Region.getRegion(Regions.AP_NORTHEAST_1));

URL url = client.getUrl(BUCKET, "file");
// 期待してる値 => https://s3-ap-northeast-1.amazonaws.com/hoge.org/file
// ところが!! => https://hoge.org.s3-ap-northeast-1.amazonaws.com/file


バケット名にドット(ピリオド)が入っていると、ドメインとして
扱われてしまうようです(aws-java-sdk 1.6.3で確認)。

バケットをドメインじゃなくてパスとして扱うようにするには、以下のように
します。

//java
AmazonS3Client client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey));
client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));

//php
$client = new AmazonS3();
$client->path_style = true;