amazon-web-services - 预签名 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 函数。
例如以下应该是可能的:
- 服务返回 URL
https://dfg565mo4z0svb.cloudfront.net/portrait.jpeg?Expires=1540724061&Signature=VLfwYdHrLM91wzFyOg0S3C6PKkKWghfOiZzt1-ew~gt0HPK~Sap0~5PHVHCEDHgHIQfwb0~oAZQ1igOOiRigzMTQ-ew~uSIR7-dsd~QJlAuceO5f2cDB2hopC5~trEgRTMnQSozPlbrFSwthveVBlZPVI3s2YapZgC7pqZB08IKIYtcXKjRfMPkxgumV5P-~Dj7rK5fdfvLyvTUTxIwrt3WLndOydBjxxUsL-6D-Hkdz8uWi6u59-sg__&Key-Pair-Id=BPKDVBLKFPWSDLIAXN8I
- 客户端应该能够像这样调用 Lambda:
https://dfg565mo4z0svb.cloudfront.net/fit-in/100x100/portrait.jpeg?Expires=1540724061&Signature=VLfwYdHrLM91wzFyOg0S3C6PKkKWghfOiZzt1-ew~gt0HPK~Sap0~5PHVHCEDHgHIQfwb0~oAZQ1igOOiRigzMTQ-ew~uSIR7-dsd~QJlAuceO5f2cDB2hopC5~trEgRTMnQSozPlbrFSwthveVBlZPVI3s2YapZgC7pqZB08IKIYtcXKjRfMPkxgumV5P-~Dj7rK5fdfvLyvTUTxIwrt3WLndOydBjxxUsL-6D-Hkdz8uWi6u59-sg__&Key-Pair-Id=BPKDVBLKFPWSDLIAXN8I
其中/fit-in/100x100/是 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 一起使用?
解决方案
推荐阅读
- r - R 错误:`n()` 只能在 dplyr 动词中使用
- java - 如何为我的导出自定义作业修复此错误?
- jwt - JWT Token .NET Core 身份服务器问题
- python - 在 lambda 语句中使用迭代器
- python - 将日期中的总音量拆分为小时数 python pandas
- r - Plotly-R:如何制作有间隙的 y 轴?
- javascript - 我必须从 Vuejs 中的多个输入中创建一个字符串数组。我该怎么办?
- java - 如何为 JPA 连接设置 ReadTimeout
- apache - 如何使用 Keycloak 保护通过 httpd 公开的静态文件?
- kong - 是否可以使用 kong response-transformation 插件替换正文响应中的 json 属性?