【问题标题】:Error retrieving credentials from the instance profile metadata server error php AWS sdk从实例配置文件元数据服务器错误 php AWS sdk 检索凭证时出错
【发布时间】:2018-05-09 05:09:28
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我不熟悉 Cognito,但您看到的错误是您的代码正在尝试访问 EC2 中可用的 Instance Metadata。 AWS PHP 开发工具包具有尝试查找凭证的特定顺序。 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。

    【讨论】:

    • 嗨。亚伦。这对我有帮助。我没有完全使用相同的解决方案。我根据你的回答找到了解决方案。是的,你是对的,它找不到 IAM 密钥。创建客户端时,我必须明确设置它们。谢谢。
    • 将访问密钥和秘密访问密钥硬编码到应用程序代码中是不好的做法,如果您的代码是开源的或以其他方式公开可用,则可能存在危险。这就是为什么我建议走使用环境变量的路线。如果您不想使用 CredentialProvider::env(),那么您至少可以使用 PHP 的 getenv() 函数从 Heroku 环境中读取凭据。
    猜你喜欢
    • 2018-04-18
    • 2019-05-06
    • 2017-11-25
    • 2016-02-01
    • 2015-02-08
    • 2021-12-27
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多