PHP SDK无法在附加了IAM角色的EC2实例上获取AWS凭据

时间:2017-08-23 11:54:27

标签: php amazon-web-services amazon-ec2

简单的问题。但无法让它发挥作用。

我为EC2创建了一个IAM角色,可以完全访问CloudWatch。 我发布了一个附加了此IAM角色的新EC2实例。 我在这个EC2实例上编写了一个简单的PHP应用程序,它试图将指标发布到CloudWatch。

我在nginx日志中收到此错误:

2017/08/23 11:44:06 [error] 32142#32142: *5 FastCGI sent in stderr:
"PHP message: PHP Fatal error:
Uncaught Aws\Exception\CredentialsException:
Cannot read credentials from /var/www/.aws/credentials
in /var/www/app/vendor/aws/aws-sdk-php/src/Credentials/CredentialProvider.php:394

从同一个EC2实例中,命令:

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-attached-to-ec2-instance>

在响应中使用Access Key和Secret返回200 OK。

这是我尝试编写CloudWatch指标的PHP代码:

<?php

require 'vendor/autoload.php';
use Aws\CloudWatch\CloudWatchClient;
use Aws\Exception\AwsException;

$count = $_GET["count"];
publishMetric($count);

function publishMetric($count) {
    $client = new CloudWatchClient([
            'profile' => 'default',
            'region' => 'us-east-1',
            'version' => '2010-08-01'
    ]);
    try {
            $result = $client->putMetricData(array(
                'Namespace' => 'com.mynamespace',
                'MetricData' => array(
                        array(
                            'MetricName' => 'Count',
                            //Timestamp : mixed type: string (date format)|int (unix timestamp)|\DateTime
                            'Timestamp' => time(),
                            'Value' => $count,
                            'Unit' => 'Number'
                    )
                )
            ));
            var_dump($result);

            echo 'Done publishing metrics';
    } catch (AwsException $e) {
            // output error message if fails
            error_log($e->getMessage());

            echo 'Failure to publish metrics';
    }

}


?>

知道这个设置中缺少什么吗?

2 个答案:

答案 0 :(得分:0)

访问其他AWS服务时对EC2实例的身份验证可以通过多种方式完成:

  1. 为EC2实例分配角色。当你必须给某些“EC2实例”一个权限时使用。
  2. 不要分配角色;但是使用具有所有必需权限的access-key。在您授予“用户”权限时使用
  3. 这两者都是独立的认证机制。如果您已为您的服务器分配了角色;您不必在应用程序(CredentialProvider.php)中编写任何代码进行身份验证。

    您当前的代码也可以通过创建文件/var/www/.aws/credentials来实现,如下所示:

    accessKey=AKIAIB6FA52IMGLREIIB
    secretKey=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
    

答案 1 :(得分:0)

我知道这已经很晚了。我遇到了同样的问题,并通过在初始化客户端时删除profile => default行来解决它。如果您不提供凭据和配置文件,SDK将尝试从元数据服务器检索实例配置文件信用。