2017-08-23 23 views
0

簡単な質問。しかし、それを働かせることはできません。PHP SDK IAMロールを添付したEC2インスタンスでAWS資格情報を取得できません

CloudWatchへのフルアクセスでEC2のIAMロールを作成しました。 このIAMロールを添付して新しいEC2インスタンスを開始しました。 このEC2インスタンスで、CloudWatchにメトリックを公開しようとする単純なPHPアプリケーションを作成しました。その同じEC2インスタンスから

2017/08/23 11:44:06 [error] 32142#32142: *5 FastCGI sent in stderr: 
"PHP message: PHP Fatal error: 
Uncaught Aws\Exception\CredentialsException: 
Cannot read credentials from /var/www/.aws/credentials 
in /var/www/app/vendor/aws/aws-sdk-php/src/Credentials/CredentialProvider.php:394 

、コマンド:レスポンスでアクセスキーとシークレットと200 OK

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-attached-to-ec2-instance> 

戻り

私はnginxのログで、このエラーを取得しています。

これはCloudWatchのメトリックを書き込もうとする私のPHPコードです:

<?php 

require 'vendor/autoload.php'; 
use Aws\CloudWatch\CloudWatchClient; 
use Aws\Exception\AwsException; 

$count = $_GET["count"]; 
publishMetric($count); 

function publishMetric($count) { 
    $client = new CloudWatchClient([ 
      'profile' => 'default', 
      'region' => 'us-east-1', 
      'version' => '2010-08-01' 
    ]); 
    try { 
      $result = $client->putMetricData(array(
       'Namespace' => 'com.mynamespace', 
       'MetricData' => array(
         array(
          'MetricName' => 'Count', 
          //Timestamp : mixed type: string (date format)|int (unix timestamp)|\DateTime 
          'Timestamp' => time(), 
          'Value' => $count, 
          'Unit' => 'Number' 
        ) 
       ) 
      )); 
      var_dump($result); 

      echo 'Done publishing metrics'; 
    } catch (AwsException $e) { 
      // output error message if fails 
      error_log($e->getMessage()); 

      echo 'Failure to publish metrics'; 
    } 

} 


?> 

このセットアップに欠けているものを任意のアイデア?

答えて

0

EC2インスタンスの認証他のAWSサービスへのアクセス中には、複数の方法で行うことができます。

  1. は、EC2インスタンスにロールを割り当てます。いくつかの「EC2インスタンス」に権限を与えなければならないときに使用されます。
  2. 役割を割り当てないでください。すべての必要な権限を持つアクセスキーを使用してください。 「ユーザー」に許可を与えたときに使用されます

これらはどちらも独立した認証メカニズムです。すでにサーバーに役割を割り当てている場合。認証するためにアプリケーション(CredentialProvider.php)にコードを書く必要はありません。

accessKey=AKIAIB6FA52IMGLREIIB 
secretKey=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 
+0

編集した質問をご覧ください。私は自分のコードを追加しました。私は明示的に資格情報を提供していない。また、上記のアプローチ#1を使いたいと思いますが、それは自動的には機能しません。 – Bonton255

0

明示的にクライアントオブジェクトに資格情報を提供しないでください:

あなたの現在のコードは、次のようになりますファイル/var/www/.aws/credentialsを作成することで加工することができます。

static instanceProfile (array $config = []) 

インスタンスプロファイルの資格情報を使用して資格情報を作成する資格プロバイダ。

Using IAM roles for Amazon EC2 instances

明示的にクライアントオブジェクトに資格情報を提供しないと 何の環境変数の資格情報を使用できない、 にSDKの試みは メタデータサーバーAmazon EC2インスタンスからインスタンスプロファイルの資格情報を取得します。場合これらの資格情報は、 IAMロールで構成されたAmazon EC2インスタンスで実行されている場合にのみ使用できます。

+0

私の質問が更新されました。明示的に資格情報を提供していません。 EC2インスタンスはIAMロールに関連付けられているため、「自動的に」選択する必要があります。しかし、それは動作していないものです。 – Bonton255

0

私はこれが遅いことを知っています。クライアントを初期化するときに同じ問題が発生し、profile => default行を削除して解決しました。資格情報とプロファイルを指定しないと、SDKはメタデータサーバーからインスタンスプロファイルのcredを取得しようとします。

関連する問題