适用于PHP的AWS开发工具包:错误从实例configuration文件元数据服务器检索凭据

我正在尝试通过web api将SNS messeges发送给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 

有关这个主题的一点指导将会帮助我很多

就我而言,我正在使用

 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, ) )); 

如此处所述 。 在不改变调用的情况下, apache php正在使用HOME环境variables(它是空的)回退到寻找~/.aws/credentials文件。 你可以运行php -r 'var_dump(getenv("HOME"));'

这是一个相关的post

您必须将.aws/credentials文件与您的configuration放在Web服务的主目录(通常为/var/www ),而不是在login用户的主目录中。

您可以通过运行echo getenv('HOME');来查找您的Web服务正在使用的主目录echo getenv('HOME'); 在您的服务器上的PHP文件。

这里是步骤:

  1. 键入cd ~这样你将进入主目录。
  2. mkdir .aws
  3. sudo vi .aws/credentials
  4. 写下面的行并保存文件。

     [default] aws_access_key_id = Your AWS Access Key aws_secret_access_key = Your AWS Secret Access Key 

我试图使用一个凭证文件,并得到了同样的错误, 这个家伙在github上几乎钉了它:

凭证文件应采用ini格式,但不包含.ini扩展名。 它应该有一个用你的密钥和秘密定义的“默认”部分:

 $ less ~/.aws/credentials [default] aws_access_key_id = key aws_secret_access_key = secret 

如果您指定了其他部分名称而不是默认值,只需将profile键添加到S3Client参数:

 [example] aws_access_key_id = key aws_secret_access_key = secret $s3Client = new \Aws\S3\S3Client([ 'version' => '2006-03-01', 'region' => $yourPreferredRegion, 'profile' => 'example', ]); 

使用凭证文件或环境variables是在您自己的服务器上提供凭据的推荐方式

而@Anti的回答也帮助了我很多!

如果你喜欢硬编码的方式,只需按照@沙迪的答案。