使用负载均衡器在 AWS 上进行 OpenAPI Swagger 配置

问题描述 投票:0回答:1

我正在尝试在我的 Spring Boot 应用程序中添加 Swagger (OpenAPI),并按以下方式配置它:

我的 pom.xml 文件具有以下依赖项:

<!-- Swagger UI -->
    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-ui</artifactId>
        <version>1.6.9</version>
    </dependency>

应用程序类有一个 @SpringBootApplication 注解并定义了以下 bean:

/** Swagger Configuration */
@Bean
public OpenAPI seatManagerOpenAPI() {
    return new OpenAPI()
            .info(new Info().title("Service API")
                    .description("Some Description")
                    .version("0.0.1")
                    .license(new License().name("Apache 2.0").url("http://springdoc.org")))
            .externalDocs(new ExternalDocumentation()
                    .description("Some Documentation")
                    .url("https://somelink")
            );
}

我的 Spring Boot 应用程序有一个控制器:

@RestController
@RequestMapping("/serviceName")
public class ServiceNameController

我的 application.yml 添加了以下内容:

springdoc:
  packagesToScan: path.to.service
  pathsToMatch: /serviceName/**
  swagger-ui:
    path: /serviceName/swagger-ui

通过这个非常基本的配置,Swagger 可以在我的本地主机上完美运行:

[http://localhost:8082/servicename/swagger-ui/index.html]

但是,当部署到 AWS 上的 ECS 集群时,我的请求通过负载均衡器 (ALB) 传递 - 我收到以下错误:“无法加载远程配置”。在浏览器中检查这一点,我在日志中看到 404 状态和一条消息:

undefined /v3/api-docs/swagger-config

我有一个在 ECS 上运行的由多个微服务组成的集群。负载均衡器根据路径将各种https调用定向到相关的目标组(服务),例如:

IF Path is /servicename/* AND Host is someHost
Then forward to [relevant target group] (service)

我看过很多关于类似错误的帖子,以及与 API 网关(我根本没有在 AWS 上使用)或 Spring Security 库(我根本没有使用)配置相关的答案。

我尝试添加这个bean:

@Bean
ForwardedHeaderFilter forwardedHeaderFilter() {
    return new ForwardedHeaderFilter();
}

我还在 application.yml 文件中尝试了许多配置,添加和删除了许多具有不同值的属性(不仅仅是这里包含的属性):

springdoc:
#  swagger-ui:
#    use-root-path: false
#    url: "/v3/api-docs"
#    disable-swagger-default-url: true
#    path: /serviceName/swagger-ui
#    configUrl: "/swagger-config.yaml"
#    use-root-path: true
#    urls:
#      url: "/v3/api-docs"
#      name: "seat-manager"
#  api-docs:
#    enabled: true
#    path: /v3/api-docs/swagger-config

我还尝试将 swagger-config.json 文件添加到我的资源和资源/静态文件夹中,并来回更改内容,但我无法使其工作。

我在这里缺少什么?什么设置实际上可以让 swagger 在我的云中远程工作?

提前非常感谢!

amazon-web-services spring-boot swagger microservices openapi
1个回答
0
投票

我遇到了同样的问题,解决方案很简单。在 ALB 上,您还需要公开 docu json 页面,稍后还需要公开 api 路径(用于调用)。

简而言之:为了让 swagger 在 ALB 上工作,需要公开以下内容:

  1. /swagger-ui* -> 访问 swagger 页面
  2. /v3/api-docs* -> 需要这样才能加载 swagger 页面
  3. /api* -> 需要 API 调用才能工作
© www.soinside.com 2019 - 2024. All rights reserved.