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

Error retrieving credentials from the instance profile metadata server error php AWS sdk

我正在使用 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 上部署它。

我不熟悉 Cognito,但您看到的错误是您的代码正在尝试使用 PHP SDK 访问 Instance Metadata available in EC2. The AWS PHP SDK has a specific order in which it attempts to locate credentials. Here is an outline of different credential methods

因此,我怀疑它可以在您的本地计算机上运行,​​因为您使用 AWS CLI aws configure 命令配置了 IAM 配置文件。

它很可能适用于您的暂存服务器,因为该服务器有一个 IAM Role 附加到 EC2 实例。 PHP 没有找到本地配置的 IAM 配置文件,因此它会跳到尝试访问 EC2 元数据,它成功访问了,因此它获得了身份验证。

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