在EC2实例上使用PHP将文件上传到s3会丢失凭据错误,但在本地工作

时间:2015-10-30 17:06:10

标签: php laravel amazon-s3 amazon-ec2

我已经测试了我的功能,将图像上传到我的机器上的s3,但是当我在ec2上进行制作时,由于一个奇怪的原因,它不起作用。

这是错误:

CredentialsException in InstanceProfileProvider.php line 79:Error retrieving credentials from the instance profile metadata server. (Client error: 404)

这是代码:

$destinationPath = 'images/institutions/logos';
    $extension = $data['int_logo']->getClientOriginalExtension();
    $keyname = $destinationPath.'/'.$username.'.'.$extension;
    $bucket = "*****";
    $filepath = $data['int_logo'];

    $s3 = new S3Client([
        'region'  => 'us-west-2',
        'version' => '2006-03-01',
        'scheme' => 'http'
    ]);

    $result = $s3->putObject(array(
        'Bucket'       => $bucket,
        'Key'          => $keyname,
        'SourceFile'   => $filepath,
        'ACL'          => 'public-read'
    ));

    return $result['ObjectURL'];
}

这是我的s3政策:

{
"Version": "2012-10-17",
"Id": "*******",
"Statement": [
    {
        "Sid": "******",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:GetObject",
            "s3:PutObjectAcl",
            "s3:PutObject"
        ],
        "Resource": "arn:aws:s3:::****/*"
    }
]}

我不知道为什么它会丢失凭据,我没有使用任何身份验证,每个人都可以在这个存储桶上放置一个文件。它在我的机器上100%工作。

2 个答案:

答案 0 :(得分:1)

建立匿名连接的解决方案:

变化:

    $s3 = new S3Client([
        'region'  => 'us-west-2',
        'version' => '2006-03-01',
        'scheme' => 'http',
    ]);

要:

    $s3 = new S3Client([
        'region'  => 'us-west-2',
        'version' => '2006-03-01',
        'scheme' => 'http',
        'credentials' => false
    ]);

我仍然不知道为什么我的本地计算机可以建立连接,但ec2服务器无法在没有此行的情况下执行此操作。

答案 1 :(得分:0)

我过去遇到过同样的问题。我最终必须输入以下代码,这对我有用:

$s3->path_style = true;