はじめに
CodeBuildでアプリケーションのCIをするために、実物のAuroraに接続するのが面倒だったのでPostgreSQLをローカルでコンテナ起動してそこにデータを投入してテストをしようとしたら意外と大変だったのでメモっておく。
なお、CodeBuildのイメージは
- aws/codebuild/standard:5.0
- aws/codebuild/amazonlinux2-x86_64-standard:3.0
それぞれで使えるようにした。
DBについては、PostgreSQL12.Xを使用している。
前提知識としては、DockerやCodeBuildについてある程度経験があるといったあたりをターゲットにしている。
事前準備
Dockerを起動するので、CodeBuildの特権モード(Privilegeモード)はONにしておく。
※これをしておかないとDockerデーモンが起動しない。
PostgreSQLの起動設定
Dockerイメージはどちらでも共通で使える。以下のファイルを用意しておこう。
version: '3'
services:
postgres:
image: public.ecr.aws/docker/library/postgres:12.7-alpine3.14
restart: always
environment:
POSTGRES_USER: [ユーザ名]
POSTGRES_PASSWORD: [パスワード]
PGPASSWORD: [パスワード]
POSTGRES_DB: [DB名]
TZ: "Asia/Tokyo"
ports:
- 5432:5432
volumes:
- postgres:$PWD/pgdata
volumes:
postgres:
クライアントインストール Standard(Ubuntuイメージ)編
Ubuntuイメージの場合、4.0以前だと
phases:
install:
runtime-versions:
docker: 19
が必要になるが、5.0では標準でDockerが起動かのうになっているらしいので、上記は不要である。
デフォルトのイメージではpostgresql12のクライアントが入っていないのでインストールする。
phases:
install:
commands:
- apt-get update
- apt-get install -y postgresql-client-12
クライアントインストール AmazonLinux2編
AmazonLinux2のイメージでは、Dockerを使用する場合は下記のランタイム設定が必要になる。
phases:
install:
runtime-versions:
docker: 19
AmazonLinux2では、PostgreSQL12のクライアントはamazon-linux-extras(詳細は公式のナレッジセンター参照)に入っているのだが、なぜかCodeBuildのイメージにはインストールされていない。遠回りだが、まずはamazon-linux-extrasからインストールしよう。
commands:
- yum update -y --skip-broken
- yum install -y amazon-linux-extras
- ln -s /lib/python2.7/site-packages/amazon_linux_extras ~/.pyenv/versions/3.9.5/lib/python3.9/site-packages/
- amazon-linux-extras enable postgresql12
- yum install -y postgresql.x86_64
ここで、シンボリックリンクを作っているのは、amazon_linux_extras がデフォルトでPython2.7配下にインストールされるためだ。
なぜかこれだけは最新になっておりPython3.9から参照できるようにする。
Docker起動
あとは、docker-composeでコンテナを起動してSQLで初期データを投入しよう。
接続情報は、最初に書いたdocker-compose.ymlと合わせよう。
起動完了の待ち合わせをするのは、起動直後にpsqlでデータを放り込もうとすると、おそらくReadyになり切っていなくてエラーになるためだ。
env:
variables:
PGPASSWORD: [パスワード]
pre_build:
commands:
- docker-compose up -d
# 起動完了を待ち合せてからロードする
- sleep 5
- psql -h localhost -U [ユーザ名] -d [DB名] -f ./[初期投入用のSQLファイル].sql
ここまでやれば、あとはアプリケーションからローカルホストに向けてテストを実行してやればよい。
これだけのことなのだが、CodeBuildの拡張パッケージのインストールに思ったよりも苦戦してしまった……。