web-dev-qa-db-ja.com

AWS SDK for PHP:インスタンスプロファイルメタデータサーバーからの認証情報の取得エラー

Web APIを介してAndroidにSNSメッセージを送信しようとしています。 http://aws.Amazon.com/developers/getting-started/php/ からSDKをダウンロードしてインストールしました

Sample.phpの実行中に次のエラーが発生しました。

Fatal error: Uncaught exception 'Aws\Common\Exception\InstanceProfileCredentialsException' with message '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. ([curl] 28: Connection timed out after 5016 milliseconds [url] http://169.254.169.254/latest/meta-data/iam/security-credentials/)' in C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\InstanceMetadata\InstanceMetadataClient.php:85 Stack trace: #0 C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\Credentials\RefreshableInstanceProfileCredentials.php(52): Aws\Common\InstanceMetadata\InstanceMetadataClient->getInstanceProfileCredentials() #1 C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\Credentials\AbstractRefreshableCredentials.php(54): Aws\Common\Credentials\Refreshable in C:\xampp\htdocs\aws-php\vendor\aws\aws-sdk-php\src\Aws\Common\InstanceMetadata\InstanceMetadataClient.php on line 85

このトピックに関する小さなガイダンスは私を大いに助けます

55
Ravindra

私の場合、私は使用していました

return DynamoDbClient::factory(array(
  'version' => 'latest',
  'region'  => AWS_REGION,
  'key' => AWS_KEY,
  'secret'  => AWS_SECRET
));

以前はaws/aws-sdk-phpバージョン2.8.5で問題ありませんでしたが、composerが自動的にバージョン3.2.0をインストールすると、上記のエラーが発生しました。問題は、単に呼び出しを行う方法を変更すべきだったということです。

return DynamoDbClient::factory(array(
  'version' => 'latest',
  'region'  => AWS_REGION,
  'credentials' => array(
    'key' => AWS_KEY,
    'secret'  => AWS_SECRET,
  )
));

文書化されているとおり こちら 。呼び出しを変更せずに、Apachephpは、空のHOME環境変数を使用して~/.aws/credentialsファイルを探すことにフォールバックしていました。 php -r 'var_dump(getenv("HOME"));'を実行すると、その値を確認できます。

これ は関連する投稿です

144
shadi

私の場合、ハードコードされた資格情報を使用する必要がありました

$s3Client = new S3Client([
    'region' => REGION,
    'version' => '2006-03-01',
    'credentials' => [
        'key'    => S3_KEY,
        'secret' => S3_SECRETE,
    ],
]);

詳細を参照してください こちら

10
elegant-user

設定した.aws/credentialsファイルを、ログインしているユーザーのホームディレクトリではなく、Webサービスのホームディレクトリ*通常は/var/www)に配置する必要があります。

サーバー上のphpファイルでecho getenv('HOME');を実行すると、Webサービスが使用しているホームディレクトリを見つけることができます。

8
Anti

手順は次のとおりです。

  1. cd ~と入力すると、ホームディレクトリに移動します。
  2. mkdir .aws
  3. Sudo vi .aws/credentials
  4. 次の行を書き、ファイルを保存します。

    [default]
    aws_access_key_id = Your AWS Access Key
    
    aws_secret_access_key = Your AWS Secret Access Key
    
4
Dibya Sahoo

私は資格情報ファイルを使用しようとしていて、同じエラーが発生しました、 githubのこのguy はほとんどそれを打ちました:

資格情報ファイルはini形式である必要がありますが、.ini拡張子は使用できません。キーとシークレットで定義された「デフォルト」セクションが必要です。

$ less ~/.aws/credentials

[default]
aws_access_key_id = key
aws_secret_access_key = secret

デフォルトの代わりに他のセクション名を指定した場合、S3Clientパラメーターにprofileキーを追加するだけです。

[example]
aws_access_key_id = key
aws_secret_access_key = secret

$s3Client = new \Aws\S3\S3Client([
    'version' => '2006-03-01',
    'region' => $yourPreferredRegion,
    'profile' => 'example',
]);

資格情報ファイルまたは環境変数を使用することは、独自のサーバーで資格情報を提供する推奨方法です

そして、@ Antiの回答も私をたくさん助けてくれました!

ハードコーディングされた方法を好む場合は、@ shadiの答えに従ってください。

laravelおよびaws/aws-sdk-php-laravel sdkの場合、すべてのステップを構成し、.envファイルでキーを定義したら、次のコマンドで構成キャッシュを削除して再構築する必要があります。

php artisan config:cache;
composer dump-autoload;
0
JenuJ

これは、構成ファイルが公開されていないためである可能性があります。

構成ファイルを必ず公開してください。

php artisan vendor:publish  --provider="Aws\Laravel\AwsServiceProvider"

これをテストするには、設定をクリアするだけです。

php artisan config:clear

キャッシュがクリアされた状態で動作する場合、これが問題になります。

0
MichaelHoughton