フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

Laravel・S3署名付きURLを生成する

はじめに

  • Laravelで署名付きURLを生成する。

S3にファイルを保存

  • S3にファイルをアップロードする際にタグの情報を付与することが出来る。タグの情報は署名付きURLを取得する際にタグと同じ条件のユーザーのみ取得できるようにするためにファイルにタグを付与している
      $object_key = Storage::disk('s3')->putFile($this->user->id.'/chat', $request->file('file'), [
        'Tagging' => 'hogehogeid='. $this->hogehogeid
      ]);

S3に保存されているファイルを署名付きURLの生成方法

  • 署名付きURLの生成メソッド
    protected function _getS3SignatureImageURL($key)
    {
      // S3Clientを設定
      $s3Client = new S3Client([
          'version' => 'latest',
          'region' => config("filesystems.disks.s3.region"),
          'credentials' => [
              'key' => config("filesystems.disks.s3.key"),
              'secret' => config("filesystems.disks.s3.secret"),
          ],
      ]);
      $bucket = config("filesystems.disks.s3.bucket");

      // タグの情報を取得
      $tags = $s3Client->getObjectTagging([
        'Bucket' => $bucket,
        'Key' => $key,
      ]);
      // hogehogeidとは異なるタグが設定されている場合、署名付きURLはNULLで返す
      if ($tags['TagSet'][0]['Value'] === $this->hogehogeid) {
        // S3オブジェクトのキーを指定して、署名付きURLを生成
        $expires = '+180 minutes'; // 有効期限
        $cmd = $s3Client->getCommand('GetObject', [
            'Bucket' => $bucket,
            'Key' => $key,
        ]);
        $request = $s3Client->createPresignedRequest($cmd, $expires);
   // 署名付きURLを取得する
        $presignedUrl = (string)$request->getUri();
        return $presignedUrl;
      } else {
        return null;
      }
    }