在Laravel 5.8中上传到AWS s3存储桶使我“从实例配置文件元数据服务器检索凭证时出错”

时间:2019-05-08 15:58:18

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

我有一个Laravel 5.8应用程序,我试图将上传的文件配置为转到Amazon s3存储桶,但是每次尝试保存带有图像的帖子时,都会收到错误Error retrieving credentials from the instance profile metadata server. (cURL error 28: (see http://curl.haxx.se/libcurl/c/libcurl-errors.html))。互联网上有很多与此相关的帖子,但没有一个能够帮助我解决问题。如果有帮助,我在本地环境中使用Valet。我的依存关系中也安装了"league/flysystem-aws-s3-v3": "^1.0",。使用修补匠时出现相同的错误。谢谢。

filesystems.php

...
's3' => [
    'driver' => 's3',
    'version' => 'latest',
    'credentials' => array(
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
    ),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
],
...

.env

...
    AWS_ACCESS_KEY_ID=ASTRINGOFNUMBERSANDLETTERS
    AWS_SECRET_ACCESS_KEY=anotherstrngofnumbersandletters
    AWS_DEFAULT_REGION=us-west-1
    AWS_BUCKET=bucket-name
...

PostController.php

...
if ($request->has('photo')) {
    // Get image file
    $image = $request->file('photo');
    // Make a image name based on user name and current timestamp
    $name = Str::slug($request->input('user_id')).time();
    // Define folder path
    $folder = '/uploads/posts/' . $user_id . '/';
    // Make a file path where image will be stored [ folder path + file name + file extension]
    $filePath = $folder . $name. '.' . $image->getClientOriginalExtension();
    // Upload image
    $this->uploadOne($image, $folder, 's3', $name);
    // Set user profile image path in database to filePath
    $post->photo = $filePath;
}
...

1 个答案:

答案 0 :(得分:0)

您应该检查它实际使用的哪个版本的AWS PHP SDK,好像它小于我相信的版本3(不确定是哪个版本对其进行了更改,抱歉),然后不需要凭据数组,您只需传递密钥即可并根据区域和存储桶值直接进行秘密操作。

例如这样的

...
's3' => [
    'driver' => 's3',
    'version' => 'latest',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
],
...

您还应该查看将.aws / credentials复制到Web服务器主目录作为测试,以查看www用户在读取文件时遇到问题是否是权限问题。不过,将其作为永久解决方案不是一个好主意,您最好使用参数存储来存储值并以这种方式访问​​它们。您需要更新角色的权限以允许对此进行访问,但这是配置事物的一种更为安全的方法。