AWS PHP SDK 凭据错误 S

AWS PHP SDK Credentials error S

我在尝试创建 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 安装程序的配置文件夹中有 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

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

I don't really like this since this causes my credentials to be stored in the folder setup where other's may SFTP into.

我想您肯定需要在 AWS 控制台设置 IAM 角色以允许从您的 EC2 实例连接到 SNS。这样您就不需要提供任何凭据

您的 ~/.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 环境变量。您将需要对执行此操作的最佳方法进行一些研究,因为解决方案可能高度依赖于 server/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
    ));
}

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

$ cat ~/.aws/credentials
[default]
aws_access_key_id = blablabla
aws_secret_access_key = blablabla
region = us-west-2