【问题标题】:Error retrieving credentials from the instance profile metadata server with credentials defined in .aws folder使用 .aws 文件夹中定义的凭据从实例配置文件元数据服务器检索凭据时出错
【发布时间】:2021-12-27 18:18:41
【问题描述】:

我在位于 /var/www/html/ 的 AWS 实例上有一个网页

到目前为止,该网站在代码本身中使用密钥 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 来访问托管在 S3 上的文件。 出于安全考虑, 我已经从我的代码中删除了这些密钥,并使用aws configure 命令通过 ssh 将它们存储在 AWS 推荐的服务器上。

我看到在我的目录~.aws/ 文件夹中创建了两个文件:credentialsconfig。 两者似乎都是正确的,但现在在网络日志中,我在尝试从 S3 访问文件时收到以下错误:

PHP Fatal error: Uncaught Aws\Exception\CredentialsException: Error retrieving credentials from the instance profile metadata server. (Client error: 'GET http://169.254.169.254/latest/meta-data/iam/security-credentials /' resulted in a '404 Not Found resulted in a '404 Not Found' response:

<! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Transitional // EN"
"http: // www. (truncated ...)
) in /var/www/html/aws/Aws/Credentials/InstanceProfileProvider.php:88

我不知道那个 URL 是什么,但我无法通过浏览器访问它。

我已经用环境变量试过了: 导出 AWS_ACCESS_KEY_ID = xxxxx...

我已将 .aws 文件夹复制到 /var/www 我已授予 .aws 更多权限,我已将所有者和组从 root 更改为 ec2-user ...

我应该如何进行配置,以便我的代码正确调用 S3 并获取文件?

调用失败的例子:

$s3 = new Aws\S3\S3Client ([
'version' => 'latest',
'region' => 'eu-central-1'
]);

if ($s3) {
    $result = $ s3-> getObject (array (
                    'Bucket' => AWS_S3_BUCKET,
                    'Key' => $s3_key,
                    'Range' => 'bytes ='. $Startpos .'- '. ($Startpos + 7)
    ));

【问题讨论】:

    标签: php amazon-web-services amazon-s3 amazon-ec2


    【解决方案1】:

    您可能需要将 .aws 文件夹移动到服务 (apache) 的主文件夹,而不是您的主文件夹。 aws sdk 找不到它,您收到此错误。但是,在 EC2 实例中使用 aws configure 并不是一个好主意。

    http://169.254.169.254/latest/meta-data/ 是仅在 EC2 实例内部可用的元数据 URL。对于在 EC2(或其他 AWS 计算服务)中运行的服务,您不应使用 AWS 凭证来访问服务。相反,您应该创建一个 IAM 角色并将其添加到实例。在控制台中,您可以使用“操作”按钮执行此操作:

    仅为角色分配所需的权限(S3 读/写)。

    您的代码 ($s3 = new Aws\S3\S3Client) 将尝试加载默认凭据。它将首先尝试调用元数据服务并获取与 IAM 角色权限相对应的临时凭证。

    【讨论】:

    • 非常感谢@kgiannakakis 的帮助。我的 Ec2 实例没有关联的 IAM 角色。我已经创建了一个合适的,它就像一个魅力。也许您还可以为我澄清以下内容:使用与我的 EC2 关联的 IAM,我尝试将 .aws/credentials 文件(根用户和 ec2-user)的 aws_access_key_id 更改为另一个错误字符串,但它仍然可以正常工作.这怎么可能?看起来它正在为 S3 调用获取“其他”凭据
    • 阅读此处了解优先级:docs.aws.amazon.com/sdk-for-java/v1/developer-guide/…。它适用于 Java,但我想,它与 PHP 类似
    猜你喜欢
    • 2018-04-18
    • 2017-11-25
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2016-02-01
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多