无法从 /.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' => '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=>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的主要内容,如果未能解决你的问题,请参考以下文章