如何在AWS API Gateway后部署自定义路径的Sidekiq仪表盘?
解决Sidekiq GUI在AWS API Gateway的OpenAPI配置问题
针对你用自定义路径(比如/admin/jobs)部署Sidekiq GUI,又不想手动维护OpenAPI路由的需求,有两个实用方案:
方案1:用OpenAPI通配符路径快速匹配所有子路由
这是最快捷的方式,不用关心Sidekiq具体有哪些路由,直接通过通配符覆盖所有子路径:
在你的openapi.yml里添加以下配置:
paths: /admin/jobs/{proxy+}: get: x-amazon-apigateway-integration: type: HTTP_PROXY httpMethod: GET uri: "https://your-app-domain.com/admin/jobs/{proxy}" passthroughBehavior: WHEN_NO_MATCH post: x-amazon-apigateway-integration: type: HTTP_PROXY httpMethod: POST uri: "https://your-app-domain.com/admin/jobs/{proxy}" passthroughBehavior: WHEN_NO_MATCH # 按需添加PUT/DELETE等Sidekiq用到的其他HTTP方法
{proxy+}是OpenAPI的通配符语法,会匹配/admin/jobs下所有层级的子路径(比如/admin/jobs/stats、/admin/jobs/queues/default等)- Sidekiq GUI主要用到GET(页面渲染)和POST(任务操作),这两个方法必须配置
- 核心提醒:一定要给这个路径加严格权限控制,比如API Gateway的IAM认证、自定义授权层,或者后端应用的身份验证,绝对不能公开访问
方案2:动态生成OpenAPI路由片段(适配Sidekiq路由变更)
如果担心通配符太宽泛,或者需要精确路由控制,可以用脚本自动提取Sidekiq路由并生成配置:
- 写一段Ruby脚本,利用Sidekiq::Web的路由映射获取所有路径:
require 'sidekiq/web' require 'yaml' # 替换成你的自定义前缀 custom_prefix = '/admin/jobs' sidekiq_routes = Sidekiq::Web.routes.map do |route| # 把Sidekiq默认的/sidekiq前缀替换为自定义路径 path = route.path.spec.gsub('/sidekiq', custom_prefix) { path => { route.verb.downcase.to_sym => { 'x-amazon-apigateway-integration' => { 'type' => 'HTTP_PROXY', 'httpMethod' => route.verb.upcase, 'uri' => "https://your-app-domain.com#{path}", 'passthroughBehavior' => 'WHEN_NO_MATCH' } } } end # 生成可直接合并的YAML片段 puts YAML.dump({ paths: sidekiq_routes.reduce({}, :merge) })
- 运行脚本得到Sidekiq所有路由对应的OpenAPI配置,将这段内容合并到主
openapi.yml中 - 可以把脚本集成到CI/CD流程,每次部署前自动生成最新路由配置,适配Sidekiq版本更新带来的路由变化
额外注意事项
- 自定义路径的隐蔽性只是基础,权限控制才是核心,必须确保只有授权人员能访问
- 用通配符方案时,要检查是否和应用其他路由冲突,避免意外匹配
- 测试时要覆盖Sidekiq GUI的主要功能(查看队列、重试任务、删除任务等),确保所有路径都能正常通过API Gateway转发
内容的提问来源于stack exchange,提问作者David Hempy
相关产品推荐
相关产品推荐

