Ошибка при получении учетных данных из сервера метаданных профиля экземпляра: ошибка php AWS sdk - PullRequest
0 голосов
/ 08 мая 2018

Я занимаюсь разработкой веб-приложения с использованием 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.

1 Ответ

0 голосов
/ 09 мая 2018

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

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

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

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

...