【问题标题】:Why does my pre-signed URL for my s3 bucket look different when deployed?为什么我的 s3 存储桶的预签名 URL 在部署时看起来不同?
【发布时间】:2021-08-29 22:50:47
【问题描述】:

我的 python (Django) 应用程序存储机密文档并在 AWS S3 中有一个私有存储桶。

当您请求资源时,它会使用 boto3 生成一个预签名的 URL,以便能够下载文档。

这样做的代码如下:

@staticmethod
def create_presigned_url(key_name, bucket_name=settings.AWS_PDF_STORAGE_BUCKET_NAME, expiration=60):
    """
    Generate a pre-signed URL to share a PDF.
    :param key_name: string.
    :param bucket_name: string.
    :param expiration: Time in seconds for the pre-signed url to remain valid.
    :return: Pre-signed URL as a string. If error, returns None.
    """
    s3_client = boto3.client('s3')
    try:
        response = s3_client.generate_presigned_url(
            'get_object',
            Params={'Bucket': bucket_name, 'Key': f"pdf/{key_name}"},
            ExpiresIn=expiration
        )
    except ClientError:
        return None

    return response

当我在本地运行我的应用程序时,它运行良好。它会生成一个链接,我可以用它来下载文档,并在 60 秒后过期。这样的 URL 如下所示:

https://BUCKETNAME.s3.amazonaws.com/pdf/testuser1/dummy.pdf?AWSAccessKeyId=ACCESSKEY&Signature=SIGNATURE&Expires=EXPIRATION"

然后我将我的应用程序部署到 AWS Elastic Beanstalk。配置了具有 AWS 机密的所有相同环境变量。但是当我运行相同的请求时,我会得到一个更长的 URL,如下所示:

https://fiber-staging-pdfs.s3.amazonaws.com/pdf/liza/dummy.pdf?AWSAccessKeyId=ACCESSKEY&Signature=SIGNATURE&x-amz-security-token=TOKEN&Expires=EXPIRATION

不知何故,在此环境下运行相同的代码时添加了x-amz-security-token 参数?为什么?当我尝试访问这个生成的 URL 时,我收到 403 Forbidden 错误。

此存储桶的存储桶策略如下:

{
    "Version": "2012-10-17",
    "Id": "POLICYID",
    "Statement": [
        {
            "Sid": "SID",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNTID:root"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BUCKETNAME/*"
        }
    ]
}

【问题讨论】:

    标签: python django amazon-web-services amazon-s3 boto3


    【解决方案1】:

    您的 EB 实例上的代码使用 instance role 为其提供 AWS 凭证。当您执行此操作时,将使用 x-amz-security-token,这是您使用 IAM 角色时 AWS credentails 的常规部分。

    相比之下,当您在本地运行它时,您使用 IAM 用户获取 AWS 凭证。在这种情况下,不使用令牌。

    【讨论】:

    • 我明白了,谢谢。那么这是否意味着我需要修改 Bucket 策略主体以包含实例角色?
    • @RommelTJ 是的,它应该包括实例角色的 ARN。或者,将 S3 权限添加到实例角色本身。
    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2020-05-25
    • 1970-01-01
    • 2021-09-09
    • 2019-01-30
    • 2019-07-11
    相关资源
    最近更新 更多