【问题标题】:serverless lambda function with dynamodb connect issue带有 dynamodb 连接问题的无服务器 lambda 函数
【发布时间】:2018-05-25 17:07:25
【问题描述】:

我正在使用无服务器框架来编写 AWS lambda 函数。我需要从 HTML 页面获取表单数据并使用 AWS lambda 将其保存到 Dynamodb。所以我也在 nodejs 和 API 端点中编写了代码。最后,我将应用程序部署到 AWS。因此,当我尝试同时使用 CURL 和 Postman 发布数据时,它会显示“内部服务器错误”

以下是相关代码sn-ps。

handler.js

const params = {
    TableName: process.env.DYNAMODB_TABLE,
    Item: {
      id: uuid.v1(),
      name: data.name,
      phone: data.phone,
      checked: false,
      createdAt: timestamp,
      updatedAt: timestamp,
    },
  };

serverless.yml

provider:
  name: aws
  runtime: nodejs6.10
  environment:
    DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"

我不确定在哪里定义 Dynamo 表名称,以及它是否是在自动运行代码时创建的?我关注了这个 github repo - https://github.com/serverless/examples/tree/master/aws-node-rest-api-with-dynamodb

【问题讨论】:

  • CloudWatch 上显示的错误是什么?
  • 这个错误可能是因为你还没有创建DynamoDB表。

标签: node.js aws-lambda aws-sdk serverless


【解决方案1】:

您当前的serverless.yml 没有为您定义和创建 DynamoDB 表。

您可以通过在serverless 配置的resources 部分中定义它来做到这一点。

provider:
  name: aws
  runtime: nodejs6.10
  environment:
    DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage}-phones
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: arn:aws:dynamodb:*:*:*


resources:
  Resources:
    phonesTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:service}-${opt:stage, self:provider.stage}-phones
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1

参考: https://serverless.com/framework/docs/providers/aws/guide/resources/

【讨论】:

  • 所以你已经定义了phonesTable。这是我应该在 dynamodb 中创建的表吗?这是特定格式吗?我创建为 formdata_table
  • 这意味着什么资源:arn:aws:dynamodb:*:*:*?我已将其定义为“arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}”
  • 我的是指您的账户拥有的任何 DynamoDB 表。如果适合你,你可以更具体地喜欢你使用的东西。在大多数情况下,您不必那么具体。
  • 这意味着它正在动态创建数据库?
  • 此表是在您的下一个sls deploy 创建的。在您成功部署时,serverless 会知道您没有更改任何内容,因此不会重新创建它。
猜你喜欢
  • 2021-01-20
  • 2021-10-07
  • 2016-09-17
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多