无法将CloudFront添加为Lambda函数的触发器。

15

您好,我按照该说明尝试使用 CloudFront 和 lambda@edge 调整图像大小。但在测试调整大小后的图片时,一直收到以下错误消息:

与 CloudFront 分发关联的 Lambda 函数无效或没有所需权限。

因此,我检查了文章提供的 cloud formation 创建的 lambda 函数,并发现其中没有触发器。

输入图像描述

我尝试手动设置,但是收到以下错误消息:

CloudFront 事件无法与 $LATEST 或 Alias 关联。选择“操作”以发布函数的新版本,然后重试关联操作。

我按照错误消息中的说明操作,发布并将 CloudFront 添加为触发器,但似乎无法应用它。它仍然在运行不带 CloudFront 触发器的函数版本。

我如何将此版本应用为我的 Lambda 服务?

有没有办法将Cloudfront设置为触发器并使其正常工作?


在CloudFront控制台中,您在分发的“行为”选项卡中看到什么?您可以在那里更新函数的ARN以使用Lambda的最新版本(3)。 - Laurent Jalbert Simard
@LaurentJalbertSimard,事实证明这是存储桶策略的问题。我会将答案粘贴为回复。 - Dayo Choul
4
Lambda@edge是一个糟糕的工具,函数几乎无法进行调试,即使部署了数十个边缘函数,我仍然没有一个能够正常工作,通常情况相反。我目前遇到了这个错误。直接调用函数没有任何问题。尽管指标中记录了我的访问情况,但Cloudwatch日志条目为零。 - Cory Mawhorter
8个回答

28
针对那些搜索“与CloudFront分发相关联的Lambda函数无效或没有所需的权限”的人:
我遇到了这个错误,费了很大劲才解决。结果发现我的Lambda中有一些编程错误需要解决。但是,如果每次访问Cloudfront时都出现“与CloudFront分发相关联的Lambda函数无效或没有所需的权限”怎么调试呢?而且,Cloudwatch日志中没有任何内容。
我的Lambda在Cloudformation中定义,位于AWS :: Lambda :: Function's ZipFile属性中。最终,我前往AWS内部的Lambda服务,并创建了一个Lambda测试负载,对应于此处记录的我的Cloudfront事件:Lambda@Edge Event Structure。然后,我可以在Lambda控制台内调试Lambda,而无需访问Cloudfront或导航到Cloudwatch日志。

14

我看到有一些人声称问题的根本原因不是权限问题,而是代码问题。这很可能是正确的根本原因。CloudFront 倾向于对所有东西都使用 403 错误,即使基本的 404 在大多数情况下也会显示为 403。

我还看到了一些上面的评论声称您找不到与 lambda 中的错误相关联的日志。我认为这最有可能是因为您在 us-east-1 上查找日志,并且不住在美国东海岸。日志将位于执行它们的本地区域。因此,请选择距离您所在位置最近的区域,您很可能会在那里找到日志组。


4
阅读这篇文章是因为你们在寻找我们在us-east-1的日志,这让我感到非常惊讶。这是Cloudfront,日志将会在你最接近的地区。Jason提供了很好的建议。 - James Roland

9

对于其他遭受AWS博客开发文章质量不佳的人们,我发现这是由于错误的S3存储桶策略导致的。文章中说:

ImageBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref ImageBucket
      PolicyDocument:
        Statement:
            - Action:
                - s3:GetObject
              Effect: Allow
              Principal: "*"
              Resource: !Sub arn:aws:s3:::${ImageBucket}/*
            - Action:
                - s3:PutObject
              Effect: Allow
              Principal:
                AWS: !GetAtt EdgeLambdaRole.Arn
              Resource: !Sub arn:aws:s3:::${ImageBucket}/*
            - Action:
                - s3:GetObject
              Effect: Allow
              Principal:
                AWS: !GetAtt EdgeLambdaRole.Arn
              Resource: !Sub arn:aws:s3:::${ImageBucket}/*

原来,除了GetObject和PutObject之外,您还需要授予权限以允许其他操作,因为它需要在存储桶中创建文件夹。只需将其更改为s3:*即可解决问题。


我正在按照同一篇博客文章进行一些修改。感谢您指出这一点,我已经让它工作了。 ;) - Anderson Fernandes Silva
我还必须增加调整大小函数的超时时间。 - Anderson Fernandes Silva
你如何在AWS Amplify中解决这个问题? - Jimmy.B
@Jimmy.B,您是如何修复Amplify的问题的? - rashidnk
还没有 @rashidnk,我目前正在与AWS支持人员讨论这个问题。 - Jimmy.B
你是否遇到了这个错误:与CloudFront分发相关联的Lambda函数无效或没有所需的权限? - rashidnk

7

对于我来说,Lambda屏幕上缺失的云前触发器是因为我不在us-east-1地区。


我也有同样的问题,我永远都不会想到这可能是原因。非常感谢。 - artemisian

3

我遇到了同样的错误消息,但在 CloudWatch 中没有日志。我最终发现我的 Python 运行时处理程序是 index.handler,而我的 index.py 定义了 lambda_handler。将 Python 运行时处理程序更改为 index.lambda_handler 后,错误消失了。希望对你有帮助。


2
如果您通过谷歌搜索“与CloudFront分发相关联的Lambda函数无效或没有所需权限”,则可能是因为您的函数在云形成中未正确连接。例如,给定yaml:
Code: ./src/ # or CodeUri ./src/
Handler: foo.bar

请仔细检查 ./src/foo.js 是否有 exports.bar = function...


1
当我将Lambda函数触发器中的“包括正文”从“是”更改为“否”时,它开始工作。
我不得不删除并重新创建CloudFront触发器以更改该设置。

0

刚刚在这里读了一篇文章。

如果您在一个区域创建了一个 Lambda 并将其与 CloudFront 一起使用(稍后由其他边缘区域的用户请求),则问题是由于 Lambda 没有足够的 CloudWatch 日志权限引起的。

请检查此问题,所有信用归作者所有。

https://dev.to/aws-builders/authorizing-requests-with-lambdaedge-mjm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接