👝

BrefでS3を追加した時はtokenを持たせないといけない

2024/05/07に公開

問題

Brefでfilesystems.disksにデフォルトのs3とは別でS3の設定を追加しても接続できない。

バージョンなど

composer.jsonのコピペ(ふんわりでスマソ)

"bref/bref": "^2.1",
"bref/laravel-bridge": "^2.3",
"laravel/framework": "^11.0",
"league/flysystem-aws-s3-v3": "^3.0",

バケットの追加

config/filesystems.phpを以下のように編集した。

// デフォルトのs3。
's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'url' => env('AWS_URL'),
    'endpoint' => env('AWS_ENDPOINT'),
    'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
    'throw' => false,
],

// 追加したs3。
's3_another' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET_ANOTHER'),
    'url' => env('AWS_URL'),
    'endpoint' => env('AWS_ENDPOINT'),
    'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
    'throw' => false,
],

結論

追加したs3の設定にtokenを追加する。

's3_another' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'token' => env('AWS_SESSION_TOKEN'), // これを追加する。
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET_ANOTHER'),
    'url' => env('AWS_URL'),
    'endpoint' => env('AWS_ENDPOINT'),
    'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
    'throw' => false,
],

ちょっとだけ深掘り

phpinfo();で確認すると、実行時の環境変数にAWS_SESSION_TOKENがある。
/vendor/bref/laravel-bridge/src/BrefServiceProvider.phpを確認すると、デフォルトのs3にはtokenとしてセットされていた。

/**
 * Set up Bref integration.
 *
 * @return void
 */
public function register()
{
    $this->mergeConfigFrom(__DIR__ . '/../config/bref.php', 'bref');
    $this->shareRequestContext();

    if (! isset($_SERVER['LAMBDA_TASK_ROOT'])) {
        return;
    }

    $this->app->useStoragePath(StorageDirectories::Path);

    $this->fixDefaultConfiguration();

    Config::set('app.mix_url', Config::get('app.asset_url'));

    Config::set('trustedproxy.proxies', ['0.0.0.0/0', '2000:0:0:0:0:0:0:0/3']);

    Config::set('view.compiled', StorageDirectories::Path . '/framework/views');
    Config::set('cache.stores.file.path', StorageDirectories::Path . '/framework/cache');

    Config::set('cache.stores.dynamodb.token', env('AWS_SESSION_TOKEN'));
    Config::set('filesystems.disks.s3.token', env('AWS_SESSION_TOKEN')); // ← ← ← ← ← ここ
    Config::set('queue.connections.sqs.token', env('AWS_SESSION_TOKEN'));
    Config::set('services.ses.token', env('AWS_SESSION_TOKEN'));

    $this->app->when(QueueHandler::class)
        ->needs('$connection')
        ->giveConfig('queue.default');
}

なのでs3には必要ないけど、追加した分には自分でセットしないといけない。(多分)

上下を見るとsqsとか他のにもセットしてくれてる。
Brefって親切なんですねー。

Opligence Developer Blog

Discussion