web-dev-qa-db-ja.com

AWS認証情報が機能しない-〜 / .aws / credentials

AWS認証情報に問題があります。 AWSドキュメントに書かれているのと同じように、〜/ .aws/credentialsで作成した認証情報ファイルを使用しました。ただし、Apacheはそれを読み取ることができません。

まず、次のエラーが発生しました。

インスタンスプロファイルメタデータサーバーからの資格情報の取得中にエラーが発生しました。 Amazon EC2内で実行していない場合は、クライアントを作成するときに「key」および「secret」オプションでAWSアクセスキーIDとシークレットアクセスキーを指定するか、インスタンス化されたAws\Common\Credentials CredentialsInterfaceオブジェクトを指定する必要があります

それから私はインターネットで見つけたいくつかの解決策を試しました。たとえば、HOME変数をチェックしようとしました。/home/ubuntuでした。また、Webサーバーディレクトリでなくても、資格情報ファイルを/ var/wwwディレクトリに移動しようとしました。何も機能しませんでした。それでも同じエラーが発生していました。

2番目の解決策として、CredentialsProviderを直接呼び出して、クライアント上のディレクトリを指定できることを確認しました。

https://forums.aws.Amazon.com/thread.jspa?messageID=583216&#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 ElasticTranscoderです。私のEC2インスタンスはUbuntu14.04です。 Capifonyを使用してデプロイされたSymfonyアプリケーションを実行します。

この本番サーバーを試す前に、〜/ .aws/credentialsファイルでのみ完全に機能する開発サーバーで試しました。この開発サーバーは、本番サーバーのコピーです。ただし、展開にCapifonyを使用しません。これは、プロジェクトの通常のgitクローンです。また、EBSボリュームは1つだけですが、本番サーバーにはOS用とアプリケーション用に1つずつあります。

ああ!また、資格情報ファイルのアクセス許可/所有者が両方のサーバーで同じであり、同じであるかどうかも確認しました。 777を試して、何も変更できないかどうかを確認しました。

誰かアイデアがありますか?

14
ana-lu

あなたがそれを間違っているように聞こえます。そのインスタンスを他のAWSサービスと相互作用させるために、EC2インスタンスに認証情報をデプロイする必要はありません。また、実際には、EC2インスタンスに認証情報をデプロイするべきではありません。

代わりに、インスタンスを作成するときに、IAMロールをインスタンスに関連付けます。そのロールには、他のAWSサービスへのアクセスを制御するポリシーがあります。

空のロールを作成し、インスタンスを起動して、後でロールを変更できます。インスタンスの起動後にロールを割り当てることはできません。

インスタンスが割り当てられた後、インスタンスにロールを追加できるようになりました。

EC2インスタンスに実際の認証情報をデプロイしないことは依然としてベストプラクティスと見なされています。

7
chris

これが誰かを助けることができるなら、私はこのようにして、私の.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)のファイルを読み取れないのに、もう一方のサーバーでは読み取れる理由がまだわかりません。

誰かがそれについて何か知っているなら、私に知らせてください。

3
ana-lu

SDKは ~/.aws/credentialsにあるファイル から読み取りますが、~/.aws/credentials/default.iniにファイルを保存しているようです。ファイルを移動すると、発生していたエラーが解消されます。

1
giaour

この問題を私に解決する2つの方法Node.js

/home/{USER}/.aws/credentials usin 'から私の資格情報を取得します デフォルトプロファイル

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>
});
0
Alex