【问题标题】:Error retrieving credentials from the instance profile metadata server. Laravel S3从实例配置文件元数据服务器检索凭据时出错。 Laravel S3
【发布时间】:2017-11-25 23:06:06
【问题描述】:

问题

相同的代码,在几乎相同的服务器上,在本地和生产中都失败了,但是在我们的登台服务器上工作。当我们尝试与存储桶中的项目交互时,我们会得到一个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))

服务器设置

分期

  • AWS 上的 Ubuntu 16.04.2 LTS
  • PHP 7.1.3-3
  • NPM 3.10.10
  • 节点 v6.10.1

生产

  • AWS EC2 上的 Ubuntu 16.04.1 LTS
  • PHP 7.1.6-1
  • npm 3.10.10
  • 节点 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;
}

【问题讨论】:

标签: php laravel amazon-s3


【解决方案1】:

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

php artisan config:clear

如果最初的环境数据不正确或丢失,不确定缓存何时自行更新,但配置缓存似乎相当持久,这应该可以解决您的问题。

【讨论】:

  • 运行 config:clear 命令后,我可以通过 tinker 与 AWS 进行交互,但在我重新启动服务器之前,我的命令仍然失败并出现此错误
  • 经过大量搜索,这就是我所需要的。我确信我的 AWS 凭证在我的 .env 中是正确的,但我需要运行您在上面发布的命令。谢谢!
【解决方案2】:

我在 .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】:

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

编辑 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 文件中调用。

稍作调整后一切正常。

【讨论】:

    【解决方案4】:

    如果您传递了错误的 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 中的键匹配

    很确定他们在最近几次更新中更改了名称。

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2016-02-01
      • 2019-05-25
      • 2015-02-08
      相关资源
      最近更新 更多