从实例配置文件元数据服务器检索凭据时出错。 Laravel S3

时间:2017-06-22 15:11:41

标签: php laravel amazon-s3

问题

在几乎相同的服务器上,相同的代码在本地和生产中失败,但在我们的登台服务器上运行。当我们尝试与存储桶中的项目进行交互时,我们会得到Error retrieving credentials...。 - Envoyer部署服务器,登台和生产服务器,并由Forge配置到AWS EC2实例。 - 两个实例都使用相同的存储桶策略命中同一个存储桶。 - .env设置对所有人都相同,减去服务器名称和调试

生产错误:

Aws\Exception\CredentialsException
Error retrieving credentials from the instance profile metadata server. (cURL error 28: Connection timed out after 1003 milliseconds (see http://curl.haxx.se/libcurl/c/libcurl-errors.html))

服务器设置

分段

  • Ubuntu 16.04.2 LTS on AWS
  • PHP 7.1.3-3
  • NPM 3.10.10
  • Node v6.10.1

生产

  • AWS EC2上的Ubuntu 16.04.1 LTS
  • PHP 7.1.6-1
  • npm 3.10.10
  • Node v6.10.1

Composer.json包

"laravel/framework": "5.4.*",       // 5.4.25
"aws/aws-sdk-php-laravel": "~3.0",  // 3.1.0
"guzzlehttp/guzzle": "~6.0",        // 6.2.3

代码示例

function getPhoto($personID)
{
   $contents   = '';
   $id         = $personID;
   $cloudFront = env('AWS_CLOUDFRONT_PHOTO'); // d212rosgvhtylp.cloudfront.net
   $fileKey    = filePath($id) . '_t.jpg'; // 9ae299a1990e79d62f07c28bb60ecf6f_t.jpg
   $fileURL    = $cloudFront . '/' . filePath($id) . '_t.jpg'; // d212rosgvhtylp.cloudfront.net/9ae299a1990e79d62f07c28bb60ecf6f_t.jpg
   // check if in remote storage then get contents
   $contents = Storage::disk('s3photo')->get($fileKey); /* ****** FAILS HERE ****** */
   // stream bioPhoto
   header('Content-Type: image/jpeg');
  echo $contents;
}

4 个答案:

答案 0 :(得分:1)

确保.env文件包含AWS客户端的正确值后,请运行以下命令:

php artisan config:clear

这应该清除你的问题,如果它是由最初的env数据不正确或丢失引起的,不确定缓存是否自己更新但配置缓存似乎非常持久。

答案 1 :(得分:1)

我最近遇到了这个问题。就我而言,它在本地工作,而不是在 EC2 实例上。我不太了解。最后我意识到我在默认文件夹〜/ .aws / credentials中本地设置了 IAM ,所以在本地一切都很好。所以我在laravel源代码中戳了一下,我注意到laravel将在文件 services.php config文件夹中接受连接配置。

编辑config / services.php并输入AWS IAM密钥。     

'mailgun' => [
    'domain' => env('MAILGUN_DOMAIN'),
    'secret' => env('MAILGUN_SECRET'),
],

'ses' => [
    'key' => env('AWS_KEY'),
    'secret' => env('AWS_SECRET'),
    'region' => env('AWS_REGION'),
],

'sparkpost' => [
    'secret' => env('SPARKPOST_SECRET'),
],

'stripe' => [
    'model' => App\User::class,
    'key' => env('STRIPE_KEY'),
    'secret' => env('STRIPE_SECRET'),
],

所以我看到我的.env文件没有 AWS IAM 登录密钥,这些密钥是在config /services.php文件中调用的。

经过一次小小的调整后,一切都很顺利。

答案 2 :(得分:1)

我在.env文件中两次 中输入了AWS_ACCESS_KEY_ID之后,遇到了这个问题。

.env:

AWS_ACCESS_KEY_ID=MYREALID
AWS_SECRET_ACCESS_KEY=myrealkey

...
...a lot of variables..
...

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=

AWS SDK会尝试在其他地方搜索这些凭据,因为这会发生错误。

答案 3 :(得分:0)

如果您传递错误的ENV变量,请检查您的config/filesystems.php

,则可能会出现此问题。
'key'    => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url'    => env('AWS_URL'),    

请参阅:https://github.com/laravel/laravel/blob/master/config/filesystems.php#L60

并确保.env中的键匹配

可以肯定,他们在最近的几次更新中都更改了名称。