Boto3 使用 django 应用程序在本地和弹性 beantalk 上生成不同的链接

Posted

技术标签:

【中文标题】Boto3 使用 django 应用程序在本地和弹性 beantalk 上生成不同的链接【英文标题】:Boto3 generating different links locally and on elastic beanstalk with a django application 【发布时间】:2019-08-19 02:16:54 【问题描述】:

我现在有点困惑: 我有一个 Django 应用程序,可以将文件上传到 s3 并在管理面板中生成下载链接,以便在上传后检索文件。 我使用 boto3 来签署上传和下载链接。它在本地一切正常,但是一旦我将它部署到弹性豆茎,下载链接就不再起作用,而且它似乎生成了带有旧歌唱版本的链接。上传仍然有效。

我正在生成这样的链接:

 def downloadUrl(self):
    s3Client = boto3.client('s3')
    bucketName = getattr(settings, "AWS_STORAGE_BUCKET_NAME", None)
    fileurl = s3Client.generate_presigned_url('get_object', Params='Bucket': bucketName, 'Key': self.url.split(bucketName + '/')[1],
                                    ExpiresIn=100)
    return format_html("<a href='url'>url</a>", url=fileurl)

有趣的是它在本地工作并且生成的链接不同:

本地链接:

https://bucketname.s3.amazonaws.com/uploads/something/zips/2019/03/28/App%20Beschreibung.pdf.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJNND443OXASGOY2Q%2F201330328%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20190328T101414Z&X-Amz-Expires=100&X-Amz-SignedHeaders=host&X-Amz-Signature=4fe4d31dc1fd1f772217656654025b669513597c3f91f857fb722ff63a6c0194

由 Elastic Beanstalk 部署生成的链接:

https://bucketname.s3.amazonaws.com/uploads/something/zips/2019/03/28/App%20Beschreibung.pdf.zip?AWSAccessKeyId=ASIA2K3XQKDHVDBX3GWN&Signature=w%2FWRh6tf%2Ba7k91Odop3ly9gEJDw%3D&x-amz-security-token=AgoJb3JpZ2luX2VjEHIaDGV1LWNlbnRyYWwtMSJIMEYCIQD7hU0fX24bksIM3vlQxZjYeje2sDm%2FQeeFQqUt7MwDpQIhAIozM1i1%2FmGK2Xo0RXmR7UWAB2FRPdkQy3aBOisS3BzuKuADCCsQABoMNzEwNTMwODQ2OTI3IgxfJIvFGgD5WL6TwccqvQO1Bsri%2FTmpvaARkFA%2BOnhLRUv9FFfdFf6H8W4IY38OI6CWzvct%2BgmE14D06GHaCh65wKH%2BhR9ZT3V18sW9U4RM%2FpS64hESmC8SUerzpPv9RmuXgA8hQl%2BwRJaTFLGFRFrHdHFoeJAeLIKjK2B7lDjLzNALtvegnLrBYoBtT0Ga2a7CC7avWMevvQ0jAjuSMiEOS4FjXNwHInkb%2FCrX3EXk2Me9OaufICHGH0ZTN2WNAGtOPsY15YJyLf0WgDl7SxVLuAnA4nUzeMglsdaL9ZbUlsdleJtHTQefNqCXXsm4FIup%2Fe%2FNFkn9g7XDH9%2F9IXW%2FNZyBAtfrRoPmDwvv0KpeYPpRpkVKBa5TxQU1c6ei3AiHnIQZRdO5oEqW47qv9hM8%2Fw9U9VlDqyUy5BKbGnv7GTLCdh4%2FwcYEnlfgr8QdK%2BJzyQYdgpMYqw3hj%2FTDW8mJVI9AD3RpHnD0XwIL3BBH5fUgcNZm2vGLG5nOcav7u2YaeqdFiY95SkdL5C8CLv%2BRLYABXyAbeWPUtFzgTtdUFFlv5epAQO2cPOD%2BM3V%2BjhfTQa4WUSIRCwUpSQg3dahIvV75cbKdsdZ7bL1tRMIqz8uQFOrMBC7isGac1kJ0TqHMbiQ77QauekC9c1gy6wgnKu9enc2x4VvyhClhvTvmEFm5NW3CmU5LIXf9V4Df9ML7Mf3Nf2uhuAhQdTKoAIGPiVWz%2FB3Lh%2F58%2FLbRbIRNgWk6IDg88dzgevitkXSC0OokmpB3qbBj%2BGXjIHttHqdBKnjG22aud3wrMk6YxH8b0CfelmcN5vHykpMYgdfgNHvFKrea417ozh5CLfZ9PYQoug0iqsm9nqoU%3D&Expires=1553768535

您可以看到签名不同,但我不明白为什么。我还检查了是否在 EB 上运行了不同的版本,但它与本地版本相同,我下载了 zip 并在本地运行它,它可以工作。

【问题讨论】:

【参考方案1】:

我现在发现了问题所在: 我忘记为 boto 库设置 S3 访问密钥和密钥的环境变量没有生成链接的有效凭据。但是,错误消息非常具有误导性。然后我在弹性 beanstalk 控制台中设置变量,它立即工作。

【讨论】:

以上是关于Boto3 使用 django 应用程序在本地和弹性 beantalk 上生成不同的链接的主要内容,如果未能解决你的问题,请参考以下文章

无法在本地和 lambda 上找到 boto3.client 的凭据

如何使用 boto3 在 Beanstalk 上运行的应用程序中验证会话

如何使用boto3在Beanstalk上运行的应用程序中验证会话

AWS Sagemaker boto3 - 通过端点预测与在本地运行模型获得不同的预测

使用boto3批量上传图片到S3

AWS ECS Docker 容器 Boto3 IAM 权限