首页 > 解决方案 > 当我尝试从 Ubuntu 服务器而不是本地计算机推送到 S3 时,AWS 拒绝了我的凭据

问题描述

我有一个运行由 S3 和 Cloudfront 提供支持的站点的客户(作为客户,而不是程序!)。我开发了一个数据驱动的 Web 交互(当然由 JS 提供支持),因为数据更新频繁,所以我会定期为他们更新。我使用他们提供给我的公钥/私钥对,因为我非常合理地无法访问他们的整个 AWS 账户。

客户希望能够随时更新交互,即使我没有立即待命。但我要求他们通过 Docker 容器或你有什么东西来复制我的本地环境是不现实的——我什至不确定他们是否具有对 Mac 的管理员访问权限。我没有直接联系他们管理基础设施的 DevOps 团队。(这是一家大公司,我的联系人不是开发人员。)

我的计划是在我的AWS 账户上启动一个小型、便宜的 EC2 实例,安装必要的语言和库来复制我在机器上所做的事情:获取新数据并处理它(在R- 原始文件非常大,所以交互式无法直接获取它们),重新编译交互式(在Node.js,使用 Webpack)并将其实时推送或推送到登台服务器(使用awscli,亚马逊的 Python 客户端)。我已经有简单的 Shell 脚本可以一举完成所有这些,并且我已经确认客户端能够ssh使用我提供的文件进入我的小实例.pem并运行一两个 Shell 脚本。

问题:当上传请求来自我的小型 Ubuntu 18.04 服务器而不是我的本地计算机时,客户的 AWS 账户拒绝了他们提供给我的凭据。关于如何在 Ubuntu 上安装,有许多相互竞争的说明awscli——aptitude、pip、直接从 Amazon 下载等。我都试过了,目前正在服务器上使用这个版本:

$ aws --version
aws-cli/1.18.104 Python/3.6.9 Linux/5.3.0-1030-aws botocore/1.17.27

aws configure在服务器上运行,绝对确定我使用了正确的密钥对,并且设置得很好(或者我认为是这样)。但是当我用一个无害的命令测试它时,我被告知密钥无效:

$ aws s3 ls s3://[client's s3 instance]
An error occurred (InvalidAccessKeyId) when calling the ListObjectsV2 operation:
The AWS Access Key Id you provided does not exist in our records.

当我使用相同的凭据在本地机器 MacBook 上运行这个完全相同的命令时,它工作得很好。我 100% 确定我使用的是相同的密钥对——我手动检查过。

所以我很困惑为什么 AWS 拒绝来自 Ubuntu 服务器的请求但接受来自本地机器的请求。我已经浏览了我能找到的每个 StackOverflow 帖子和留言板,但诊断通常是密钥对是错误的,但事实并非如此。

我唯一能想到的是我正在使用不同版本的awscli本地。在我的本地机器上,我仍在使用旧版本:

 $ aws --version
 aws-cli/1.16.10 Python/2.7.17 Darwin/19.6.0 botocore/1.12.0

我不愿意更新我机器上的 cli,以防它也在那里中断,但可以在 VM 中进行测试。但更重要的是,我想知道,在幕后,aws从服务器运行命令与从笔记本电脑运行命令是否存在更根本的区别。这对谷歌来说是一件棘手的事情!

标签: amazon-web-servicesamazon-s3amazon-ec2ubuntu-18.04aws-cli

解决方案


毕竟,检查了 100 次,服务器上的凭据中缺少一个字符。秩序在宇宙中恢复。谢谢!


推荐阅读