EC2のlaravelでアップロード用証明書付きURLを取得しようと思うと、例えば以下のようなものが蜜つかります。
IAMユーザでアクセスキーを発行して以下のようにする
.env
AWS_ACCESS_KEY_ID=<<IAMユーザのアクセスー>>
AWS_SECRET_ACCESS_KEY=<<IAMユーザのシークレットキー>>
AWS_DEFAULT_REGION=<<リージョン>>
AWS_BUCKET=<<バケット>>
$client = App::make('aws')->createClient('s3');
$cmd = $client->getCommand('PutObject', [
'Bucket' => config('filesystems.disks.s3.bucket'),
'Key' => <<保存先のパス>>
]);
$url = $client->createPresignedRequest($cmd, '+1 days');
ただし、昨今IAMユーザのアクセスキーを使ったアクセスはあまりおすすめされません。
その場合、
- 必要な権限を付与したIAMロールを作成してEC2にアタッチ
- .envのアクセスキー/シークレットキーを空欄にする
とすると、以下のようなコードでアクセスキーを使用したときと同じようにGet用の証明書付きURLは取得できます。
$url = Storage::disk('s3')->temporaryUrl(<<パス>>, Carbon::now()->addDay());
しかし、アップロード用のURLはこの方法で取得したURLからアップロードすると、アクセスキーが必要な旨のエラー(403)になります。
どうしたものかと色々眺めていたら、Illuminate\Filesystem\FilesystemAdapter に 「temporaryUploadUrl」というメソッドが!!
どうやら、laravel9.xから追加されたようです。
以下のようなコードで無事IAMロールでアップロード用の証明書付きURLが取得できます。
$ret = Storage::disk('s3')->temporaryUploadUrl(<<パス>>, Carbon::now()->addDay());
$url = $ret['url'];