1
0
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

EC2のIAMロールを使ってlaravel9以降でS3アップロード用証明書付きURL取得

Posted at

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ユーザのアクセスキーを使ったアクセスはあまりおすすめされません。

その場合、

  1. 必要な権限を付与したIAMロールを作成してEC2にアタッチ
  2. .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'];
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0