当前位置: 首页 > 知识库问答 >
问题:

将AWS SAM本地与docker中的dynamodb连接

钱青青
2023-03-14

我已经使用aws sam local设置了一个api网关/aws lambda对,并确认运行后可以成功调用它

sam本地启动api

然后,我在docker容器中添加了一个本地Dynamodb实例,并使用aws cli在其上创建了一个表

但是,在将代码添加到lambda以写入我收到的Dynamodb实例之后:

2018-02-22T11:13:16.172Z ed9ab38e-fb54-18a4-0852-db7e5b56c8cd错误:无法写入表:{“消息”:“连接经济恢复0.0.0.0:8000”,“代码”:“网络错误”,“错误号”:“经济恢复”,“系统调用”:“连接”,“地址”:“0.0.0.0”,“端口”:8000,“区域”:“eu west-2”,“主机名”:“0.0.0.0”,“可恢复的”:true,“时间”:“2018-02-22T11:16:5Z”}从以下命令写入事件:{“名称”:“测试”,“地理位置”:“xyz”,“类型”:“createDestination”}结束请求ID:ed9ab38e-fb54-18a4-0852-db7e5b56c8cd

我在网上看到,您可能需要连接到同一个docker网络,因此我创建了一个网络docker网络create lambda local,并将我的start命令更改为:

sam本地启动-api--docker网络lambda本地

docker run-v“$PWD”:/dynamodb_local_db-p 8000:8000——网络=lambda local cnadiminti/dynamodb local:latest

但仍然收到相同的错误

sam local正在打印连接容器98B19370AB92F3378CE380E9C840177905A49FC986597FEF9EF589E624BEAC3到网络lambda local的2018/02/22 11:12:51

我正在使用以下创建动态客户端:

const AWS = require('aws-sdk')
const dynamodbURL = process.env.dynamodbURL || 'http://0.0.0.0:8000'
const awsAccessKeyId = process.env.AWS_ACCESS_KEY_ID || '1234567'
const awsAccessKey = process.env.AWS_SECRET_ACCESS_KEY || '7654321'
const awsRegion = process.env.AWS_REGION || 'eu-west-2'

console.log(awsRegion, 'initialising dynamodb in region: ')

let dynamoDbClient
const makeClient = () => {
  dynamoDbClient = new AWS.DynamoDB.DocumentClient({
    endpoint: dynamodbURL,
    accessKeyId: awsAccessKeyId,
    secretAccessKey: awsAccessKey,
    region: awsRegion
  })
  return dynamoDbClient
}

module.exports = {
  connect: () => dynamoDbClient || makeClient()
}

检查我的代码正在创建的dynamodbclient

DocumentClient {
  options:
   { endpoint: 'http://0.0.0.0:8000',
     accessKeyId: 'my-key',
     secretAccessKey: 'my-secret',
     region: 'eu-west-2',
     attrValue: 'S8' },
  service:
   Service {
     config:
      Config {
        credentials: [Object],
        credentialProvider: [Object],
        region: 'eu-west-2',
        logger: null,
        apiVersions: {},
        apiVersion: null,
        endpoint: 'http://0.0.0.0:8000',
        httpOptions: [Object],
        maxRetries: undefined,
        maxRedirects: 10,
        paramValidation: true,
        sslEnabled: true,
        s3ForcePathStyle: false,
        s3BucketEndpoint: false,
        s3DisableBodySigning: true,
        computeChecksums: true,
        convertResponseTypes: true,
        correctClockSkew: false,
        customUserAgent: null,
        dynamoDbCrc32: true,
        systemClockOffset: 0,
        signatureVersion: null,
        signatureCache: true,
        retryDelayOptions: {},
        useAccelerateEndpoint: false,
        accessKeyId: 'my-key',
        secretAccessKey: 'my-secret' },
     endpoint:
      Endpoint {
        protocol: 'http:',
        host: '0.0.0.0:8000',
        port: 8000,
        hostname: '0.0.0.0',
        pathname: '/',
        path: '/',
        href: 'http://0.0.0.0:8000/' },
     _clientId: 1 },
  attrValue: 'S8' }

这个设置应该工作吗?我如何让他们互相交谈?

----编辑----

根据twitter对话,值得一提的是(也许)我可以在CLI和webshell中与dynamodb交互


共有3个答案

苏磊
2023-03-14

其他答案对我来说太复杂/不清楚了。这是我想出来的。

docker-compose.yml

请注意网络名称abp sam backend、服务名称dynamo,并且dynamo服务正在使用backend网络。

version: '3.5'

services:
  dynamo:
    container_name: abp-sam-nestjs-dynamodb
    image: amazon/dynamodb-local
    networks:
      - backend
    ports:
      - '8000:8000'
    volumes:
      - dynamodata:/home/dynamodblocal
    working_dir: /home/dynamodblocal
    command: '-jar DynamoDBLocal.jar -sharedDb -dbPath .'

networks:
  backend:
    name: abp-sam-backend

volumes:
  dynamodata: {}

通过以下方式启动DyanmoDB本地容器:

docker-组成-d发电机

import { DynamoDB, Endpoint } from 'aws-sdk';

const ddb = new DynamoDB({ apiVersion: '2012-08-10' });

if (process.env['AWS_SAM_LOCAL']) {
  ddb.endpoint = new Endpoint('http://dynamo:8000');
} else if ('local' == process.env['APP_STAGE']) {
  // Use this when running code directly via node. Much faster iterations than using sam local
  ddb.endpoint = new Endpoint('http://localhost:8000');
}

请注意,我使用的是主机名别名dynamo。这个别名是docker在abp sam后端网络中为我自动创建的。别名只是服务名称。

sam local start-api -t sam-template.yml --docker-network abp-sam-backend --skip-pull-image --profile default --parameter-overrides 'ParameterKey=StageName,ParameterValue=local ParameterKey=DDBTableName,ParameterValue=local-SingleTable' 

请注意,我告诉sam local使用我的docker compose.yml中定义的现有网络abp sam backend

我制作了一个工作示例(加上一系列其他功能),可以在https://github.com/rynop/abp-sam-nestjs

宋鸿云
2023-03-14

如果您在mac上使用sam local,就像许多开发人员一样,您应该能够只使用

options.endpoint=”http://docker.for.mac.localhost:8000“

或者在docker的较新安装上https://docs.docker.com/docker-for-mac/release-notes/#docker-community-edition-18030-ce-mac59-2018-03-26

options.endpoint="http://host.docker.internal:8000"

而不是像Paul在上面展示的那样必须执行多个命令(但这可能更不确定平台?)。

颛孙飞鸾
2023-03-14

非常感谢Heitor Lessa,他在推特上回答了我一个回购的例子

这让我找到了答案。。。

>

  • Dynamodb的docker容器从我的机器的上下文127.0.0.1(这就是为什么我可以与它交互)

    SAM local的docker容器位于我的机器上下文中的127.0.0.1上

    但他们并不127.0.0.1彼此的背景

    所以:https://github.com/heitorlessa/sam-local-python-hot-reloading/blob/master/users/users.py#L14

    指示我将连接代码更改为:

    const AWS = require('aws-sdk')
    const awsRegion = process.env.AWS_REGION || 'eu-west-2'
    
    let dynamoDbClient
    const makeClient = () => {
      const options = {
        region: awsRegion
      }
      if(process.env.AWS_SAM_LOCAL) {
        options.endpoint = 'http://dynamodb:8000'
      }
      dynamoDbClient = new AWS.DynamoDB.DocumentClient(options)
      return dynamoDbClient
    }
    
    module.exports = {
      connect: () => dynamoDbClient || makeClient()
    }
    

    重要的几行是:

    if(process.env.AWS_SAM_LOCAL) {
      options.endpoint = 'http://dynamodb:8000'
    }
    

    从SAM本地docker容器的上下文中,dynamodb容器通过其名称公开

    我的两个启动命令最终是:

    docker run-d-v"$PWD":/dynamodb_local_db-p 8000:8000----------------------------------------------------------------------------------------------------------

    AWS_REGION=eu-West-2 sam本地启动-api-docker-Network lambda-本地

    这里唯一的改变是为dynamodb容器命名

  •  类似资料:
    • 尽管Amazon提供了关于如何使用Java、PHP和.Net连接到dynamoDB local的文档,但没有描述如何使用Python连接到localhost:8000。web上的现有文档指向在boto.dynamodb2.layer1中使用dynamoDB连接方法,但这会在使用boto3协议管理dynamoDB的实时和测试环境之间造成不兼容。 在boto3中,您可以使用以下构造函数和设置到环境中的

    • 我必须将我的Spring客户端与Elasticsearch连接,Elasticsearch的图像已由Elastic在Docker Hub中的官方ES 2.4.6图像拍摄,但当我尝试运行容器时,Docker控制台向我报告以下错误: [Glitch]无法连接到节点[{{transport}-1}{localhost}{127.0.0.1:9300}],已从节点列表中删除 应用程序。我的Spring项目

    • 我试图在我本地的电脑上使用kafka(Windows10)作为生产者,在docker容器(ubuntu)上使用spark流作为消费者。我的示例在容器中一起工作,但我需要在本地计算机上创建流。 在容器的另一边,我正在监听端口2181来接收流。 我希望你能帮助我。谢了。

    • 问题内容: 通过我能够运行该应用程序。现在,我们想将应用程序移至生产环境,但是我们不想使用容器数据库。那么有什么办法可以使我的本地MySQL数据库与使用的应用程序连接吗? 我的docker-compose.yml看起来像: 我只想连接到本地托管的数据库,而不是一部分。 问题答案: 在docker网络中找到主机IP。如果您使用docker-compose.yml ,则该IP可能是:, 但请确认它 搜

    • 我正在运行Docker容器,其中运行一个jar文件。 此jar文件需要访问Elasticsearch以读取数据,并且此Elasticsearch服务安装在本地计算机上(不在Docker容器中) 我需要从Docker容器连接到本地Elasticsearch服务以使其正常工作 我在Dockerfile中写了EXPOSE 9200 9300 service-port,我的Docker run命令如下,

    • 我目前使用Amazon/Dynamodb-local映像在Docker容器中运行Dynamodb-local。 容器启动,我可以通过AWS CLI手动创建必要的表。 然而,在这一点上,我需要在容器初始启动时创建表。 如果我使用dockerfile,我认为我需要创建一个具有以下内容的映像:-Python(用于使用PIP安装AWS CLI)-PIP-AWS CLI-DynamoDB Local 我还可