首页 > 解决方案 > 预签名 CloudFront URL 上的 AWS Lambda 访问被拒绝

问题描述

我按照https://docs.aws.amazon.com/solutions/latest/serverless-image-handler/deployment.html中的指南在我的 CloudFront 分配上创建一个新的 Lambda 函数。但是,我有一个额外的要求,只能使用预签名的 URL。这个想法是我的服务生成CloudFront pre-signed URL并将该 URL 提供给客户端以访问它。但是,客户端应该能够在该 URL 上调用 Lambda 函数。

例如以下应该是可能的:

默认情况下,所有这些都有效,但是如果我将Origin Behavior 下的Restrict Viewer Access (Use Signed URLs or Signed Cookies)选项设置为Yes,那么突然对我的 Lambda 函数的任何调用都会返回Access Denied响应。

我的 Lambda 函数正在使用的角色的 IAM 策略

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::myBucket/*"
        }
    ]
}

桶策略

    {
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EN2PJ6YY7V8EE"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::myBucket/*"
        },
        {
            "Sid": "2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E2EM2OLBKAK85T"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::myBucket/*"
        }
    ]
}

如何将预签名 URL 与 Lambda 一起使用?

标签: amazon-web-servicesamazon-s3aws-lambda

解决方案


推荐阅读