Как имитировать ответ на объект request.get в AWS Lambda, развернутый через localstack для целей локального тестирования

Согласно требованию, я провожу лямбда-тестирование локально, используя LocalStack. Я мог бы развернуть и вызвать лямбду, используя localstack. Но я получаю ошибку в коде лямбда-обработчика, поскольку мой код обращается к некоторой внешней ссылке через модуль Request.get().

Я высмеивал эту внешнюю ссылку локально, используя Wiremock, поэтому, если я попытаюсь получить доступ к этой ссылке на терминале, я смогу получить ответ, но я получаю ошибку ниже, когда она вызывается из Lambda, которая была вызвана Localstack.

Ошибка:

INFO:root:error MyHTTPConnectionPool(host='localhost', port=8082): Max retries exceeded with url: /api/v1/health (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fff8314cee0>: Failed to establish a new connection: [Errno 111] Connection refused'))

Ниже приведена моя конфигурация localstack и Wiremock. Я создаю оба контейнера докеров с файлом docker-compose.yml.

version: "3.3"

services:
  localstack:
    container_name: "${LOCALSTACK_DOCKER_NAME-localstack_main}"
    image: localstack/localstack:3.0.0
    platform: linux/amd64
    ports:
      - "4566:4566"
    expose:
      - "4566"
    environment:
      - SERVICES=lambda,s3,iam,logs
      - AWS_DEFAULT_REGION=eu-west-1
      - SKIP_SSL_CERT_DOWNLOAD=true
    networks:
      - shared-network

  wiremock:
    container_name: wiremock-container
    platform: linux/amd64
    image: wiremock/wiremock:2.31.0
    volumes:
      - $PWD/resources/wiremock:/home/wiremock
    ports:
      - "8082:8080"
    networks:
      - shared-network

networks:
  shared-network:
    name: local_network

Ниже приведен код обработчика Lambda.

def lambda_handler(event, context):
    print("Lambda invoked")
    # Some code
    my_external_url = "http://localhost:8082/api/v1/health" # I am setting this link to get the mocked response through localstack
    requests.get(my_external_url).json() # I get the error here
    # Some code
    return {
        'status': 'OK',
    }

Я издеваюсь над ссылками через Wiremock, я могу использовать любой другой способ издеваться над ссылкой, если это будет предложено. Но мне нужно использовать localstack для вызова лямбды. Очевидно, что должны быть некоторые случаи использования, когда лямбда пытается получить доступ к некоторой ссылке, и локальное тестирование может быть выполнено через localstack, имитируя эти ссылки.

Привет, Бинит! Прежде всего, вы используете очень старую версию Localstack, которая может быть частью проблемы. В настоящее время мы используем версию 3.5, которая имеет значительное количество улучшений и дополнительных возможностей (включая работу в сети и DNS). Для связи между двумя контейнерами см. руководство по работе в сети здесь

Bart 09.07.2024 10:55

Я пробовал с 3.0.0 и та же ошибка

Binit Amin 10.07.2024 17:25

Привет, Binit! Я попробовал ваш образец лямбды и столкнулся с той же проблемой: кажется, что Wiremock не раскрывает имя контейнера или хост внешним контейнерам. Как только я изменю цель лямбды на host.docker.internal, см. инструкции в этой статье

Bart 11.07.2024 09:58

Спасибо за предложение, я обнаружил, что мне нужно передать host.docker.internal:8080 вместо localhost:8080, я добавил свое решение здесь.

Binit Amin 12.07.2024 15:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил в коде две проблемы. 1: Когда он находится в сети и когда один докер хочет связаться с другим докером, нам нужно вызвать API, например http://host.docker.internal:8080/api/v1/health вместо http://localhost:8080/api/v1/health.

  1. Это решило проблему с локальным запуском тестовых случаев, но когда я попробовал это, хотя Дженкинс, у меня возникла та же ошибка, упомянутая в моем вопросе. В качестве решения я обновил конфигурацию локального стека в файле компоновки Docker, я передал конфигурацию ниже.

    дополнительные_хосты:

    • "host.docker.internal:host-gateway"

Другие вопросы по теме