AWS SDK for PHP 認証情報が取得できないエラー
AWS SDK for PHP使用のページで認証情報が取得できない旨のFatal error(500)が出て値が取得できず困っています。
設定状況
・AWSアカウントにEC2インスタンスを2つ(本番・検証)作成
・AWS SDK for PHP(Ver 3.261.6)、Composer使用でインストール済み
・awscliの認証情報はIAMロールで設定しEC2インスタンス2つに同一のロールをアタッチ
検証環境ではSDK使用でデータも取得でき問題なく動作しております。
一方本番では認証情報が取得できない旨のエラーが出ます。
検証で動いているIAMロールと同じものを使用しているため本番での権限付与漏れはありません。
なぜ動かないのか手詰まりの状態なのですが、原因と思われるものがありましたらご教示いただければ幸いです。
試してみたこと
① Composerではなくaws.phar使用でrequireしましたが、検証では正常に動作し、本番ではFatal errorでした。
② サーバでのapacheユーザ実行に関係ある?と思い、file_get_contentsでデータ取得を試みました。
正常に値が返却されるときと、Fatal errorになるときと半々で謎が深まりました。(URL仮)
sudo -u apache php -r "echo file_get_contents('https://example.com/demo.php');"
phpエラーログ
error_log
1[08-Mar-2023 16:13:50 Asia/Tokyo] PHP Fatal error: Uncaught Aws\Exception\CredentialsException: Error retrieving credentials from the instance profile metadata service. (Client error: `GET http://169.254.169.254/latest/meta-data/iam/security-credentials/` resulted in a `404 Not Found` response: 2<?xml version="1.0" encoding="iso-8859-1"?> 3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 4 "http://ww (truncated...) 5) in /var/www/html/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php:264 6Stack trace: 7#0 /var/www/html/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php(139): Aws\Credentials\InstanceProfileProvider->handleRetryableException() 8#1 [internal function]: Aws\Credentials\InstanceProfileProvider->Aws\Credentials\{closure}() 9#2 /var/www/html/vendor/guzzlehttp/promises/src/Coroutine.php(160): Generator->throw() 10#3 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(204): GuzzleHttp\Promise\Coroutine->_handleFailure() 11#4 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(153): GuzzleHttp\Promise\Promise::callHandler() 12#5 /var/www/html/vendor/guzzlehttp/promises/src/TaskQueue.php(48): GuzzleHttp\Promise\Promise::GuzzleHttp\Promise\{closure}() 13#6 /var/www/html/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(159): GuzzleHttp\Promise\TaskQueue->run() 14#7 /var/www/html/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(184): GuzzleHttp\Handler\CurlMultiHandler->tick() 15#8 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(248): GuzzleHttp\Handler\CurlMultiHandler->execute() 16#9 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(224): GuzzleHttp\Promise\Promise->invokeWaitFn() 17#10 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(269): GuzzleHttp\Promise\Promise->waitIfPending() 18#11 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(226): GuzzleHttp\Promise\Promise->invokeWaitList() 19#12 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(62): GuzzleHttp\Promise\Promise->waitIfPending() 20#13 /var/www/html/vendor/guzzlehttp/promises/src/Coroutine.php(67): GuzzleHttp\Promise\Promise->wait() 21#14 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(248): GuzzleHttp\Promise\Coroutine->GuzzleHttp\Promise\{closure}() 22#15 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(224): GuzzleHttp\Promise\Promise->invokeWaitFn() 23#16 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(62): GuzzleHttp\Promise\Promise->waitIfPending() 24#17 /var/www/html/vendor/guzzlehttp/promises/src/Coroutine.php(103): GuzzleHttp\Promise\Promise->wait() 25#18 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(274): GuzzleHttp\Promise\Coroutine->wait() 26#19 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(226): GuzzleHttp\Promise\Promise->invokeWaitList() 27#20 /var/www/html/vendor/guzzlehttp/promises/src/Promise.php(62): GuzzleHttp\Promise\Promise->waitIfPending() 28#21 /var/www/html/vendor/aws/aws-sdk-php/src/AwsClientTrait.php(58): GuzzleHttp\Promise\Promise->wait() 29#22 /var/www/html/vendor/aws/aws-sdk-php/src/AwsClientTrait.php(86): Aws\AwsClient->execute() 30#23 /var/www/html/server-status-check2.php(44): Aws\AwsClient->__call() 31#24 /var/www/html/server-status-check2.php(77): getServerListInfo() 32#25 {main} 33 thrown in /var/www/html/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php on line 264
認証情報(IAMロール使用)
awscli
1$ aws configure list 2 Name Value Type Location 3 ---- ----- ---- -------- 4 profile <not set> None None 5access_key ****************AAAA iam-role 6secret_key ****************BBBB iam-role 7 region ap-northeast-1 imds
AWS SDK for PHP使用ページ
php
1<?php 2date_default_timezone_set("Asia/Tokyo"); 3ini_set("error_reporting",E_ALL); 4ini_set("display_errors",1); 5 6require ( $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php'); 7 8use Aws\Ec2\Ec2Client; 9 10function getServerListInfo(){ 11 $ec2Client = new Ec2Client([ 12 'region' => 'ap-northeast-1', 13 'version' => 'latest' 14 ]); 15 16 // EC2インスタンス情報取得 17 $result = $ec2Client->describeInstances(); 18 return $result; 19} 20 21$data = getServerListInfo(); 22print_r($data); 23?>
OSはCentOS7、PHPは8です。
追記です。
IAMロールに設定のポリシー(1ロールを本番・検証に設定、ポリシーの編集なし)
IMAロール(ポリシー一覧)
1AmazonS3FullAccess 2CloudWatchAgentServerPolicy 3AmazonSESReadOnlyAccess 4CloudWatchActionsEC2Access 5AmazonSNSReadOnlyAccess 6AmazonRDSReadOnlyAccess 7CloudWatchReadOnlyAccess 8AmazonRDSEnhancedMonitoringRole 9PowerUserAccess
本番でawscli実行結果
awscli
1$ aws ec2 describe-instances 2{ 3 "Reservations": [ 4 { 5 "Groups": [], 6 "Instances": [ 7 { 8 "AmiLaunchIndex": 0, 9 "ImageId": "ami-***********", 10 "InstanceId": "i-***********", …
回答1件
あなたの回答
tips
プレビュー