【AWS】S3の署名付きURLとは?有効期限付きアクセスリンクを発行する方法をわかりやすく解説!
生徒
「AWSのS3で、画像やファイルに一時的にアクセスさせたいときって、どうすればいいんですか?」
先生
「それには『署名付きURL(サイン付きURL)』という方法があります。S3に保存されたオブジェクトに対して、有効期限付きの一時的なアクセスリンクを発行できるんですよ。」
生徒
「それってセキュリティ的にも安心なんですか?」
先生
「もちろんです。時間制限付きでアクセスできるリンクなので、ファイルを公開せずに特定の人にだけ見せることができます。では、詳しく見ていきましょう!」
1. S3の署名付きURLとは?
AWS S3(Simple Storage Service)の署名付きURLとは、S3バケット内に保存されたオブジェクト(画像・PDF・動画など)に一時的にアクセスするためのリンクです。 通常、S3のオブジェクトはパブリックアクセスをオフにするのが推奨ですが、署名付きURLを使えば、セキュリティを保ったまま限定的にアクセスを許可できます。
たとえば、ECサイトで一時的に商品画像を外部業者に見せたいときや、社内の資料を外注先に渡したいときなどに活用されます。
2. 署名付きURLを使うメリット
署名付きURLの主なメリットは以下の通りです。
- 一時的なアクセス制御ができる
- URLに有効期限を設定できる
- 公開設定を変更せずにファイル共有が可能
- CloudFrontとも連携できる
セキュリティを保ちつつ、特定の期間だけ共有したいというニーズに最適です。AWSではIAMロールやポリシー設定も使いながら、きめ細かくアクセス権を制御できます。
3. 署名付きURLを発行する方法(AWS CLI / Java SDK)
署名付きURLは、AWS CLIやSDK(Java / Python / Node.jsなど)から発行可能です。ここではJava SDK(AWS SDK for Java v2)を使った例を紹介します。
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Presigner;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
import java.net.URL;
import java.time.Duration;
public class GeneratePresignedUrl {
public static void main(String[] args) {
S3Presigner presigner = S3Presigner.builder()
.region(Region.AP_NORTHEAST_1)
.credentialsProvider(ProfileCredentialsProvider.create())
.build();
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket("your-bucket-name")
.key("your-object-key.jpg")
.build();
GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
.signatureDuration(Duration.ofMinutes(10))
.getObjectRequest(getObjectRequest)
.build();
URL url = presigner.presignGetObject(presignRequest).url();
System.out.println("Presigned URL: " + url);
}
}
このコードでは、S3バケットの「your-bucket-name」にある「your-object-key.jpg」ファイルへの、10分間有効な署名付きURLを発行しています。
4. 有効期限とセキュリティの考慮点
有効期限は、用途に応じて1分〜数時間程度にするのが一般的です。あまりに長く設定すると、第三者にURLが漏れた場合にリスクが高くなります。
また、署名付きURLの再利用や意図しない拡散を防ぐために、利用後すぐにURLを無効化したい場合は、オブジェクトキーの変更や一時的な削除といった方法もあります。
5. CloudFrontと組み合わせて高速・安全な配信
よりセキュアかつ高速にコンテンツ配信したい場合、S3 + CloudFront(CDN)と組み合わせて「署名付きURL」を使う構成がおすすめです。
CloudFrontでは、独自の署名付きURL(Signed URLs)やCookieベースの制御も可能で、IP制限やReferer制限など高度な設定もできます。 S3単体の署名付きURLよりも柔軟な配信コントロールが可能になるため、大規模なファイル配信において効果的です。
6. よくあるエラーと対処方法
署名付きURLの発行時やアクセス時に遭遇しやすいエラーには次のようなものがあります。
- AccessDenied:バケットポリシーやIAMロールでGetObjectの許可がない
- ExpiredToken:署名付きURLの有効期限切れ
- NoSuchKey:指定したオブジェクトキーが存在しない
これらのエラーを回避するには、事前にバケットのポリシー設定やIAM権限をしっかり確認し、URLの発行時に正しいキーを指定するようにしましょう。
7. 署名付きURLを活用できる具体例
実際の活用シーンはさまざまです。
- 動画配信サイトで、ユーザーが購入後に視聴できるURLを一時発行
- 社内ツールから、特定の社員だけにダウンロード用リンクを送付
- ECサイトで、外部業者に一時的に商品画像を提供
「S3の署名付きURL」を使うことで、S3オブジェクトへの安全で限定的なアクセスが実現し、ビジネスにおけるファイル共有の利便性とセキュリティを両立できます。