Положить в локальную таблицу DynamoDB с Python Boto3 тайм-аут - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь программно поместить данные в локально работающий контейнер DynamoDB, вызвав лямбда-выражение Python.

Я пытаюсь следовать приведенному здесь шаблону: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.03.html Я использую amazon / Dynamodb-Local, который вы можете скачать здесь: https://hub.docker.com/r/amazon/dynamodb-local

Использование Ubuntu 18.04.2 LTS для запуска контейнера и лямбда-сервера AWS Sam CLI для запуска моего Lambda api Docker версии 18.09.4 Python 3.6 (Вы можете увидеть это в журналах sam ниже) Команда запуска для python lambda просто "sam local start-api"

Сначала мой лямбда-код

import json
import boto3

def lambda_handler(event, context):
    print("before grabbing dynamodb")
#    dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000",region_name='us-west-2',AWS_ACCESS_KEY_ID='RANDOM',AWS_SECRET_ACCESS_KEY='RANDOM')
    dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")
    table = dynamodb.Table('ContactRequests')
    try:
        response = table.put_item(
            Item={
                'id': "1234",
                'name': "test user",
                'email': "testEmail@gmail.com"
                }
            )

    print("response: " + str(response))

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world"
        }),
    }

Я знаю, что у меня должна быть эта таблица ContactRequests, доступная на localhost: 8000, потому что я могу запустить этот скрипт для просмотра моих таблиц динамодера контейнера-докера, с которыми я тестировалмножество значений в вызове boto.resource для включения ключей доступа, имен регионов и секретных ключей, без улучшения результата

dev@ubuntu:~/Projects$ aws dynamodb list-tables --endpoint-url http://localhost:8000
{
    "TableNames": [
        "ContactRequests"
    ]
}

Я также могу успешно поразить localhost: 8000 / shellчто DynamodB предлагает

К сожалению, во время работы, если я попадаю в конечную точку, которая запускает этот метод, я получаю тайм-аут, который регистрируется так:

Fetching lambci/lambda:python3.6 Docker container image......
2019-04-09 15:52:08 Mounting /home/dev/Projects/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro inside runtime container
2019-04-09 15:52:12 Function 'HelloWorldFunction' timed out after 3 seconds
2019-04-09 15:52:13 Function returned an invalid response (must include one of: body, headers or statusCode in the response object). Response received: 
2019-04-09 15:52:13 127.0.0.1 - - [09/Apr/2019 15:52:13] "GET /hello HTTP/1.1" 502 -

ПримечаниеПоскольку ни один из моих методов печати не запускается, если я удаляю вызов table.put, то методы печати успешно вызываются.

Я видел похожие вопросы о переполнении стека, например, эта лямбда-запись Python DynamicDB получает ошибку тайм-аута , в которой говорится, что проблема в том, что я использую локальную базу данных, но не долженбыть в состоянии записать в локальную базу данных с помощью boto3, если я укажу на мой локально работающий экземпляр Dynamodb?

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Ваш контейнер Docker, выполняющий функцию Lambda, не может достичь DynamoDB на 127.0.0.1. Вместо этого попробуйте в качестве имени хоста для конечной точки указать имя локального док-контейнера DynamoDB:

dynamodb = boto3.resource('dynamodb', endpoint_url="http://<DynamoDB_LOCAL_NAME>:8000")

Вы можете использовать docker ps, чтобы найти <DynamoDB_LOCAL_NAME> или дать ему имя:

 docker run --name dynamodb amazon/dynamodb-local

и затем подключите:

dynamodb = boto3.resource('dynamodb', endpoint_url="http://dynamodb:8000")
0 голосов
/ 11 апреля 2019

Нашел решение проблемы здесь: соединение AWS SAM Local с DynamodB в Docker Лицо, задавшее вопрос, заметил, что он увидел в сети, что ему, возможно, потребуется подключиться к той же сети докера, используя:

docker network create lambda-local

Итак, создали эту сеть, затем обновили мою команду sam и мои команды docker для использования этой сети, например:

docker run --name dynamodb -p 8000:8000 --network=local-lambda amazon/dynamodb-local

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

После этого у меня больше не было проблемы с тайм-аутом. Я все еще работаю над пониманием того, почему именно эта проблема была

Чтобы быть справедливым, было важно, чтобы я использовал имя контейнера Dynamodb в качестве хоста для моего вызова ресурса boto3. Таким образом, в конечном итоге именно комбинация решения, приведенного выше, и ответа, предоставленного «Reto Aebersold», и создали окончательное решение

dynamodb = boto3.resource('dynamodb', endpoint_url="http://<DynamoDB_LOCAL_NAME>:8000")

...