【问题标题】:SSL error connecting to Redshift from a Go api从 Go api 连接到 Redshift 的 SSL 错误
【发布时间】:2019-04-30 02:35:34
【问题描述】:

我有以下 go 代码:

func NewConnection(connectionString string) (*sql.DB, error) {
    db, err := sql.Open("postgres", connectionString)
    if err := db.Ping(); err != nil {
        log.Panic(err)
    }
    return db, err
}

还有以下 Dockerfile:

# Build env
FROM golang:alpine AS build

ARG stage

RUN apk update && apk upgrade && \
  apk add --no-cache bash git openssh build-base && \
  go get -u golang.org/x/vgo

ADD . /src
WORKDIR /src

RUN vgo mod init && vgo install ./...&& vgo build -o service

# Runtime env
FROM alpine

ARG stage

RUN apk update && apk add --no-cache ca-certificates openssl openssl-dev
WORKDIR /app

COPY --from=build /src/${stage}-env.yml /app/
COPY --from=build /src/service /app/

ENV CONFIG_PATH=.

ENTRYPOINT ./service

我的 NewConnection 函数从队列中检索 Redshift 连接字符串以及一些数据。当我对 postgres 容器进行测试时,这一切都在本地工作。但是,当我部署我的服务时,我收到以下错误:

panic: pq: parameter "ssl" cannot be changed after server start

我的连接包含?ssl=true,它应该是 SSL,我们从 AWS 中的 Fargate 服务连接到 AWS Redshift 等。所以我认为这个问题可能与我的 Alpine 容器中缺少 ssl 依赖项有关,或者缺少证书或类似的东西。

【问题讨论】:

  • 您没有从 sql.Open 检查错误,然后再继续 Ping 数据库。这是什么?
  • @Peter 我将该错误转移到在 ping 之前处理,它似乎确实是 ping 中的 log.Panic(err) 导致了致命问题。
  • 你能分享你的连接字符串吗?

标签: docker go amazon-redshift alpine


【解决方案1】:

你可以在没有 SSL 加密的情况下建立数据库连接,像这样:

db, err := sql.Open("postgres", "user=test password=test dbname=test sslmode=disable") 

【讨论】:

    【解决方案2】:

    我想通了,我们使用的连接字符串有 ssl=true,它适用于 nodejs 中的库,但在 Go 中它应该是 sslmode=require。我对此进行了检查,并进行了字符串替换。

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 2016-10-01
      • 2023-03-14
      • 1970-01-01
      • 2015-04-13
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多