72

我正在尝试通过 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

关于这个主题的一点指导会对我有很大帮助

4

9 回答 9

165

就我而言,我正在使用

return DynamoDbClient::factory(array(
  'version' => 'latest',
  'region'  => AWS_REGION,
  'key' => AWS_KEY,
  'secret'  => AWS_SECRET
));

以前aws/aws-sdk-php版本 2.8.5 没问题,但是当 composer 自动安装版本 3.2.0 时,我得到了上面的错误。问题很简单,我应该改变打电话的方式

return DynamoDbClient::factory(array(
  'version' => 'latest',
  'region'  => AWS_REGION,
  'credentials' => array(
    'key' => AWS_KEY,
    'secret'  => AWS_SECRET,
  )
));

如此处所述。在不更改调用的情况下,apache php 回退到~/.aws/credentials使用 HOME 环境变量查找文件,该变量为空。您可以通过运行来检查它的值php -r 'var_dump(getenv("HOME"));'

是一个相关的帖子

于 2015-07-23T08:50:30.077 回答
24

就我而言,我不得不使用硬编码的凭据

$s3Client = new S3Client([
    'region' => REGION,
    'version' => '2006-03-01',
    'credentials' => [
        'key'    => S3_KEY,
        'secret' => S3_SECRETE,
    ],
]);

在此处查看更多详细信息:

于 2018-02-15T06:39:11.280 回答
12

您必须将.aws/credentials带有配置的文件放在 Web 服务的主目录中 *通常/var/www)而不是登录用户的主目录。

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

于 2015-03-05T14:29:19.293 回答
9

我试图使用凭证文件并得到了同样的错误, 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',
]);

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

@Anti 的回答也对我帮助很大!

如果您更喜欢硬编码方式,请按照@shadi 的回答。

于 2017-02-08T20:50:56.927 回答
4

以下是步骤:

  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
    
于 2017-04-06T09:18:03.727 回答
3

假设服务器位于 AWS EC2 上(ECS 和弹性 beantalk 可能相同),处理此问题的“正确”方法根本不存储凭证。

相反,这样做:

  1. 创建一个 IAM 角色 ( https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html )
  2. 为角色策略添加相关权限(在这种情况下,发送 SNS 消息)
  3. 将角色分配给 EC2 实例(实例设置 => 附加/替换 IAM 角色)

这样您就不会在代码中留下任何敏感数据。

于 2020-06-25T00:21:31.213 回答
2

如果它是 laravel 和 aws/aws-sdk-php-laravel sdk,那么在配置所有步骤并在 .env 文件中定义键之后,您必须删除配置缓存并通过以下命令重建它。

php artisan config:cache;
composer dump-autoload;
于 2019-02-13T08:20:10.203 回答
2

这可能是因为配置文件尚未发布。

请务必发布配置文件:

php artisan vendor:publish  --provider="Aws\Laravel\AwsServiceProvider"

要测试这是问题所在,只需清除配置。

php artisan config:clear

如果它在清除缓存的情况下工作,那么这将是问题所在。

于 2019-07-21T15:24:57.883 回答
-1

您可以尝试以下几行:

$credentials = new Aws\Credentials\Credentials('key' , 'secret-key');

$s3 = new S3Client(['version' => 'latest','region' => 'ap-south-1','credentials'=>$credentials]);

于 2019-01-25T12:21:47.973 回答