S3のプライベートバケット上の画像に時限付きURLでアクセスする

今回はローカルPCとしてはmacを使用してS3のプライベートバケット上にある画像を時限付きのURLを発行してアクセスする手順を記載します。(デフォルトのクレデンシャル情報としてセットしておきます)
AWS SDK for PHPを使用してスクリプトを書いていきます。
事前作業としてはS3FullAccess権限のついたIAMユーザをローカルにセッティングし、composerのインストールも実施しておきます。
参考サイトは以下の公式サイトです。それでは手順にうつります。

docs.aws.amazon.com

作業手順

以下の作業手順の1.2は今回も同様になります。
1は作業用のディレクトリ作成および移動、2はAWS SDK for PHPのインストールです。

tomomiik.hatenablog.com

1. S3プライベートバケット作成および画像配置

以下の通りS3バケットを作成します。
名前は今回は「s3-private-test-bucket」にします。
パブリックアクセスをブロックした状態で、バケット作成時にファイルをアップロードしておきます。

f:id:tomomiik:20200520013026p:plain

2. アクセス確認(Deny)

この状態でオブジェクトのエンドポイント(URL)にアクセスしても、パブリックアクセスをブロックしているため、アクセスできません。

▼ エンドポイント

f:id:tomomiik:20200520013411p:plain

▼ アクセスDeny

f:id:tomomiik:20200520013426p:plain

3. 期限付きURLを発行するスクリプト作成

先ほどアップロードしたファイルにアクセス出来るように期限付きの URL を生成してみます。
SDK をインストールしたディレクトリと同じディレクトリに test2.php というファイルを作成します。

▼ test2.phpの内容

<?php
  
require './vendor/autoload.php';

use Aws\S3\S3Client;
use Aws\Exception\AwsException;

$s3Client = new Aws\S3\S3Client([
    'profile' => 'default',
    'region' => 'ap-northeast-1',
    'version' => '2006-03-01',
]);

$cmd = $s3Client->getCommand('GetObject', [
    'Bucket' => 's3-private-test-bucket',
    'Key' => 'test.png'
]);

$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');

$presignedUrl = (string)$request->getUri();

print $presignedUrl;

スクリプトの内容としては、デフォルトのクレデンシャル情報を見にいきます。
バケット名(s3-private-test-bucket)、ファイル名(test.png)、期限(時間)(20 minutes)を指定します。

test2.php を以下のように実行します。

$ php test2.php

そうするとこのような長い期限付きURLが表示されます。

f:id:tomomiik:20200520023831p:plain

このURLにアクセスすると、以下の通り、見れなかった画像が見れるようになります!!

f:id:tomomiik:20200520023936p:plain

この事前付きURLは20分で設定しているので、20分後、同じURLでアクセスして見れるか確認してみます。

無事、20分後は見れなくなりました!

f:id:tomomiik:20200520024929p:plain

今日もお疲れ様でした。