我们使用 AWS 身份验证流程,通过该流程,您可以进行身份验证、执行 MFA 步骤,然后获得有效期为一小时的凭证。通常这些凭证会放入 中~/.aws/credentials
。但是,在执行长时间运行的 awscli 操作(例如通过 复制大型文件)时aws s3 cp ...
,凭证会过期,命令无法成功完成。
我们已尝试重新运行该命令来重新进行身份验证并重新填充,~/.aws/credentials
但正在进行的命令没有“看到”这一点,并且在原始凭据过期时仍然会失败。
这该如何处理?
答案1
您有几个选择...
更长的会话持续时间
您可以将最大会话持续时间设置为长达 12 小时- 这对于您长期运行的任务来说可能已经足够了。
不确定您如何获取临时凭证,您可能必须将会话持续时间设置为 12 小时,并且某些工具请求令牌默认有效期为 1 小时。
另请查看get-credentials
脚本这可能会简化您的工作流程。也许,我不知道您现在到底在做什么,但是写临时凭证~/.aws/credentials
通常不是最佳做法。
先复制到EC2
如果您无法增加最大持续时间设置,您可以通过以下方式解决限制:
第一的复制数据到 EC2 实例,例如使用
rsync
。然后从EC2上传到S3,利用实例EC2 实例角色自动更新。除了从 EC2 复制到 S3可能更快。
在本地使用 EC2 凭证
您还可以“窃取” EC2 角色凭证并在本地使用。查看此内容get-instance-credentials
脚本。
[ec2-user@ip-... ~] ./get-instance-credentials
export AWS_ACCESS_KEY_ID="ASIA5G7...R3KG5"
export AWS_SECRET_ACCESS_KEY="bzkNi/9YV...FDzzd0"
export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEKf....PUtXw=="
这些信用通常是6 小时可用。
现在将这些行复制并粘贴到您本地的非 EC2 机器上。
user@server ~ $ export AWS_ACCESS_KEY_ID="ASIA5G7...R3KG5"
user@server ~ $ export AWS_SECRET_ACCESS_KEY="bzkNi/9YV...FDzzd0"
user@server ~ $ export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEKf....PUtXw=="
并验证凭证是否有效:
user@server ~ $ aws sts get-caller-identity
{
"UserId": "AROAIA...DNG:i-abcde123456",
"Account": "987654321098",
"Arn": "arn:aws:sts::987654321098:assumed-role/EC2-Role/i-abcde123456"
}
如您所见,本地非 EC2 服务器现在具有与您从中检索凭据的 EC2 实例相同的权限。
使用aws
CLI分段上传文件
您可以将大文件分割成较小的块(请参阅split
请参阅man page) 并使用aws s3api
multipart-upload 子命令。请参阅和aws s3api create-multipart-upload
。您可以在每个部分之间刷新凭证,并在凭证中途过期时重试失败的部分。complete-multipart-upload
part-upload
创建自定义脚本
您可以使用出色的boto3
Python AWS SDK 库可用于构建您自己的文件上传器。编写一个小型多部分上传器应该非常简单,它会在凭证每次过期时请求新的凭证,包括请求 MFA。
正如您所见,您有很多选择。
希望有帮助:)