質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

AWS IAM

AWS Identity and Access Management (IAM)は、AWS のサービスやリソースにアクセスできるユーザーやグループを指定し、きめ細かいアクセス許可を一元管理することができるサービスです。

Q&A

解決済

1回答

2485閲覧

AWS SDK for PHP 認証情報が取得できないエラー

i_bara

総合スコア1

SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

AWS IAM

AWS Identity and Access Management (IAM)は、AWS のサービスやリソースにアクセスできるユーザーやグループを指定し、きめ細かいアクセス許可を一元管理することができるサービスです。

0グッド

0クリップ

投稿2023/03/08 08:45

編集2023/03/08 14:56

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-***********", …

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2023/03/08 12:27

> 検証で動いているIAMロールと同じものを使用しているため本番での権限付与漏れはありません。 この文言だとそれが保証されないので、具体的に割り当てられているポリシーを記載してください。 例えばポリシーの設定内にアカウントIDや具体的なリソースのIDが入っている場合などは同一ではまずいです。 また、phpではなくcliで aws ec2 describe-instancesを実行するとどうなりますか。
i_bara

2023/03/08 15:06

コメントありがとうございます。 ポリシーとawscliの実行結果を追記しました。 ポリシーは編集なしのため、ひとつのロールを2つのEC2に設定しております。 ロールを複数のEC2にアタッチすることは特に問題はないと思っているのですが、不安ではあるため別のロールで同設定のものを別途つくりアタッチも考えております。 本番はあまり弄れないので、別に同設定の環境を用意して検証しようと思います。 awscliの結果は正常に返却されております。
guest

回答1

0

自己解決

自己解決しました。環境を勘違いしておりました。
AWSアカウントにEC2インスタンスを2つ(本番・検証)作成
⇒ 正確には4つ(本番メイン・サブ構成、検証メイン・サブ構成)でロードバランサーで各2つのEC2間の同期をとっておりました

検証環境はメイン・サブ共にIAMロールをアタッチ済みでしたが、本番のほうはメインのEC2のみにロールを設定しておりました。

② サーバでのapacheユーザ実行に関係ある?と思い、file_get_contentsでデータ取得を試みました。
正常に値が返却されるときと、Fatal errorになるときと半々で謎が深まりました。(URL仮)

こちらが気付くきっかけになったのですが、ロードバランサーで使用環境が切り替わるためメインEC2のときは値が返却され、サブEC2のときはエラーが発生しているためこのような現象が起こっておりました。

データに関しては同期されますがIAMロールの設定は同期されないため、設定時に環境をよく考慮すべきでした。

投稿2023/03/08 18:01

i_bara

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2023/03/09 04:21

> ロードバランサーで各2つのEC2間の同期をとっておりました 同期を取っているのではなく、リクエストを振り分けるのに使うものです。 データも同期されません。 特に何も設定していなければラウンドロビンで振り分けるので、2台であればIAMロールを設定しているインスタンスとしていないインスタンスを交互にアクセスしているからそうなるのでしょう。
i_bara

2023/03/09 06:15

ご指摘ありがとうございます。 確かに私の書き方ですとロードバランサが同期をとる機能のように受け取れてしまいますね。 同期の部分はEFSで行っております。 >ラウンドロビンで振り分ける ラウンドロビンという言葉初めて聞きました。勉強します、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問