web-dev-qa-db-ja.com

/.aws/credentialsから認証情報を読み取れません-PHPスクリプトがAWS-SDKを呼び出します

私はここですべての回答を調べましたが、私の問題は少し異なっているか、適切な解決策がなかったようです。私はPHPファイルで次のことをしています:

use Aws\Route53\Route53Client;

$client = Route53Client::factory(array(
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2013-04-01'
));

このエラーを取得する:

Fatal error: Uncaught Aws\Exception\CredentialsException: Cannot read credentials from /.aws/credentials

簡単な修正は、HOMEディレクトリが正しいディレクトリであることを確認することのようです。確かにそうです。ファイルは読み取り可能で、ec2-userは既に所有者です。キーとシークレットはすでに「クレデンシャル」ファイルにインストールされています。プロファイル名はすでに「デフォルト」に設定されています。 /.awsを他のディレクトリ(ルート、/ homeなど)にコピーしようとし、許可、chmodなど、上記すべてを変更しました。まだ何もない。

次に、ちょっとしたキックを与えるために資格情報をハードコード化しました(わかっています-推奨しません)。これを行ったことを完全に無視します。

$client = Route53Client::factory(array(
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2013-04-01',
    'credentials' => [
            'key' => $key,
            'secret' => $secret,
    ]
));

最後の手段として、CredentialProviderクラスを含めてこれを配列に渡してみましたが、まだ何も行われていません。

'credentials' => CredentialProvider::ini('default', '/home/ec2-user/.aws/credentials'),

いったい何が悪いのでしょうか?

17
Justin H

何が間違っているのかはわかりませんが、問題を完全に回避して、問題のVMにEC2インスタンスの役割を割り当てることをお勧めします。そうすれば、心配する必要はありません。それはより良い/より安全なソリューションです。

https://docs.aws.Amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-Amazon-ec2.html

1
E.J. Brennan

削除するだけ'profile' => 'default'、そしてあなたはうまく働くべきです

$client = Route53Client::factory(array(
  'region' => 'us-east-1',
  'version' => 'latest',
  'credentials' => [
        'key' => $key,
        'secret' => $secret,
  ]
));
64
faruk

AWS Centos 7で実行しているので、すべて(chmod/chown/root/home/user、env、bashrcなど)を試し、/。aws/credentialsがApache/var/wwwディレクトリの外で機能するようにしました。 SDKは、資格情報ファイルを読み取れなかったと報告しました。

PHPを見て、HOME変数を設定/上書きできるかどうかを確認しましたが、.awsフォルダーを '/ var/www'フォルダーに配置し、次のように私のphpファイルにHOME変数を設定します:

 <%php
 putenv('HOME=/var/www');

 //Zip File SDK Install requires aws-autoloader
 require 'aws-autoloader.php'; //Your php code below
4
Henry Parra

上記のEJの答えが実際に正しい答えですが、この質問のために私が最終的に行ったのはこれです。うまくいけば、これは誰かが自分の資格情報ファイルを読み取れるようにするのに役立ちます:

use Aws\Credentials\CredentialProvider;
use Aws\Route53\Route53Client;

$profile = 'default';
$path = '/var/www/html/.aws/credentials';
$provider = CredentialProvider::ini($profile, $path); 
$provider = CredentialProvider::memoize($provider);

$client = Route53Client::factory(array(
    'region' => 'us-east-1',
    'version' => '2013-04-01',
    'credentials' => $provider
));
2
Justin H
  • 「ls -l」を使用して.aws/*ファイルの権限を確認します
  • 権限をグランドリードに変更するか、すべての権限「Sudo chmod 777 .aws/*」を付与します
  • コードを再実行します