AWS凭证无效 – 〜/ .aws / credentials

我的AWS凭据有问题。 我使用了我在〜/ .aws / credentials上创build的凭证文件,就像它在AWS文档上写的一样。 但是,Apache只是无法读取它。

首先,我得到这个错误:

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

然后我尝试了一些我在网上find的解决scheme。 例如,我试图检查我的HOMEvariables。 这是/ home / Ubuntu的。 我也尝试将凭据文件移动到/ var / www目录,即使它不是我的Web服务器目录。 没有工作。 我仍然得到同样的错误。

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

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

错误更改,但我无法使其工作:

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

我还看到,我们可以使用CredentialsProvider的默认提供者来代替path。

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,看它是否可以改变一些东西,但没有。

有人有想法吗?

如果您从EC2实例运行,则最佳做法是使用IAMangular色而不是存储您的凭据。 转到IAM>angular色>创buildangular色,创buildangular色,并将策略附加到此angular色的必要权限(如果需要,我可以帮助解决此问题)。 然后创build一个EC2机器,当你在“步骤3:configuration实例详细信息”时,附加这个angular色你的机器。 从现在起,您不需要将任何凭据存储到您的机器,每个对aws API的调用都将被“自动”签名。

如果要将angular色附加到现有计算机上,则必须从计算机上创build一个AMI,然后从该AMI创build一个新的虚拟机,并附加angular色。

我所做的是我总是将至less一个空的angular色附加到我的虚拟机上,这样如果需要的话,我可以稍后再添加一个策略到这个angular色,并允许我的机器调用API。

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

/.aws/credentials是直接位于根目录/ /.aws/credentials的文件和目录,这是SDK正在查找的目录。 Apache运行的用户(centos7上的用户apache )没有自己的home,所以没有〜/ home。

有些警告应该在aws文档中!

完全按照/.aws/credentials创build您的凭证文件,而不是~/user/.aws/credentials

完美的作品。

如果您已经设置了selinux来执行,那么您将需要recursion地改变./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

这可以帮助别人,我设法使我的.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)上的文件,而是在另一台服务器上读取文件。

如果有人知道这件事,请告诉我。