S3にあるオブジェクトURLを直接叩くと「Access Denied」と表示される場合があります。
それはそのオブジェクトのアクセス権限の全員(パブリックアクセス)の部分に適切な許可がないためになります。
誰がいつ見てもいいファイルとかならここの権限をちょちょいと変更してパブリックアクセスに変更することもある思うのですが、そうしたくない場合も多いと思います。
そういうときのために、「署名付きURLを発行してそのURLが発行から有効な時間範囲内であれば見れるようにする」ということを行います。
URLの有効期限があって「なんとか日以降は見れなくなります。」みたいな文言ってよくありますよね。
あれです。
PHP SDK を利用しています。
まずは公式を参考に
ほぼコピペでいけました。
署名だの有効期限だの難しそうなことが簡単で嬉しいです。
$s3Client = new Aws\S3\S3Client([
'credentials' => [
'key' => [アクセスキー],
'secret' => [シークレットアクセスキー]
],
'region' => 'ap-northeast-1',
'version' => 'latest'
]);
$cmd = $s3Client->getCommand('GetObject', [
'Bucket' => [バケット名],
'Key' => [バケット名以降のパス],
]);
$request = $s3Client->createPresignedRequest($cmd, '+20 minutes'); // 20分間有効
こちらでリクエストにアクセスしたら確認が出来ました。
ただし、今回はアクセス時にPCにダウンロードしてほしかったので、コマンドにメタデータをセットします。
メタデータのセット
新しいファイル名を指定してセットします。
$new_filename = urlencode('ほげほげ.pdf'); // ほげほげ.pdfとしてダウンロードされます
$cmd = $s3client->getCommand('GetObject', [
'Bucket' => [バケット名],
'Key' => [バケット名以降のパス],
'ResponseContentDisposition' => "attachment; filename=\"{$new_filename}\""
]);
無事にダウンロードできました。
ブラウザは Chrome でしかやってないので他のブラウザはどうかはちょっとわからないです…。
他の方がやっているのを見たので発見できましたが、いつも見ているような日本語のページでは見つけられませんでした。
ここならありました。
【参考サイト】