14

我的 AWS 凭证有问题。我使用了在 ~/.aws/credentials 上创建的凭证文件,就像它在 AWS 文档中所写的一样。但是,apache 就是无法读取它。

首先,我收到了这个错误:

从实例配置文件元数据服务器检索凭据时出错。当您不在 Amazon EC2 内部运行时,您必须在创建客户端时在“key”和“secret”选项中提供您的 AWS 访问密钥 ID 和秘密访问密钥,或者提供实例化的 Aws\Common\Credentials CredentialsInterface 对象。

然后我尝试了一些我在互联网上找到的解决方案。例如,我试图检查我的 HOME 变量。它是/home/ubuntu。我还尝试将我的凭据文件移动到 /var/www 目录,即使它不是我的 Web 服务器目录。没有任何效果。我仍然遇到同样的错误。

作为第二种解决方案,我看到我们可以直接调用 CredentialsProvider 并指示客户端上的目录。

https://forums.aws.amazon.com/thread.jspa?messageID=583216

错误发生了变化,但我无法使其工作:

无法从 /.aws/credentials 读取凭据

我还看到我们可以使用 CredentialsProvider 的默认提供程序而不是指示路径。

http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#using-credentials-from-environment-variables

我试过了,我一直收到同样的错误:

无法从 /.aws/credentials 读取凭据

以防万一您需要此信息,我正在使用 aws/aws-sdk-php (3.2.5)。我尝试使用的服务是 AWS Elastic Transcoder。我的 EC2 实例是 Ubuntu 14.04。它运行一个使用 Capifony 部署的 Symfony 应用程序。

在我在这个生产服务器上尝试之前,我在一个开发服务器上进行了尝试,它只能与 ~/.aws/credentials 文件完美配合。此开发服务器正是生产服务器的副本。但是,它不使用 Capifony 进行部署。它只是项目的普通 git 克隆。它只有一个 EBS 卷,而生产服务器有一个用于操作系统,一个用于应用程序。

啊! 而且我还检查了凭据文件的权限/所有者在两台服务器上是否相同并且它们是相同的。我尝试了 777 看看它是否可以改变一些东西,但什么也没有。

有人有想法吗?

4

4 回答 4

7

听起来你做错了。您不需要将凭证部署到 EC2 实例以使该实例与其他 AWS 服务交互,并且如果事实不应该将凭证部署到 EC2 实例。

相反,当您创建实例时,会将 IAM 角色与其关联。该角色具有控制对其他 AWS 服务的访问的策略。

您可以创建一个空角色,启动实例,然后稍后修改该角色。实例启动后,您无法分配角色。

您现在可以在分配实例后将角色添加到实例。

不将实际凭证部署到 EC2 实例仍然被认为是最佳实践。

于 2015-08-07T18:20:17.507 回答
3

如果这可以帮助某人,我设法使我的 .ini 文件工作,这样做:

    $profile = 'default';
    $path = '/mnt/app/www/.aws/credentials/default.ini';
    $provider = CredentialProvider::ini($profile, $path);
    $provider = CredentialProvider::memoize($provider);
    $client = ElasticTranscoderClient::factory(array(
        'region'  => 'eu-west-1',
        'version' => '2012-09-25',
        'credentials' => $provider
    ));

CredentialProvider 在此文档中进行了说明:

http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#ini-provider

我仍然不明白为什么我的应用程序无法在一台服务器上读取主目录 (~/.aws/credentials/default.ini) 上的文件,但在另一台服务器上却可以。

如果有人对此有所了解,请告诉我。

于 2015-08-10T10:41:07.900 回答
1

SDK 从位于 的文件~/.aws/credentials读取,但看起来您正在将文件保存在~/.aws/credentials/default.ini。如果您移动文件,您遇到的错误应该被清除。

于 2016-01-24T07:02:42.707 回答
0

2 解决我这个问题的方法Node.js

/home/{USER}/.aws/credentials它会从使用默认配置文件中获取我的凭据

const aws = require('aws-sdk');
aws.config.credentials = aws.SharedIniFileCredentials({profile: 'default'})
...

硬编码方式

var lambda = new aws.Lambda({
  region: 'us-east-1',
  accessKeyId: <KEY>
  secretAccessKey: <KEY>
});
于 2019-01-08T17:49:18.367 回答