0

尝试创建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/)

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

我真的不喜欢这样,因为这会导致我的凭据存储在其他人可能 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 /的config内容是什么~/.aws/这是文件夹 中配置文件的内容

[default]
output = json
region = us-west-2
4

3 回答 3

5

您的~/.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
    ));
}
于 2015-06-03T21:27:38.980 回答
0

我看不出您收到错误的确切原因,但是

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

我想您当然需要在 AWS 控制台上设置 IAM 角色以允许从您的 EC2 实例连接到 SNS。通过这种方式,您无需提供任何凭据

于 2015-06-03T20:20:28.533 回答
0

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

$ cat ~/.aws/credentials
[default]
aws_access_key_id = blablabla
aws_secret_access_key = blablabla
region = us-west-2
于 2015-07-23T09:01:36.380 回答