веб-сервисы Amazon — ошибка при получении учетных данных из сервера метаданных профиля экземпляра, ошибка php AWS sdk

Я занимаюсь разработкой веб-приложения с использованием php. Я храню учетные данные пользователя в сервисе AWS cognito. Я вхожу в систему пользователя Cognito, используя PHP SDK. Я разработал функцию успешно. Я проверил это локально на моей машине, это работало. Затем я развернул его на промежуточном сервере, он также работал на промежуточном сервере. Но когда я развернул его на живом сервере. Это дало мне эту ошибку.

(1/1) CredentialsException
Error retrieving credentials from the instance profile metadata server. (cURL error 7: Failed to connect to 169.254.169.254 port 80: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html))

Это мой код

 try{
$client = new CognitoIdentityProviderClient([
'version' => 'latest',
'region' => 'eu-west-2'// env('AWS_REGION', '')
]);

$result = $client->adminInitiateAuth([
'AuthFlow' => 'ADMIN_NO_SRP_AUTH',
'ClientId' => COGNITO_APP_CLIENT_ID,
'UserPoolId' => COGNITO_USER_POOL_ID,
'AuthParameters' => [
'USERNAME' => $request->email,
'PASSWORD' => $request->password,
],
]);

$auth_result =  $result->get('AuthenticationResult');
$cognito_access_token = $auth_result['AccessToken'];
if(!empty($cognito_access_token))
{
//register the user
$reg_user = $this->accRepo->register($request);
if($reg_user)
{
Auth::login($reg_user);
$token = $reg_user->createToken($this->tokenTag)->accessToken;
unset($reg_user->password);
return response()->json([ 'success' => true, 'access_token' => $token, 'account' => $reg_user ], SUCCESS_RESPONSE_CODE);
}
}

}
catch(Exception $e)
{

}

Я использую точный код и настройки и учетные данные в качестве локального компьютера и промежуточного сервера для живого сервера. Но это не работает на живом сервере. Работать в других средах. Пожалуйста, в чем может быть ошибка? Я развернул его на Heroku.

0

Решение

Я не знаком с Cognito, но ошибка, которую вы видите, заключается в том, что ваш код пытается получить доступ к Метаданные экземпляра доступно в EC2. AWS PHP SDK имеет определенный порядок, в котором он пытается найти учетные данные. Вот схема различных учетных методов используя PHP SDK.

Итак, я подозреваю, что он работает на вашем локальном компьютере, потому что у вас есть профиль IAM, настроенный с помощью интерфейса командной строки AWS aws configure команда.

Скорее всего, он работает на вашем промежуточном сервере, потому что этот сервер имеет Роль IAM прикреплен к экземпляру EC2. PHP не находит локально настроенный профиль IAM, поэтому он переходит к попытке доступа к метаданным EC2, что он делает успешно, поэтому он проходит аутентификацию.

Теперь при развертывании в Heroku его уже нет в экземпляре EC2 или в вашей локальной среде. Итак, ваш CredentialProvider не работает. Мое предложение будет использовать Config Vars в Heroku, затем измените свой код для использования CredentialProvider::env() как изложено здесь. Вам нужно будет создать пользователя IAM с той же ролью, что и у вашего экземпляра EC2, который работает (или достаточно разрешений, чтобы делать то, что вам нужно). Это позволит вашему приложению получить безопасный доступ к Cognito из среды, внешней по отношению к AWS.

1

Другие решения

Других решений пока нет …