AWS 凭证不起作用 - ~/.aws/credentials

AWS 凭证不起作用 - ~/.aws/credentials

我的 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 看看它是否可以改变一些东西,但什么也没做。

有人有想法吗?

答案1

我也遇到了“ Cannot read credentials from /.aws/credentials”错误。错误消息中给出了解决方案。

/.aws/credentials是直接位于根目录中的文件和目录/ ,SDK 会在此查找它。Apache 在其下运行的用户(apachecentos7 上的用户)没有自己的主目录,因此没有 ~/home。

有关此事的一些警告应该出现在 aws 文档中!

创建您的凭证文件,并且/.aws/credentials不要~/user/.aws/credentials

运行完美。

如果您已将 selinux 设置为强制执行,则需要递归更改 ./aws 的安全上下文以匹配 httpd 的安全上下文。否则 apache 将无法读取凭证文件。

sudo chcon -Rv --type=httpd_sys_content_t /.aws

$ ls -Z /.aws/credentials -rwxr-xr-x.root root unconfined_u:object_r:httpd_sys_content_t:s0 /.aws/credentials

答案2

如果您从 EC2 实例运行,最佳做法是使用 IAM 角色而不是存储您的凭证。转到 IAM > 角色 > 创建角色,创建您的角色并将具有必要权限的策略附加到此角色(如果您需要,我可以提供帮助)。然后创建一个 EC2 机器,当您进入“步骤 3:配置实例详细信息”时,将此角色附加到您的机器。从现在开始,您不需要将任何凭证存储到您的机器,对 aws API 的每次调用都将“自动”签名。

如果您想将角色附加到现有机器,则必须从该机器创建 AMI,并从此 AMI 创建一个附加角色的新 VM。

我所做的是,我总是至少将一个空角色附加到我的虚拟机,以便如果需要,我以后可以向该角色附加一个策略并允许我的机器调用 API。

答案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) 上的文件,但在另一台服务器上却可以读取。

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

相关内容