无法实例化\ Aws \ Ec2 \ Ec2Client

时间:2014-12-30 12:46:01

标签: php aws-sdk

尝试实例化ec2client w.r.t

$ec2Client = \Aws\Ec2\Ec2Client::factory(array(
    'profile' => 'default',
    'region'  => 'us-west-2',
    'version' => '2014-10-01'
));

但失败并出现错误

Uncaught exception 'Aws\Common\Exception\CredentialsException' with message 'Could not load credentials.'

我有:

cat ~/.aws/credentials 

[default]
aws_access_key_id = xxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxx

我通过作曲家"aws/aws-sdk-php": "3.*@dev"使用aws-sdk。

编辑1):我在我的本地开发机器上尝试这个。

编辑2): 我试过这个:

 use Aws\Common\Credentials\InstanceProfileProvider;
    $profile= new InstanceProfileProvider(['profile'=>'default']);
    $ec2Client = \Aws\Ec2\Ec2Client::factory(array(
        'region'  => 'us-west-2',
        'version' =>'2014-10-01',
        'credentials' => $profile
    ));

这给了我不同的错误:

'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 error 28: Connection timed out after 1000 milliseconds)' in .. /InstanceProfileProvider.php:9 ..

这让我觉得凭证配置文件仅在应用程序从AWS云实例中运行时才会出现!这使得配置文件的概念无用(哪些用于开发环境)

编辑3)

调试完成后,似乎带有凭据配置文件的sdk已按预期损坏。 credential profilesenvironment variable都取决于环境变量。如果禁用环境变量,则两者都将失败。

可能的解决方法:

a)Enable environment variables

b)设置HOME evn变量

putenv('HOME=/Users/yourname');
$ec2Client = \Aws\Ec2\Ec2Client::factory(array(
'region'  => 'us-west-2',
'version' => '2014-10-01'
));

Profile init()函数有filename选项但没有明显的方法来传递除HOME env变量

之外的凭证配置文件路径
Aws\Common\Credentails\Profiler->init()
public static function ini($profile = null, $filename = null){
...
}

如果您无法阅读/Users/yourname/.aws/credentials文件,则必须稍微调整一下

chmod 644 /Users/yourname/.aws/credentials

2 个答案:

答案 0 :(得分:2)

您应该将.aws/credentials文件放在网络服务的根目录中,而不是放在ssh用户的根目录中

答案 1 :(得分:1)

您必须将带有配置的.aws / credentials文件放在Web服务的主目录中。

将此放入您网站的某个PHP文件

echo getenv('HOME');

然后在该目录中:

mkdir .aws
touch credentials
nano credentials

你必须粘贴内容(不需要键中的引号):

[default]
aws_access_key_id     = xxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxx

那应该这样做!

编辑: 正如sakhunzai在评论中所说(谢谢!),echo getenv(' HOME')有时会返回null,如果发生这种情况,他会提供这个解决方案:"但是从命令行php -i | grep HOME给了我正确的用户主目录"

所以请记住这一点。