amazon-web-services - 当我尝试从 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
从服务器运行命令与从笔记本电脑运行命令是否存在更根本的区别。这对谷歌来说是一件棘手的事情!
解决方案
毕竟,检查了 100 次,服务器上的凭据中缺少一个字符。秩序在宇宙中恢复。谢谢!
推荐阅读
- angular - 如何在茉莉花中模拟新的承诺块
- docker - 使用 docker 安装 mongodb
- java - 如何让加载活动等到线程完成
- python-3.x - 如何删除数据框中的重复值,同时保留 Pandas 中的其余行?
- netlogo - 如何将使用“values-from”语法的代码重写为使用“of”语法的代码
- android - 如何确定Android视图百分比可见区域何时发生变化?
- netbeans - 将 derby.jar 数据库添加到 jdk 1.8.0_191
- javascript - 以编程方式从数据对象创建变量
- python - 如何在 Keras 模型中停用使用 training=True 调用的 dropout 层?
- windows - 使用设备句柄确定 ReadFile/WriteFile 允许的最大 IO 大小?