AWS PHP SDK凭据错误S.

时间:2015-06-03 17:38:04

标签: php apache laravel amazon-web-services aws-php-sdk

尝试创建SNSClient对象时出现以下错误。

InstanceProfileCredentialsException in InstanceMetadataClient.php line 85: 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. (Client error response
[status code] 404
[reason phrase] Not Found
[url] http://169.254.169.254/latest/meta-data/iam/security-credentials/)

当我在laravel设置的config文件夹中有aws.php时,我不明白为什么会出现此错误。这里存储了访问密钥和密钥。

我不是很喜欢这个,因为这会导致我的凭据存储在其他人可以进入SFTP的文件夹设置中。

我还有我的服务器根文件夹中的aws凭据和配置文件,路径如下:~/.aws/但由于某种原因,应用程序不满意。

这是我的代码:

public function about(){

    // Instantiate a client with the credentials from the project1 profile
    $snsClient = SnsClient::factory(array(
            'profile' => 'default',
            'region'  => 'us-west-2',
        ));

    // Get the application's endpoints

    $iOS_AppArn = "arn:aws:sns:us-west-2:235418406768:app/APNS_SANDBOX/ClashTarget";

    $iOS_model = $snsClient->listEndpointsByPlatformApplication(array('PlatformApplicationArn' => $iOS_AppArn));
}

请注意,我使用的是default配置文件,该配置文件应该从存储配置和凭据文件的根aws目录中获取凭据。

目前,作为临时解决方案,我这样做了:http://blog.ianholden.com/aws-s3-with-php-on-apache/这使得一切正常,但我不满意我的凭证密钥存在于应用程序代码中。感觉不对。

有人可以指导我解决此错误吗?

更新1:评论:〜/ .aws / 的配置内容是什么 这是~/.aws/文件夹

中配置文件的内容
[default]
output = json
region = us-west-2

3 个答案:

答案 0 :(得分:4)

您的~/.aws/credentials文件应如下所示:

[default]
aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID
aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY

[project1]
aws_access_key_id = ANOTHER_AWS_ACCESS_KEY_ID
aws_secret_access_key = ANOTHER_AWS_SECRET_ACCESS_KEY

库使用以下函数来确定查找.aws/credentials文件的目录:

private static function getHomeDir()
{
    // On Linux/Unix-like systems, use the HOME environment variable
    if ($homeDir = getenv('HOME')) {
        return $homeDir;
    }
    // Get the HOMEDRIVE and HOMEPATH values for Windows hosts
    $homeDrive = getenv('HOMEDRIVE');
    $homePath = getenv('HOMEPATH');
    return ($homeDrive && $homePath) ? $homeDrive . $homePath : null;
}

如您所见,如果未设置HOMEHOMEDRIVEHOMEPATH环境变量,则库将无法找到您的凭据文件。

除了能够找到文件外,它还需要PHP和INI格式(如上所述)可读。

修改

从评论中,听起来似乎没有设置HOME环境变量。因此,库无法找到您的凭证文件。从这里可以找到一些选择。

选项1:

修复服务器,以便正确设置HOME环境变量。您需要对最佳方法进行一些研究,因为解决方案可能高度依赖于服务器/ apache / php配置......

选项2:

由于您使用的是Laravel 5,因此您可以将凭据添加到.env文件中,然后在代码中访问它们。因此,例如,将以下两行添加到.env文件的末尾:

AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY

现在,在您的代码中,您可以执行以下操作:

public function about() {
    // add "use Aws\Credentials\Credentials;" at the top of your file

    // the env() method reads the values from the .env file. ideally you should never
    // use the env() method outside of a config file, though, so I'd suggest adding
    // a new config file that uses the env statements and using the config here.
    $credentials = new Credentials(env('AWS_ACCESS_KEY_ID'), env('AWS_SECRET_ACCESS_KEY'));

    // if using the 'credentials' key, do not use the 'profile' key
    $snsClient = SnsClient::factory(array(
        'region'  => 'us-west-2',
        'credentials' => $credentials
    ));
}

选项3:

自己调用CredentialProvider::ini()方法,并将配置文件和完整路径传递给您的ini文件。这将绕过库试图确定主目录的需要。

public function about() {
    // add "use Aws\Credentials\CredentialProvider;" at the top of your file

    // the first parameter is the profile, the second parameter is the full path to
    // your credentials file. You may want to add this to your .env file, and
    // access using env()/config() instead of hardcoding here, though.
    $credentials = CredentialProvider::ini('default', '/root/.aws/credentials');

    // if using the 'credentials' key, do not use the 'profile' key
    $snsClient = SnsClient::factory(array(
        'region'  => 'us-west-2',
        'credentials' => $credentials
    ));
}

答案 1 :(得分:0)

我无法确切地知道您收到错误的原因,但

  

我不喜欢这样,因为这会导致我的凭据被存储   在文件夹设置中,其他人可以进入SFTP。

我认为您当然需要在AWS控制台上设置IAM角色,以允许从您的EC2实例连接到SNS。这样您就不需要提供任何凭证

答案 2 :(得分:0)

从@ Pavan对他的问题的评论中,他在set中显示了凭证文件的内容,似乎有2个文件。我只有一个文件

~/.aws