SonataMediaBundle - S3 AWS:'配置的存储桶“我的存储桶”不存在

Posted

技术标签:

【中文标题】SonataMediaBundle - S3 AWS:\'配置的存储桶“我的存储桶”不存在【英文标题】:SonataMediaBundle - S3 AWS: 'The configured bucket "my-bucket" does not existSonataMediaBundle - S3 AWS:'配置的存储桶“我的存储桶”不存在 【发布时间】:2016-03-02 00:18:11 【问题描述】:

我正在尝试在我的 Sonata-Project 上配置 AWS s3 文件系统,但我总是收到以下错误:

配置的存储桶“my-bucket”不存在。

我的sonata_media.yml

cdn:
    server:
        path: http://%s3_bucket_name%.s3-website-%s3_region%.amazonaws.com

providers:
    image:
        filesystem: sonata.media.filesystem.s3
    file:
        resizer:    false
        allowed_extensions: ['pdf']
        allowed_mime_types: ['application/pdf', 'application/x-pdf']


filesystem:
    s3:
        bucket: %s3_bucket_name%
        accessKey: %s3_access_key%
        secretKey: %s3_secret_key%
        region: %s3_region%

我在 parameters.yml 中添加了以下参数:

s3_bucket_name: my-bucket
s3_region: eu-central-1
s3_access_key: MY_ACCESS_KEY
s3_secret_key: MY_SECRET_KEY

目前我使用这个库:

    "aws/aws-sdk-php": "2.8.10"

(在最新版本中,s3_region 参数出现错误。)

存储桶策略:


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-bucket/*"
        
    ]

我想我不必说桶就在那里。

有人知道问题是什么吗?

【问题讨论】:

您使用的是什么版本的奏鸣曲媒体?我的 aws 集成适用于: "sonata-project/media-bundle": "2.3.x-dev#b3b26a2", "aws/aws-sdk-php": "~2.7" 我使用带有提交 ID 的 2.3 分支引用了新sdk的集成 【参考方案1】:

所以,我也遇到了这个问题,花了大约 3 个小时来修复它。

TL;博士

我很确定你使用了aws-sdk-php 3,所以你必须切换你的配置才能使用这个:

services:
    acme.aws_s3.client:
        class: Aws\S3\S3Client
        factory: [Aws\S3\S3Client, 'factory']
        arguments:
            -
                version: latest
                region: %amazon_s3.region%
                credentials:
                    key: %amazon_s3.key%
                    secret: %amazon_s3.secret%

而不是这个:

services:
    acme.aws_s3.client:
        class: Aws\S3\S3Client
        factory: [Aws\S3\S3Client, 'factory']
        arguments:
            -
                key: %amazon_s3.key%
                secret: %amazon_s3.secret%
                region: %amazon_s3.region%

如here 所述。因此,您始终无需任何凭据即可连接到 AWS。

正确配置knp_gaufrette

1) 创建 IAM 用户

不要使用您的根访问密钥和访问密钥与 Amazon S3 进行交互。创建一个访问类型为“程序访问”的新帐户,以明确允许与单个存储桶进行交互。我打电话给我的用户s3-bucket-staging,亚马逊给它的ID是arn:aws:iam::REMOVED:user/s3-bucket-staging

您不必添加组或附加任何策略。 确保您保存生成的访问密钥 ID 和秘密访问密钥,因为这是您唯一需要这样做的机会。

2) 编辑您的存储桶策略

因此,对于具有全局读取但没有列表权限的非常基本的存储桶(因此人们可以访问单个文件但不能访问所有文件的列表),您可以添加以下策略:


    "Version": "2012-10-17",
    "Id": "Policy1489062408719",
    "Statement": [
        
            "Sid": "AllowGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BUCKET-NAME/*"
        ,
        
            "Sid": "AllowListBucket",
            "Effect": "Allow",
            "Principal": 
                "AWS": "arn:aws:iam::REMOVED:user/s3-bucket-staging"
            ,
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::BUCKET-NAME"
        ,
        
            "Sid": "AllowPutObject",
            "Effect": "Allow",
            "Principal": 
                "AWS": "arn:aws:iam::REMOVED:user/s3-bucket-staging"
            ,
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::BUCKET-NAME/*"
        
    ]

另见:

Specifying a Principal in a Policy IAM Policy Elements: Principal Providing Credentials to the SDK Request via aws cli client works fine but using PHP SDK fails with 403 clientError Forbidden

【讨论】:

REMOVED 在这里指的是什么?那是您为 s3 创建的用户帐户的名称吗? 是的,这基本上是 aws 用户 id(id 由您可以从 aws 复制的整个字符串表示:arn:aws:iam::REMOVED:user

以上是关于SonataMediaBundle - S3 AWS:'配置的存储桶“我的存储桶”不存在的主要内容,如果未能解决你的问题,请参考以下文章

Spark的S3角色授权?

SonataMediaBundle - 如何上传图片?

SonataMediaBundle:找不到文件/图像

SonataMediaBundle : 允许用户上传链接

安装 SonataMediaBundle 后映射异常

未使用 SonataMediaBundle 找到 ManagerInterface