从Go API连接到Redshift的SSL错误

时间:2018-11-28 08:32:19

标签: docker go amazon-redshift alpine

我有以下转到代码:

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依赖关系有关,或缺少证书或类似的东西。

2 个答案:

答案 0 :(得分:0)

您可以建立没有SSL加密的数据库连接,如下所示:

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

答案 1 :(得分:0)

我发现了这一点,我们正在使用的连接字符串具有ssl=true,该字符串适用于nodejs中的库,但在Go中,它应该为sslmode=require。我对此进行了检查,并替换了字符串。