Функция SAM Lambda python не подключается к локальной динамической базе данных в docker - PullRequest
1 голос
/ 30 марта 2020

Я установил DynamodB в контейнер docker, и из командной строки я могу писать и читать записи из него. Однако, когда я пытаюсь подключиться к базе данных, используя Python3, я получаю сообщение об ошибке.

Не удается подключиться к URL-адресу конечной точки: "http://localhost: 8000 / " : EndpointConnectionError

Это мой фрагмент кода

import os
import uuid
import json
import boto3
import traceback
from botocore.exceptions import ClientError

print('Loading function')

region_name = os.environ["REGION_NAME"]
dynamo = boto3.client("dynamodb")
table_name = os.environ["TABLE_NAME"]
musicAlbum_table = boto3.resource("dynamodb", endpoint_url="http://localhost:8000/").Table(table_name)

def respond(err, res=None):
    return {
        'statusCode': '400' if err else '200',
        'body': err.message if err else json.dumps(res),
        'headers': {
            'Content-Type': 'application/json',
        },
    }


def lambda_handler(event, context):

    print("table_name="+ table_name)
    musicAlbum_table.put_item(
                Item={
                    'Artist': 'Joe Satriani',
                    'SongTitle': 'Circles',
                    'AlbumTitle': 'Surfing with an Alien'
                  }
            )
    scan_result = dynamo.scan(TableName=table_name)
    return respond(None, res=scan_result)

1 Ответ

0 голосов
/ 01 апреля 2020

На компьютерах Ma c и Windows с последней версией Docker используйте имя хоста "host. docker .internal" с протоколом http (небезопасным) при создании ресурса boto. Затем локальная лямбда, запущенная в контейнере, будет иметь сетевой доступ к локальной динамической базе данных, запущенной на хосте.

musicAlbum_table =
   boto3.resource("dynamodb",
               endpoint_url="http://host.docker.internal:8000/")
               .Table(table_name)

На Linux это менее просто, возможно, подождите до v20.04 и дождитесь команды cli '--add-host host. docker .internal: host-gateway'. Я просто вскидываю руки на Linux.

...