我正在尝试通过web api将SNS信息发送到android。 从http://aws.amazon.com/developers/getting-started/php/
下载并安装了SDK运行sample.php时出现以下错误:
Fatal error: Uncaught exception 'Aws\Common\Exception\InstanceProfileCredentialsException' with message '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] 28: Connection timed out after 5016 milliseconds [url] http://169.254.169.254/latest/meta-data/iam/security-credentials/)' in C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\InstanceMetadata\InstanceMetadataClient.php:85 Stack trace: #0 C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\Credentials\RefreshableInstanceProfileCredentials.php(52): Aws\Common\InstanceMetadata\InstanceMetadataClient->getInstanceProfileCredentials() #1 C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\Credentials\AbstractRefreshableCredentials.php(54): Aws\Common\Credentials\Refreshable in C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\InstanceMetadata\InstanceMetadataClient.php on line 85
关于这个主题的一点指导对我有很大帮助
答案 0 :(得分:143)
就我而言,我正在使用
return DynamoDbClient::factory(array(
'version' => 'latest',
'region' => AWS_REGION,
'key' => AWS_KEY,
'secret' => AWS_SECRET
));
以前与aws/aws-sdk-php
版本2.8.5相同,但是当作曲家自动安装版本3.2.0时,我得到了上面的错误。问题很简单,我应该改变调用
return DynamoDbClient::factory(array(
'version' => 'latest',
'region' => AWS_REGION,
'credentials' => array(
'key' => AWS_KEY,
'secret' => AWS_SECRET,
)
));
记录在案here。在不改变调用的情况下, apache php回退到使用HOME环境变量寻找~/.aws/credentials
文件,该变量为空。您可以通过运行php -r 'var_dump(getenv("HOME"));'
来检查其值。
This是一个相关的帖子
答案 1 :(得分:9)
在我的情况下,我必须使用硬编码凭据
$s3Client = new S3Client([
'region' => REGION,
'version' => '2006-03-01',
'credentials' => [
'key' => S3_KEY,
'secret' => S3_SECRETE,
],
]);
查看更多详情here:
答案 2 :(得分:8)
您必须将.aws/credentials
文件与您的配置放在Web服务的主目录中*通常/var/www
),而不是在登录用户的主目录中。
您可以通过在服务器上的php文件中运行echo getenv('HOME');
来找到您的Web服务正在使用的主目录。
答案 3 :(得分:4)
以下是步骤:
cd ~
通过这个你将进入主目录。mkdir .aws
sudo vi .aws/credentials
写下以下行并保存文件。
[default]
aws_access_key_id = Your AWS Access Key
aws_secret_access_key = Your AWS Secret Access Key
答案 4 :(得分:3)
我试图使用凭证文件并得到相同的错误,github上的this guy几乎把它钉了出来:
凭证文件应采用ini格式,但不能使用.ini扩展名。它应该有一个用你的密钥和秘密定义的'默认'部分:
$ less ~/.aws/credentials
[default]
aws_access_key_id = key
aws_secret_access_key = secret
如果您指定了其他部分名称而不是默认名称,只需在S3Client参数中添加profile
键:
[example]
aws_access_key_id = key
aws_secret_access_key = secret
$s3Client = new \Aws\S3\S3Client([
'version' => '2006-03-01',
'region' => $yourPreferredRegion,
'profile' => 'example',
]);
使用凭证文件或环境变量是在您自己的服务器上提供凭据的推荐方法
@Anti的答案也帮了我很多!
如果您更喜欢硬编码方式,请关注@shadi的回答。
答案 5 :(得分:2)
假设服务器位于AWS EC2上(对于ECS和Elastic beantalk可能是相同的),处理此问题的“正确”方法是根本不存储凭证。
相反,请执行以下操作:
这样,您就不会在代码中保留任何敏感数据。
答案 6 :(得分:0)
如果是laravel和aws / aws-sdk-php-laravel sdk,则在配置所有步骤并在.env文件中定义密钥后 您必须删除配置缓存并通过以下命令对其进行重建。
php artisan config:cache;
composer dump-autoload;
答案 7 :(得分:0)
这可能是因为尚未发布配置文件。
请确保发布配置文件:
php artisan vendor:publish --provider="Aws\Laravel\AwsServiceProvider"
要测试这是问题所在,只需清除配置即可。
php artisan config:clear
如果在清除缓存的情况下可以正常工作,则将成为问题。
答案 8 :(得分:-1)
您可以尝试以下行:
$credentials = new Aws\Credentials\Credentials('key' , 'secret-key');
$s3 = new S3Client(['version' => 'latest','region' => 'ap-south-1','credentials'=>$credentials]);