【问题标题】:AWS SDK for PHP: Error retrieving credentials from the instance profile metadata server适用于 PHP 的 AWS 开发工具包:从实例配置文件元数据服务器检索凭证时出错
【发布时间】:2015-02-08 14:54:39
【问题描述】:

我正在尝试通过 web api 将 SNS 消息发送到 android。 从http://aws.amazon.com/developers/getting-started/php/下载并安装SDK

运行 sample.php 时出现以下错误:

Fatal error: Uncaught exception 'Aws\Common\Exception\InstanceProfileCredentialsException' with message 'Error retrieving credentials from the instance profile metadata server. When you are not running inside of Amazon EC2, you must provide your AWS access key ID and secret access key in the "key" and "secret" options when creating a client or provide an instantiated Aws\Common\Credentials\CredentialsInterface object. ([curl] 28: Connection timed out after 5016 milliseconds [url] http://169.254.169.254/latest/meta-data/iam/security-credentials/)' in C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\InstanceMetadata\InstanceMetadataClient.php:85 Stack trace: #0 C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\Credentials\RefreshableInstanceProfileCredentials.php(52): Aws\Common\InstanceMetadata\InstanceMetadataClient->getInstanceProfileCredentials() #1 C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\Credentials\AbstractRefreshableCredentials.php(54): Aws\Common\Credentials\Refreshable in C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\InstanceMetadata\InstanceMetadataClient.php on line 85

关于这个主题的一些指导会对我有很大帮助

【问题讨论】:

  • 这意味着您没有正确配置您的凭据。请参阅 AWS SDK for PHP 用户指南中的 Providing Credentials to the SDK
  • 我已经使用 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 配置了 /.aws/credentials 文件,如此处所述。还是不行
  • @Ravindra 你找到解决方案了吗?我也有同样的问题
  • @JeremyLindblom 我正在为创建这个文件的文档而苦苦挣扎。我正在运行一个 EC2 实例,并通过 Putty 尝试了 sudo nano ~/.aws/credentialssudo mkdir /.aws + cd /.aws + sudo nano credentials - 没有任何东西想要工作,而且网络上的信息很少。有什么想法吗?
  • 凭证文件最适合用于本地开发环境。我会在 EC2 上使用 IAM 角色凭证:docs.aws.amazon.com/aws-sdk-php/guide/latest/…

标签: php amazon-web-services google-cloud-messaging aws-sdk amazon-sns


【解决方案1】:

就我而言,我正在使用

return DynamoDbClient::factory(array(
  'version' => 'latest',
  'region'  => AWS_REGION,
  'key' => AWS_KEY,
  'secret'  => AWS_SECRET
));

以前可以使用 aws/aws-sdk-php 版本 2.8.5 ,但是当 composer 自动安装版本 3.2.0 时,我得到了上面的错误。问题只是我应该改变打电话的方式

return DynamoDbClient::factory(array(
  'version' => 'latest',
  'region'  => AWS_REGION,
  'credentials' => array(
    'key' => AWS_KEY,
    'secret'  => AWS_SECRET,
  )
));

如记录的here。在不更改调用的情况下,apache php 回退到使用 HOME 环境变量查找 ~/.aws/credentials 文件,该变量为空。您可以通过运行php -r 'var_dump(getenv("HOME"));' 来检查它的值。

This 是相关帖子

【讨论】:

  • 这让我很头疼。
  • 哇,他们设法从他们的 SES 指南中删除了这个非常重要的细节......谢谢
  • 啊 - 我明白了。这就是为什么它在我的登录时从 cli 工作,但不是另一个!
【解决方案2】:

就我而言,我必须使用硬编码凭据

$s3Client = new S3Client([
    'region' => REGION,
    'version' => '2006-03-01',
    'credentials' => [
        'key'    => S3_KEY,
        'secret' => S3_SECRETE,
    ],
]);

查看更多详情here:

【讨论】:

    【解决方案3】:

    您必须将带有您的配置的.aws/credentials 文件放在Web 服务的主目录中*通常是/var/www),而不是在登录用户的主目录中。

    您可以通过在服务器上的 php 文件中运行 echo getenv('HOME'); 来找到您的 Web 服务正在使用的主目录。

    【讨论】:

    • echo getenv('HOME'); 使用 Docker php apache 实例向我返回 null :(
    • 确保你不只是符号链接它......在我的情况下需要实际存在。
    【解决方案4】:

    我在尝试使用凭证文件时遇到了同样的错误,github 上的this guy 几乎成功了:

    凭证文件应为 ini 格式,但不具有 .ini 扩展名。它应该有一个用您的密钥和秘密定义的“默认”部分:

    $ less ~/.aws/credentials
    
    [default]
    aws_access_key_id = key
    aws_secret_access_key = secret
    

    如果您指定了其他部分名称而不是默认名称,只需在 S3Client 参数中添加一个 profile 键:

    [example]
    aws_access_key_id = key
    aws_secret_access_key = secret
    
    $s3Client = new \Aws\S3\S3Client([
        'version' => '2006-03-01',
        'region' => $yourPreferredRegion,
        'profile' => 'example',
    ]);
    

    使用凭据文件或环境变量是在您自己的服务器上提供凭据的推荐方式

    @Anti 的回答也帮了我很多忙!

    如果您更喜欢硬编码方式,请按照 @shadi 的回答。

    【讨论】:

      【解决方案5】:

      步骤如下:

      1. 输入cd ~ 这样,您将进入主目录。
      2. mkdir .aws
      3. sudo vi .aws/credentials
      4. 编写以下行并保存文件。

        [default]
        aws_access_key_id = Your AWS Access Key
        
        aws_secret_access_key = Your AWS Secret Access Key
        

      【讨论】:

      • 如果您尝试在命令行脚本中使用 AWS 开发工具包,这非常有用。
      • 保存并退出 vi - 点击 esc 并输入 :wq 然后回车。或者,如果您在打字时犯了错误。要退出而不保存 vi - 点击 esc 并输入 :q!然后回车。
      【解决方案6】:

      假设服务器位于 AWS EC2 上(ECS 和弹性 beantalk 可能相同),处理此问题的“正确”方法是根本不存储凭据。

      相反,这样做:

      1. 创建一个 IAM 角色 (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)
      2. 向角色策略添加相关权限(在这种情况下,发送 SNS 消息)
      3. 将角色分配给 EC2 实例(实例设置 => 附加/替换 IAM 角色)

      这样您就不会在代码中留下任何敏感数据。

      【讨论】:

        【解决方案7】:

        如果是 laravel 和 aws/aws-sdk-php-laravel sdk 则在配置所有步骤并在 .env 文件中定义密钥之后 您必须通过以下命令删除配置缓存并重建它。

        php artisan config:cache;
        composer dump-autoload;
        

        【讨论】:

          【解决方案8】:

          这可能是因为配置文件尚未发布。

          一定要发布配置文件:

          php artisan vendor:publish  --provider="Aws\Laravel\AwsServiceProvider"
          

          要测试这个问题,只需清除配置即可。

          php artisan config:clear
          

          如果它在清除缓存的情况下工作,那么这就是问题所在。

          【讨论】:

            【解决方案9】:

            您可以尝试以下几行:

            $credentials = new Aws\Credentials\Credentials('key' , 'secret-key');

            $s3 = new S3Client(['version' => 'latest','region' => 'ap-south-1','credentials'=>$credentials]);

            【讨论】:

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