通过PHP上传到s3失败访问被拒绝

通过PHP上传到s3失败访问被拒绝,php,amazon-s3,php-5.5,aws-php-sdk,Php,Amazon S3,Php 5.5,Aws Php Sdk,问这个问题我觉得有点愚蠢,但是通过当前的PHPSDK上传到S3有什么特别的要求吗?我可以使用相同的凭据通过cli上载,但当我尝试SDK时,它失败了 代码如下: <?php require "awssdk_v3/aws-autoloader.php"; use Aws\S3\S3Client; function s3_upload($file, $name) { $s3 = S3Client::factory( array( 'key' =

问这个问题我觉得有点愚蠢,但是通过当前的PHPSDK上传到S3有什么特别的要求吗?我可以使用相同的凭据通过cli上载,但当我尝试SDK时,它失败了

代码如下:

<?php
require "awssdk_v3/aws-autoloader.php";

use Aws\S3\S3Client;

function s3_upload($file, $name) {
    $s3 = S3Client::factory(
        array(
            'key' => getenv('AWS_ACCESS_KEY_ID'),
            'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
            'version' => "2006-03-01",
            'region' => getenv('AWS_REGION')
        )
    );
    $result = $s3->putObject(
        array(
            'Bucket' => getenv('AWS_BUCKET'),
            'Key' => $name,
            'SourceFile' => $file,
            'ContentType' => mime_content_type($file),
            'ACL' => 'public-read'
        )
    );
    return true;
}
我使用的用户已附加此策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1480066717000",
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Sid": "Stmt1480066765000",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket"
            ]
        }
    ]
}
如前所述,我能够使用该用户凭据从CLI上载文件。该地区是法兰克福,所以我指定了
eu-central-1
,对吗

我遇到的错误如下所示:

Fatal error: Uncaught exception 'Aws\S3\Exception\S3Exception' with message 'Error executing "PutObject" on "https://my-bucket.s3.eu-central-1.amazonaws.com/avatar_2.jpg"; AWS HTTP error: Client error: `PUT https://my-bucket.s3.eu-central-1.amazonaws.com/avatar_2.jpg` resulted in a `403 Forbidden` response

我发现了问题,谢谢。我正在尝试设置ACL
“public-read”
,但没有授予自己
s3:PutObjectAcl
,只是
s3:PutObject
。更改其中一个可以解决问题


无论如何,谢谢你的帮助。

我找到了问题,谢谢。我正在尝试设置ACL
“public-read”
,但没有授予自己
s3:PutObjectAcl
,只是
s3:PutObject
。更改其中一个可以解决问题


无论如何感谢您的帮助。

在IAM策略下,如果您将S3:PutObject设置为操作,请在权限中添加S3:PutObjectAcl。

在IAM策略下,如果您将S3:PutObjectAcl设置为操作,请在权限中添加S3:PutObjectAcl。

我遇到了相同的错误消息,结果证明我的S3存储桶是在错误的区域创建的。

我遇到了相同的错误消息,结果证明我的S3存储桶是在错误的区域创建的。

您确定使用相同的凭据并上载到相同的位置吗?您如何设置密钥环境变量?尝试切换到配置文件而不是环境变量。I
var\u dump
将两个数组都传递到
S3Client::factory
&
$s3->putObject
,它们看起来应该是这样的。我还使用
getCredentials
从客户端提取了凭据,它返回了正确的值。因此这不可能是原因。无论如何谢谢你!是否确实使用相同的凭据并上载到相同的位置?如何设置密钥环境变量?尝试切换到配置文件而不是环境变量。I
var\u dump
将两个数组都传递到
S3Client::factory
&
$s3->putObject
,它们看起来应该是这样的。我还使用
getCredentials
从客户端提取了凭据,它返回了正确的值。因此这不可能是原因。无论如何谢谢你!
Fatal error: Uncaught exception 'Aws\S3\Exception\S3Exception' with message 'Error executing "PutObject" on "https://my-bucket.s3.eu-central-1.amazonaws.com/avatar_2.jpg"; AWS HTTP error: Client error: `PUT https://my-bucket.s3.eu-central-1.amazonaws.com/avatar_2.jpg` resulted in a `403 Forbidden` response