【问题标题】:Cannot read credentials from /.aws/credentials - PHP script call AWS-SDK无法从 /.aws/credentials 读取凭证 - PHP 脚本调用 AWS-SDK
【发布时间】:2018-09-23 04:31:13
【问题描述】:

我查看了这里的每个答案,似乎我的问题有点不同,或者没有合适的解决方案。我在我的 PHP 文件中执行以下操作:

use Aws\Route53\Route53Client;

$client = Route53Client::factory(array(
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2013-04-01'
));

收到此错误:

Fatal error: Uncaught Aws\Exception\CredentialsException: Cannot read credentials from /.aws/credentials

似乎简单的解决方法是确保 HOME 目录是正确的。确实已经是了。文件是可读的,我的 ec2-user 已经是所有者。密钥和秘密已安装在“凭据”文件中。配置文件名称已设置为“默认”。尝试将 /.aws 复制到其他目录,例如 root、/home 等,并更改了权限、chmod 等。还是什么都没有。

然后我尝试对凭据进行硬编码(我知道——不推荐)只是为了给它一点刺激,它完全忽略了我这样做:

$client = Route53Client::factory(array(
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2013-04-01',
    'credentials' => [
            'key' => $key,
            'secret' => $secret,
    ]
));

作为最后的手段,我什至尝试包含 CredentialProvider 类,并将其传递到我的数组中——仍然没有:

'credentials' => CredentialProvider::ini('default', '/home/ec2-user/.aws/credentials'),

我到底做错了什么?

【问题讨论】:

    标签: php amazon-web-services aws-sdk amazon-route53


    【解决方案1】:

    我从 PHP 8.0 升级到 PHP 8.1,PHP 突然抱怨找不到凭证文件。 xdebug 错误跟踪向我显示了预期的位置,该位置比我的公共 html 目录低一级。我不知道它为什么会改变,但我只是在那个目录中运行了这个命令:

    ln -s /.aws/ .aws

    我创建的符号链接可以很好地提供凭据。我已经恢复正常运行了。

    【讨论】:

      【解决方案2】:

      我认为 AWS 手册有点混乱。 我在文件系统根 (/) 而非 /root/home 目录中创建了 .aws 目录,并且一切正常。

      /.aws/credentials

      【讨论】:

        【解决方案3】:

        面对这个问题,这是我的确切方法:

        PHP 版本:7.2.24 AWS PHP SDK 版本:3.180.4

        首先将您现有的 aws 文件夹复制到您的根主目录

        sudo cp -r ~/.aws /
        

        那么你的代码应该是这样的:

        $client = Route53Client::factory(array(
            'profile' => 'default',
            'region' => 'us-east-1',
            'version' => '2013-04-01'
        ));
        

        在我的例子中,有趣的是,PHP SDK 在根文件夹而不是当前用户的主目录中查找凭据文件。这是我的方法奏效的最可行的原因。

        但是,您想为本地配置找到一个更通用的位置并使用以下方法来加载它。

        $path = '/my/config/folder/.aws/credentials';
        $provider = CredentialProvider::ini('default', $path); 
        $provider = CredentialProvider::memoize($provider);
        
        $client = Route53Client::factory(array(
            'region' => 'us-east-1',
            'version' => '2013-04-01',
            'credentials' => $provider
        ));
        

        希望这能为 AWS PHP 社区带来更多光明。正确配置此配置以构建安全的 PHP 应用程序非常重要

        【讨论】:

        • 您的最后一个示例有助于对文件方法进行防弹。内置的家庭检测似乎命中或错过。这很摇滚。
        【解决方案4】:
        • 使用“ls -l”检查 .aws/* 文件的权限
        • 将权限更改为大读取或授予所有权限“sudo chmod 777 .aws/*”
        • 重新运行代码

        【讨论】:

        • 将文件夹权限设置为 777,尤其是在您的 html 文件夹中,并不安全。
        【解决方案5】:

        在 AWS Centos 7 上运行,我尝试了一切(chmod/chown /root /home/user、env、bashrc 等)以使 /.aws/credentials 在 apache /var/www 目录之外工作。 SDK 报告它无法读取凭证文件。

        我查看了 PHP 以查看是否可以设置/覆盖 HOME 变量,但它仍然没有读取凭据文件,直到我将 .aws 文件夹放在“/var/www”文件夹中并将 HOME 变量设置在我的php 文件如下:

         <%php
         putenv('HOME=/var/www');
        
         //ZIP File SDK Install requires aws-autoloader
         require 'aws-autoloader.php'; //Your php code below
        

        【讨论】:

          【解决方案6】:

          只要删除'profile' =&gt; 'default',你就可以正常工作了

          $client = Route53Client::factory(array(
            'region' => 'us-east-1',
            'version' => 'latest',
            'credentials' => [
                  'key' => $key,
                  'secret' => $secret,
            ]
          ));
          

          【讨论】:

          • 你太棒了!
          • 这对我也适用 Ubuntu 16.0 , PHP 版本 7.3 。谢谢
          • 太棒了,非常感谢您的回答。这将需要很长时间才能弄清楚
          • 不错。在 mac 上为我工作
          • 在 Laravel Vapor 上遇到过这个问题;这个解决方案为我解决了这个问题。
          【解决方案7】:

          这就是我最终为这个问题所做的,尽管 EJ 上面的答案实际上是正确的答案。希望这可以帮助某人读取他们的凭据文件:

          use Aws\Credentials\CredentialProvider;
          use Aws\Route53\Route53Client;
          
          $profile = 'default';
          $path = '/var/www/html/.aws/credentials';
          $provider = CredentialProvider::ini($profile, $path); 
          $provider = CredentialProvider::memoize($provider);
          
          $client = Route53Client::factory(array(
              'region' => 'us-east-1',
              'version' => '2013-04-01',
              'credentials' => $provider
          ));
          

          【讨论】:

          【解决方案8】:

          不确定你做错了什么,但我建议完全绕过问题并将 EC2 实例角色分配给有问题的虚拟机,然后你就不必担心了;这是一个更好/更安全的解决方案。

          https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html

          【讨论】:

          • 感谢 E.J.我尝试上述方法的原因是能够以编程方式更新 Route53 中的 DNS 配置。似乎docs.aws.amazon.com/aws-sdk-php/v2/guide/service-route53.html 处的说明描述了通过包含 SDK 类来执行此操作,我假设这将默认检查凭据文件,对吧?文档中是否还有其他方法描述了使用您提出的解决方案修改 DNS 记录?
          猜你喜欢
          • 2019-02-23
          • 2017-02-10
          • 2020-12-29
          • 1970-01-01
          • 2023-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-08
          相关资源
          最近更新 更多