4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CircleCIAdvent Calendar 2021

Day 23

CircleCI で Heroku Postgres(SSL) を利用する

Last updated at Posted at 2021-12-22

今年もやってきました、こちらは、CircleCI Advent Calendar 2021 ゆかちゃんの誕生日。12月23日です!! 毎年お世話になります、しょっさんです。

今年の CircleCI ネタは、Herokuでございます。今年もかよ。


Heroku Postgres の自動テストがうまくいかない

1年放置していた、とある Typescript + Sequelize のアプリが、CircleCI で何をどうやってもエラーをはき続けてしまう現象に巡り会いました。

エラーの内容はこうです。

> webapp@1.0.2 migrate /home/circleci/project
> sequelize db:migrate


Sequelize CLI [Node: 12.17.0, CLI: 6.3.0, ORM: 6.11.0]

Loaded configuration file "src/config/config.json".
Using environment "development".

ERROR: The server does not support SSL connections

ははーん?

Heroku Postgres が SSL 必須になるの巻

本年 2021/2/23 の changelog です。All Heroku Postgres client connections require SSL にあるとおり、Common Runtime 環境下でも PostgreSQL への接続に SSL が必須となりました。

これには二つの対処が必要です。

  1. Sequelize の SSL 化
  2. CircleCI 側の PostgreSQL の SSL化

1. Sequelize の SSL 化

こちらについては、既にちょうど良い記事があるので、こちら参考に。

heroku-postgresをSSLエラーが阻む問題の解決

ちな、Sequelize の config.json をこんな風に書けば十分です。

config.json
  "production": {
    "use_env_variable": "DATABASE_URL",
    "dialectOptions": {
      "ssl": {
        "require": true,
        "rejectUnauthorized": false
      }
    }
  }

2. CircleCI 側の PostgreSQL の SSL化

そして二つ目、これが厄介で厄介で仕方ない。

結果としてはこれ。openssl で作成したオレオレ証明書をベースに、起動shell に無理矢理それを食わして起動させるパターンです。

ポイントは、local Postgres用の Docker Image で、バージョン指定しておくこと。これ -> image: circleci/postgres:13.0。他のバージョンだとちょっとまた手はずが変わってくると思われ。

/.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
      - image: cimg/node:16.13.1
        environment:
          DATABASE_URL: postgres://testing:password@localhost:5432/sample

      # local postgresql server
      - image: circleci/postgres:13.0
        environment:
          POSTGRES_USER: testing
          POSTGRES_PASSWORD: password
          POSTGRES_DB: sample
        entrypoint: bash
        command: >
          -c '
            openssl req -nodes -new -x509 -subj "/CN=localhost" -keyout server.key -out server.crt &&
            chown postgres server.key &&
            chmod 600 /server.key &&
            exec /docker-entrypoint.sh -c ssl=on -c ssl_cert_file=/server.crt -c ssl_key_file=/server.key
          '

ということで、れっつえんじょい CircleCI + Heroku ライフ。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?