无法从 /.aws/credentials 读取凭证 - PHP 脚本调用 AWS-SDK

Posted

技术标签:

【中文标题】无法从 /.aws/credentials 读取凭证 - PHP 脚本调用 AWS-SDK【英文标题】:Cannot read credentials from /.aws/credentials - PHP script call 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'),

我到底做错了什么?

【问题讨论】:

【参考方案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
));

【讨论】:

这里要提一提的是,硬编码方式从参数数组中删除 profile=&gt;default 对我的情况有效,如此处所述:***.com/a/47949875/5416602【参考方案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 记录?

以上是关于无法从 /.aws/credentials 读取凭证 - PHP 脚本调用 AWS-SDK的主要内容,如果未能解决你的问题,请参考以下文章

无法将我的凭据传递给AWS PHP SDK

redshift 不适用于本地 aws 配置文件凭据吗?

JAVA -AWS ACCESS S3 存储桶从 JAVA 应用程序在 EASTIC BEANTALK 上

如何通过 Python 访问 AWS 服务?

提供商链未获取 AWS 凭证文件

使用 Spring Cloud AWS 自动配置担任角色