【问题标题】:How can I use Storage::disk('s3')->put() when my s3's x-amz-server-side-encryption is AES256 at Laravel 5.1?当我的 s3 的 x-amz-server-side-encryption 在 Laravel 5.1 中为 AES256 时,如何使用 Storage::disk('s3')->put()?
【发布时间】:2017-03-22 11:59:45
【问题描述】:

RT。

这是我的 s3 的文件系统配置:

's3' => [
        'driver' => 's3',
        'key'    => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_REGION'),
        'bucket' => env('AWS_BUCKET'),
    ],

这是我的 composer.json:

"require": {
        "laravel/framework": "5.1.*",
        "barryvdh/laravel-ide-helper": "~2.0",
        "predis/predis": "~1.0",
        "guzzlehttp/guzzle": "~5.0",
        "league/flysystem-aws-s3-v3": "~1.0",
        "raven/raven": "0.12.*"
    },

这是我的 s3 的存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyUnEncryptedObjectUploads",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::*****bucket_name*****/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption": "AES256"
                }
            }
        }
    ]
}

是的,我使用 "s3:x-amz-server-side-encryption": "AES256" 作为我的 PutObject 的条件,但我想像这样使用代码:

Storage::disk('s3')->put('test.log','123');

但是当我运行它时,我会得到这样的响应:

[Aws\S3\Exception\S3Exception]                                                                                                                                    
Error executing "HeadObject" on "https://s3-ap-northeast-1.amazonaws.com/****bucket_name****/test.log"; AWS HTTP error: Client error response [url]https://s3-ap-northeast-1.amazonaws.com/****bucket_name****/test.log [status code] 403 [reason phrase] Forbidden  (client): 403 Forbidden (Request-ID: 39C30C8512E5ED16) -

[GuzzleHttp\Exception\ClientException]                                                                                                                     
Client error response [url] https://s3-ap-northeast-1.amazonaws.com/****bucket_name****/test.log [status code] 403 [reason phrase] Forbidden

那么,我该怎么做呢? 谢谢!

【问题讨论】:

标签: laravel amazon-web-services amazon-s3 storage


【解决方案1】:

(Laravel 5.3) 如果您的存储桶策略需要对所有对象进行服务器端加密,而不是访问 S3 驱动程序并向其传递参数,我可以通过将其设置为来普遍启用 S3 SSE配置中的一个选项:

config/filesystems.php

...

's3' => [
                'driver' => 's3',
                'key'    => env('AWS_ACCESS_KEY_ID'),
                'secret' => env('AWS_SECRET_ACCESS_KEY'),
                'region' => env('AWS_REGION'),
                'bucket' => env('AWS_S3_BUCKET'),
                'options' => [
                    'ServerSideEncryption' => 'AES256',
                ]
            ],

...

通过在配置中设置 ServerSideEncryption 选项,我可以直接在“磁盘”上进行方法调用。

$s3 = Storage::disk('s3');
$s3->putFileAs($prefix, new File($path), $filename);

【讨论】:

  • 这是对整个存储桶进行加密的正确答案
【解决方案2】:

如果您检索 S3 驱动程序,您可以提供参数:

Storage::disk('s3')->getDriver()->put('filename', 'randomdata', ['ServerSideEncryption' => 'AES256']);

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 2017-11-09
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多