お客さんへファイル共有

でっかいファイルをS3にアップして、お客さんにURL伝えてDLしてもらう、というシチュエーションでは以下の手順によりそこそこセキュリティも考慮されていてお客さんも負担無くファイルを受け取れる。

管理者ユーザでお客さん用のIAMユーザ、バケットフォルダを作成

  1. S3バケット(customer)を作成
  2. /share フォルダを作成
  3. a.txt ファイルをアップ(バケット:customer、ファイルパス:share/a.txt)
  4. IAM画面で CustomerA ユーザを作成し、アクセスキーを取得する。(AWSコンソールにログインさせるためのパスワードは要らない)
  5. 以下の Permissions を指定


{
"Statement": [
{
"Action": "s3:GetObject",
"Effect": "Allow",
"Resource": "arn:aws:s3:::customer/share/*"
"Condition": {
"Bool":{"aws:SecureTransport":"true"}
}
}
]
}

お客さんからa.txtへアクセスできるURLを発行する

  1. aws sdk for javaをセットアップ
  2. 以下のソースを実行して、出てきたURLをお客さんにお知らせする(今から1時間以内しかアクセスできません)
String accessKey = "アクセスキー";
String secretKey = "シークレットキー";

String bucketName = "customer";
String objectKey = "share/a.txt";

AWSCredentials myCredentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonS3 s3Client = new AmazonS3Client(myCredentials);

java.util.Date expiration = new java.util.Date();
long msec = expiration.getTime();
msec += 1000 * 60 * 60; // 1 hour.
expiration.setTime(msec);

GeneratePresignedUrlRequest generatePresignedUrlRequest =
    new GeneratePresignedUrlRequest(bucketName, objectKey);
generatePresignedUrlRequest.setMethod(HttpMethod.GET);
generatePresignedUrlRequest.setExpiration(expiration);

URL s = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
System.out.println("URL = " + s); // => https://customer.s3.amazonaws.com/share/a.txt?Expires=1397372673&AWSAccessKeyId=xxxxxxxxxxxxx&Signature=xxxxxxxxxxxxxxxxx

参考URL) http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/ShareObjectPreSignedURLJavaSDK.html


詳しくは調べてないけど、これで出てきたURLは、証明書とURLのホストが違っているので、証明書が違う!とお怒りになりますけれど、

https://s3-ap-northeast-1.amazonaws.com/customer/share/a.txt?Expires=1397365249&AWSAccessKeyId=...

というように書き換えてやればOKです。(「s3-ap-northeast-1」はバケットによって違うかもしれません)