【问题标题】:AWS SAM CLI cannot access Dynamo DB when function is invoked locally在本地调用函数时,AWS SAM CLI 无法访问 Dynamo DB
【发布时间】:2020-09-16 12:55:40
【问题描述】:

我正在使用 aws-sam-cli 构建 AWS lambda。在函数中,我想访问某个 DynamoDB 表。 我的问题是,当我使用 sam local invoke 命令在本地调用该函数时,该函数返回此错误:ResourceNotFoundException: Requested resource not found

const axios = require('axios')
const AWS = require('aws-sdk')
AWS.config.update({region: <MY REGION>})
const dynamo = new AWS.DynamoDB.DocumentClient()

exports.handler = async (event) => {
  const scanParams = {
    TableName: 'example-table'
  }
  const scanResult = await dynamo.scan(scanParams).promise().catch((error) => {
    console.log(`Scan error: ${error}`)
    // => Scan error: ResourceNotFoundException: Requested resource not found
  })

  console.log(scanResult)
}

但是,如果我实际上将其 sam deploy 发送到 AWS 并在实际的 Lambda 控制台中对其进行测试,它会正确记录表信息。

{
  Items: <TABLE ITEMS>,
  Count: 1,
  ScannedCount: 1
}

这是预期的行为吗?或者我需要做一些额外的配置才能让它在本地工作吗?我的template.yaml 看起来像这样:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: 'Example SAM stack'
Resources:
  ExampleFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs12.x
      Policies:
      - DynamoDBCrudPolicy:
          TableName: 'example-table'

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-dynamodb aws-sam-cli


    【解决方案1】:

    我相信当您在本地调用 Lambda 时,SAM 无法识别用于远程资源的配置文件,例如:DynamoDB

    尝试为您的远程 dynamoDB 传递凭据配置文件

    例如:

    sam local invoke --profile default
    

    您可以在此处查看命令文档:https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-invoke.html

    【讨论】:

    • 非常感谢!我一直很困惑,因为 sam local invokeAWS_PROFILE=default 环境变量也不起作用。您的解决方案效果很好。
    • 这对我不起作用。仍然找不到sam local invoke sacribe50AAC574 --no-event --profile default --region us-east-1 的资源。 @reesaspieces 你能告诉我你使用的完整命令吗?
    • @55Cancri 这是我使用的:sam local invoke MyFunctionName --no-event --env-vars env.json --profile default。所以它似乎和你的一样:/你是否将函数部署到实际的 Lambda 控制台,看看你是否可以在那里访问 DynamoDB?
    • @55Cancri 话虽如此,如果您按照@me2resh 的回答指定配置文件,您还可以从本地 lambda 中访问真正的 DynamoDB(不是 DynamoDB Local)。在这种情况下,您不应将端点指定为 'http://docker.for.mac.localhost:8000'
    • 非常感谢,这解决了我的问题。我从不想使用本地 dynamodb,我只是认为 docker url 是必要的。你是对的,我只需要使用--profile default。我面临的问题是--env-vars env.json。如果文件不在运行命令的目录中,Sam 会静默失败。我使用 tableName 作为环境变量连接到 dynamodb。硬编码名称显示我可以连接到 dynamodb,只是环境变量未正确初始化。希望这可以为其他人节省数周的麻烦。
    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 2020-09-05
    • 2019-04-18
    • 2021-05-26
    • 2021-07-02
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多