运行放大模拟时无法访问 DynamoDB 主机

Posted

技术标签:

【中文标题】运行放大模拟时无法访问 DynamoDB 主机【英文标题】:Inaccessible DynamoDB host when running amplify mock 【发布时间】:2020-03-11 23:59:26 【问题描述】:

我正在使用 AWS Amplify 设置 AppSync GraphQL API。我有一个带有 @model 注释的模式,我正在尝试编写一个 lambda 解析器,它将读取/写入 @model 生成的 DynamoDB 表。但是,当我尝试使用 amplify mock 在本地进行测试时,我的 JS 函数会抛出

error  UnknownEndpoint: Inaccessible host: `dynamodb.us-east-1-fake.amazonaws.com'. This service may not be available in the `us-east-1-fake' region.

我似乎根本找不到关于这个用例的太多文档(大多数 lambda 解析器示例都是从不属于放大应用程序的其他表/API 中读取的),因此任何指针都值得赞赏。是否支持运行这种类型的设置,还是我必须推送到 AWS 才能进行测试?

【问题讨论】:

我不建议不要在本地尝试。架构是否适用于“放大推送”? 【参考方案1】:

新答案:

Amplify 现在有关于这个用例的文档:https://docs.amplify.aws/cli/usage/mock#connecting-to-a-mock-model-table

您可以为模拟设置环境变量,将模拟 lambda 中的 DDB 客户端指向本地 DDB 实例

================================================ =======================

原答案:

在深入研究了 Amplify CLI 代码后,我找到了一个现在可以使用的解决方案。

Here 是 amplify mock 初始化 DynamoDB Local 的位置。如您所见,它没有设置--sharedDb 标志,based on the docs 意味着创建的数据库文件将以请求的访问密钥ID 为前缀,然后是区域。来自 Amplify 的请求的访问密钥 ID 将是“假的”,并且该区域是“us-fake-1”,如定义 here。此外,Amplify 启动的 DynamoDB Local 实例的端口是 62224 定义的here。

因此,要连接到由 Amplify 创建的表,需要以下 DynamoDB 配置

const ddb = new AWS.DynamoDB(
  region: 'us-fake-1',
  endpoint: "http://172.16.123.1:62224/",
  accessKeyId: "fake",
  secretAccessKey: "fake"
)

如果您想将 AWS CLI 与 Amplify 创建的表一起使用,您必须使用上面的区域和访问密钥创建一个新的配置文件。

我仍然需要做一些额外的工作来找出让这些配置值在本地模拟值和实际值之间切换的好方法,但这暂时解除了对本地测试的阻碍。

至于我的另一个问题,关于“us-east-1-fake”的 AWS::Region 的设置位置,设置为 here,但它似乎没有在其他任何地方使用。即,在运行amplify mock 时将其设置为占位符值,但在其他地方将其用作区域进行本地测试似乎不起作用。

【讨论】:

如果您使用的是生成自己的凭据的 NoSQL 工作台,那么您必须修改答案中引用的 index.js 文件。将--sharedDb选项更改为true,以使其他连接能够访问amplify mock创建的表 @edward-foyle 我们如何添加配置文件并在放大模拟中使用它。我在 ~/.aws/credentials 和 ~/.aws/config 参考配置文件的假区域中添加了假信用。它无法连接到 DynamoDB URL。给出错误: NetworkingError: connect ECONNREFUSED 。有什么建议吗?【参考方案2】:

请尝试以下设置,对我来说效果很好,

const AWS = require('aws-sdk');

// Local
const dynamoDb = new AWS.DynamoDB.DocumentClient(
    region: 'us-fake-1',
    endpoint: "http://localhost:62224/",
    accessKeyId: "fake",
    secretAccessKey: "fake"
);

// Live
// const dynamoDb = new AWS.DynamoDB.DocumentClient();

【讨论】:

【参考方案3】:

您的 dynamodb 主机不正确。 dynamodb.us-east-1-fake 不是有效的主机。请使用真实的 dynamodb 主机名对其进行更新。 如果您在本地运行,请先在 cli 上设置 aws configure。

【讨论】:

我意识到这是一个“假”主机名,但由于我试图在本地使用 DynamoDB,我认为这可能是 Amplify 设置的值。但是,我无法弄清楚它是否正在设置它。我的 team-provider-info.json 文件指定了一个 us-west-2 区域,并且我的 lambda 的 CloudFormation 模板将 AWS::Region 变量作为 DynamoDB 区域传递。我对amplify mock 的理解是签出环境的区域应该用作AWS::Region,但也许不是这样。

以上是关于运行放大模拟时无法访问 DynamoDB 主机的主要内容,如果未能解决你的问题,请参考以下文章

错误:发生网络错误(如超时、连接中断或主机无法访问)

无法使用我的 SAM 应用程序访问 DynamoDB

放大 dynamodb graphql fetch 函数在循环中无限运行

使用 DynamoDB 和 Graal 自定义运行时的 Micronaut 无服务器应用程序抛出无法构造 com.amazonaws.partitions.model.Partitions 的实例

如何将 DynamoDB 细粒度访问控制与 Cognito 用户池结合使用?

Docker 容器无法访问 DNS 但无法解析主机