#amazon-web-services #go #websocket #aws-lambda #aws-api-gateway
#amazon-web-services #Вперед #websocket #aws-lambda #aws-api-gateway
Вопрос:
Я создал базовый сервис websocket с использованием AWS lambda api gateway с использованием golang и AWS SDK v2.
Я корректно работаю при использовании сгенерированного ACM сертификата, но когда я пытаюсь использовать самозаверяющий сертификат, импортированный в ACM, возникает эта ошибка:
request send failed, Post "https:/xxxxxxxxxxxxxxxx/dev/@connections/xxxxxxxxxxxx": x509: certificate signed by unknown authority
Сертификат сгенерирован правильно, и импорт работает.
На самом деле я могу получить доступ по протоколу https и просмотреть сертификат и цепочку.
Я также могу правильно подключиться к websocket, но проблема заключается в том, когда обработчик websocket lambda пытается отправить ответ клиенту.
Есть ли способ сообщить AWS apigatewayadmin api , работающему на lambda , что он не проверяет наличие действительного CA?
Ответ №1:
Итак, проблема заключалась в следующем: когда вы отвечаете на сообщение websocket из лямбда-выражения, вам нужно вызвать PostToConnection
метод для ответа на определенное соединение.
Для этого вам необходимо создать свой apigatewaymanagementapi
клиент, определяющий endponit для вашего текущего URL-адреса службы.
Для этого во всех примерах они используют этот метод:
config, _ := external.LoadDefaultAWSConfig(request.RequestContext.DomainName)
config.EndpointResolver = aws.ResolveWithEndpointURL(
fmt.Sprintf("https://%s/%s",
request.RequestContext.DomainName,
request.RequestContext.Stage))
apigw := apigatewaymanagementapi.New(config)
request.RequestContext.DomainName
Определяется с помощью URL-адреса запроса, и он работает, когда вы используете api gateway для генерации URL-адреса в формате {api-id}.execute-api.{aws-zone}.com.
При использовании custom domain name
с центром сертификации, отличным от AWS, этот код завершается ошибкой, поскольку lambda пытается отправить сообщение по этому URL.
Мое решение заключалось в замене запроса.Запросите context.DomainName к сгенерированной конечной точке {api-id}.execute-api.{aws-zone}.com
Обновить:
Вы можете создать конечную точку в своем lambda, используя переменную AWS_REGION env и RequestContext.Идентификатор приложения, подобный этому:
fmt.Sprintf("https://%s.execute-api.%s.com/%s",
request.RequestContext.APPID,
os.Getenv("AWS_REGION"),
request.RequestContext.Stage)