【问题标题】:The Lambda function associated with the CloudFront distribution is invalid or doesn't have the required permissions与 CloudFront 分配关联的 Lambda 函数无效或没有所需的权限
【发布时间】:2021-06-11 18:17:51
【问题描述】:

所以作为一个借口,我几乎不知道该怎么做。我研究了大约两个小时,通常我会继续前进,但我发现的信息都没有用。我怀疑这与 YAML (serverless.yml) 文件有关,但我不确定。我已经对文件进行了几次更新,因此我将发布初始代码和当前代码,尽管没有任何区别。该代码在开发中完美运行,但在生产中引发错误。你可以看到https://www.evote.space 来复制这个。

当前

myNextApplication:
  service: myService
  component: "@sls-next/serverless-component@1.18.0"
  provider:
    name: aws
    runtime: nodejs12.x
    stage: dev
    profile: evote
    iam:
    role: rolenamegoesherebutnotonstackoverflow
  inputs:
    domain: "evote.space"
  functions:
    createuser:
      handler: data.createuser
    readTable:
      handler: data.readTable
  resources:
    Resources:
      usersTable:
        Type: AWS::DynamoDB::Table
        Properties:
          TableName: Users
          AttributeDefinitions:
          - AttributeName: userHash
            AttributeType: N
          KeySchema:
          - AttributeName: userHash
            KeyType: HASH
      votersTable:
        Type: AWS::DynamoDB::Table
        Properties:
          TableName: Voters
          AttributeDefinitions:
          - AttributeName: voterHash
            AttributeType: N
          KeySchema:
          - AttributeName: voterHash
            KeyType: HASH
      electionsTable:
        Type: AWS::DynamoDB::Table
        Properties:
          TableName: Elections
          AttributeDefinitions:
          - AttributeName: electionHash
            AttributeType: N
          KeySchema:
          - AttributeName: electionHash
            KeyType: HASH
      ballotsTable:
        Type: AWS::DynamoDB::Table
        Properties:
          TableName: Ballots
          AttributeDefinitions:
          - AttributeName: ballotHash
            AttributeType: N
          KeySchema:
          - AttributeName: ballotHash
            KeyType: HASH

初始(首次部署时出错)

myNextApplication:
  service: myService
  component: "@sls-next/serverless-component@1.18.0"
  provider:
    name: aws
    runtime: nodejs12.x
    stage: dev
    profile: evote
  inputs:
    domain: "evote.space"

我的代码库非常庞大,由许多页面和组件组成。到目前为止,我所做的只是一个登录功能,但在注册页面上,它调用 api 来返回用户(用于重复电子邮件验证),它返回我们非常熟悉的错误“JSON 中的意外令牌

503 错误 无法满足请求。 与 CloudFront 分配关联的 Lambda 函数无效或没有所需的权限。我们目前无法连接到此应用或网站的服务器。可能有太多流量或配置错误。请稍后再试,或联系应用或网站所有者。 如果您通过 CloudFront 向客户提供内容,则可以通过查看 CloudFront 文档找到解决问题的步骤并帮助防止出现此错误。 由云端(CloudFront)生成 请求 ID:No0_qVJ3gcOpg48rMXqvgyipx4wKWmV-hRewQblZ-loyaaiVJLqGIA==

是的,如果你能帮忙,请帮忙。

编辑: 导致问题的代码如下块

NewUser.getInitialProps = async ({ req }) => {
  if (req) {
    // this is server side
    return {
      users: await data.readTable("Users")
    };
  } else {
    // we are client side
    const response = await fetch("/api/users");
    return { users: await response.json() };
  }
};

处理这个的 api 原来是这样的:

import data from "../../../data"

export default async (req, res) => {
  console.log("/api/users HIT!");
  res.status(200).json(await data.readTable("Users"));
};

但我更改了它以便可以将其标记为 lambda,所以现在它看起来像这样(尽管它没有区别):

import data from "../../../data";

module.exports.read = async (event, context, callback) => {
  console.log("/api/users HIT!");
  callback(null, {statusCode: 200}).json(await data.readTable("Users"));
}

【问题讨论】:

    标签: aws-lambda amazon-cloudfront serverless-framework serverless


    【解决方案1】:

    因此,经过仔细研究,我做了以下事情,这显然是一个很常见的问题,所以我建议其他遭受此问题的人完全按照以下方式进行操作。请记住,这与 serverless-nextjs 组件有关,而不仅仅是 serverless 框架,尽管同样适用于那里:

    1. 我仔细阅读了存储库 README 并遵循了所有说明。
    2. 我登录 AWS 控制台,发现我认为是主要问题,但实际上是第三个问题; Lambda@Edge 仅配置了基本的 CloudWatch 日志记录权限。我在确保最佳做法的同时使用所有必要的权限对其进行了更新
    3. 更新 Lambda 后,确保将其部署到 Lambda@Edge(在操作菜单下)
    4. 然后我导航到 CloudWatch 并检查正确区域中的日志,并在调用 API 后发现错误。
    5. 不知何故,我的 DynamoDB 表被删除或未正确复制,因此我使用 npm run infra 及之后从我的 SDK 重新部署它们。

    这种体验总是很好的。对于代码中的真正愚蠢的错误,您绝不是无敌的。 99% 的情况下,如果您陷入困境并认为它很复杂,并且认为修复它是不现实的,请退后一步问:“这可能是最愚蠢的事情是什么?”

    而且总是这样。

    【讨论】:

    • 您好,您能否扩展一下“我在确保最佳实践的同时使用所有必要的权限对其进行了更新”...对您添加的权限有何建议?
    • @EugeneAnanin 当然,抱歉这么晚了,但希望它对其他人有所帮助,我使用反映最佳实践的特权对其进行了更新,这意味着我创建了确保我有权编辑和更新表格的策略但只有那张桌子。最佳实践政策提供访问权限而不会超出范围。
    【解决方案2】:

    对我来说,使用 Alpha 版本的 Serverless,解决了这个错误信息 '与 CloudFront 分配关联的 Lambda 函数无效或没有所需的权限'

    serverless.yml 文件:

    # component: "@sls-next/serverless-component@1.19.0"
    component: "@sls-next/serverless-component@3.4.0-alpha.12"
    

    我们可以在这里找到最新版本:https://www.npmjs.com/package/@sls-next/serverless-component

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 2018-03-16
      • 2019-05-11
      • 2017-04-03
      • 1970-01-01
      • 2021-07-22
      • 2018-10-28
      • 2020-09-29
      • 2017-06-08
      相关资源
      最近更新 更多