Согласно требованию, я провожу лямбда-тестирование локально, используя 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, имитируя эти ссылки.
Я пробовал с 3.0.0 и та же ошибка
Привет, Binit! Я попробовал ваш образец лямбды и столкнулся с той же проблемой: кажется, что Wiremock не раскрывает имя контейнера или хост внешним контейнерам. Как только я изменю цель лямбды на host.docker.internal, см. инструкции в этой статье
Спасибо за предложение, я обнаружил, что мне нужно передать host.docker.internal:8080 вместо localhost:8080, я добавил свое решение здесь.
Я обнаружил в коде две проблемы.
1: Когда он находится в сети и когда один докер хочет связаться с другим докером, нам нужно вызвать API, например http://host.docker.internal:8080/api/v1/health
вместо http://localhost:8080/api/v1/health
.
Это решило проблему с локальным запуском тестовых случаев, но когда я попробовал это, хотя Дженкинс, у меня возникла та же ошибка, упомянутая в моем вопросе. В качестве решения я обновил конфигурацию локального стека в файле компоновки Docker, я передал конфигурацию ниже.
дополнительные_хосты:
Привет, Бинит! Прежде всего, вы используете очень старую версию Localstack, которая может быть частью проблемы. В настоящее время мы используем версию 3.5, которая имеет значительное количество улучшений и дополнительных возможностей (включая работу в сети и DNS). Для связи между двумя контейнерами см. руководство по работе в сети здесь