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

Jus*_*n H 16 php amazon-web-services amazon-route53 aws-sdk

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

use Aws\Route53\Route53Client;

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

得到此错误:

Fatal error: Uncaught Aws\Exception\CredentialsException: Cannot read credentials from /.aws/credentials
Run Code Online (Sandbox Code Playgroud)

似乎简单的修复将确保HOME目录是正确的.确实已经是.文件是可读的,我的ec2用户已经是所有者.密钥和密钥已安装在"凭据"文件中.配置文件名称已设置为"默认".试图将/.aws复制到其他目录,如root,/ home等,并更改权限,chmod,以上所有.依然没有.

然后我试着硬编码凭证(我知道 - 不推荐)只是为了给它一点点,它完全忽略了我这样做:

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

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

'credentials' => CredentialProvider::ini('default', '/home/ec2-user/.aws/credentials'),
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

far*_*ruk 52

只需删除'profile' => 'default',你应该工作正常

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

  • 你太棒了! (3认同)

Jus*_*n H 5

尽管 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
));
Run Code Online (Sandbox Code Playgroud)

  • 这里要提一件事,对于从参数数组中删除 `profile=>default` 的硬编码方式适用于我的案例,如下所述:/sf/answers/3356491281/ (2认同)

小智 5

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

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

 <%php
 putenv('HOME=/var/www');

 //ZIP File SDK Install requires aws-autoloader
 require 'aws-autoloader.php'; //Your php code below
Run Code Online (Sandbox Code Playgroud)


lar*_*ech 5

面对这个问题,我的具体做法是:

PHP 版本:7.2.24 AWS PHP 开发工具包版本:3.180.4

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

sudo cp -r ~/.aws /
Run Code Online (Sandbox Code Playgroud)

那么你的代码应该如下所示:

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

就我而言,有趣的是,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
));
Run Code Online (Sandbox Code Playgroud)

希望这能让更多人了解 AWS PHP 社区。正确配置此配置对于构建安全的 PHP 应用程序非常重要


E.J*_*nan 1

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

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