44

AWS sam local を使用して api ゲートウェイ/aws ラムダ ペアをセットアップし、実行後に正常に呼び出すことができることを確認しました

sam local start-api

次に、docker コンテナにローカルの dynamodb インスタンスを追加し、aws cli を使用してその上にテーブルを作成しました

しかし、コードをラムダに追加して、受け取った dynamodb インスタンスに書き込みます。

2018-02-22T11:13:16.172Z ed9ab38e-fb54-18a4-0852-db7e5b56c8cd エラー: テーブルに書き込めませんでした: {"message":"connect ECONNREFUSED 0.0.0.0:8000","code":"NetworkingError", "errno":"ECONNREFUSED","syscall":"接続","アドレス":"0.0.0.0","ポート":8000,"地域":"eu-west-2","ホスト名":"0.0 .0.0","re​​tryable":true,"time":"2018-02-22T11:13:16.165Z"} コマンドからの書き込みイベント: {"name":"test","geolocation":"xyz"," type":"createDestination"} END RequestId: ed9ab38e-fb54-18a4-0852-db7e5b56c8cd

同じ docker ネットワークに接続する必要があるかもしれないことをオンラインで見たので、ネットワークを作成しdocker network create lambda-local、開始コマンドを次のように変更しました。

sam local start-api --docker-network lambda-local

docker run -v "$PWD":/dynamodb_local_db -p 8000:8000 --network=lambda-local cnadiminti/dynamodb-local:latest

それでも同じエラーが発生します

サムローカルが印刷されています2018/02/22 11:12:51 Connecting container 98b19370ab92f3378ce380e9c840177905a49fc986597fef9ef589e624b4eac3 to network lambda-local

以下を使用して dynamodbclient を作成しています。

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 および Web シェルで dynamodb を操作できることを (おそらく) 言及する価値があります。

CLI での dynamo db

ダイナモッドウェブシェル

4

7 に答える 7

31

多くの開発者のように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 が上で示したように複数のコマンドを実行する必要はありません (しかし、それはよりプラットフォームに依存しないのでしょうか?)。

于 2018-06-15T18:30:06.397 に答える
11

他の答えは、私には複雑すぎる/不明確でした。これが私が思いついたものです。

ステップ 1: docker-compose を使用して、DynamoDB ローカルをカスタム ネットワークで実行する

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-compose up -d dynamo

ステップ 2: ローカルの DynamoDB エンドポイントを処理するコードを作成する

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-backendます。エイリアス名は単なるサービス名です。

ステップ 3: 経由でコードを起動しますsam local

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た既存のネットワークを使用するように指示していることに注意してください。abp-sam-backenddocker-compose.yml

エンドツーエンドの例

https://github.com/rynop/abp-sam-nestjsで見つけることができる実用的な例 (および他の機能の束) を作成しました

于 2019-08-01T12:49:15.173 に答える
1

LocalStackを使用して DynamoDB を実行している場合、SAM に LocalStack ネットワークを使用する正しいコマンドは次のとおりだと思います。

sam local start-api --env-vars env.json --docker-network localstack_default

コードでは、LocalStack ホスト名は次のようになります。localstack_localstack_1

const dynamoDbDocumentClient = new AWS.DynamoDB.DocumentClient({
  endpoint: process.env.AWS_SAM_LOCAL ?
    'http://localstack_localstack_1:4569' :
    undefined,
});

ただし、を使用して LocalStack を起動しdocker-compose upました。CLI ツールを使用してpipLocalStack を起動すると、識別子が異なる場合があります。

于 2019-04-29T20:20:25.000 に答える