从实例配置文件元数据服务器错误php AWS sdk检索凭据时出错

时间:2018-05-08 18:24:03

标签: php amazon-web-services aws-cognito

我正在使用php开发一个Web应用程序。我将用户凭据存储在AWS cognito服务上。我使用PHP sdk将用户登录到Cognito。我成功开发了这个功能。我在我的机器上本地测试它,它正在工作。然后我将它部署到登台服务器上,它也在登台服务器上运行。但是当我将它部署到实时服务器上时。它给了我这个错误。

(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 :(得分:1)

我不熟悉Cognito,但您看到的错误是您的代码正在尝试访问EC2中提供的Instance Metadata。 AWS PHP SDK具有特定的顺序,用于尝试查找凭据。 Here is an outline of different credential methods使用PHP SDK。

因此,我怀疑它适用于您的本地计算机,因为您使用AWS CLI aws configure命令配置了IAM配置文件。

它很可能适用于您的登台服务器,因为该服务器有一个IAM Role连接到EC2实例。 PHP没有找到本地配置的IAM配置文件,因此它跳过尝试访问EC2元数据,它成功完成,因此它经过身份验证。

现在,当您部署到Heroku时,它不再位于EC2实例上,也不再位于您的本地环境中。因此,您的CredentialProvider失败。我的建议是在Heroku中使用Config Vars,然后将代码更改为使用CredentialProvider::env() as outlined here。您需要创建一个与您的EC2实例具有相同角色的IAM用户(或足够的权限来执行您需要执行的操作)。这将允许您的应用程序从AWS外部的环境安全地访问Cognito。