あ、しんのきです

趣味とか技術系とか

Hasura を Amazon RDS for PostgreSQL に接続するときの Dockerfile を供養する

これは何

Secrets Manager に RDS の接続情報を保存する際、 JSON 形式で保存されますが、Fargate は Secrets Manager から JSON キーを指定しての取り出しに対応していない(まだ対応されていない様子だった)ため、 jq コマンドを持ったコンテナイメージを作って実行時に動的に HASURA_GRAPHQL_DATABASE_URLマッピングしていました。

使わなくなって消すのももったいないので残しておきます。

RDS のパスワードをローテーションする場合に使えるかもしれません。

# Dockerfile
FROM stedolan/jq as jq
FROM hasura/graphql-engine:v1.2.2

COPY --from=jq /usr/local/bin/jq /usr/local/bin/jq

COPY docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["docker-entrypoint.sh"]

CMD ["graphql-engine", "serve"]
# docker-entrypoint.sh
#!/bin/sh

if [ -z ${HASURA_GRAPHQL_DATABASE_URL+x} ]; then
  export HASURA_GRAPHQL_DATABASE_URL=$(echo $DB_SECRET | jq -r '"postgres://" + .username + ":" + (.password|@uri) + "@" + .host + ":" + (.port|tostring) + "/" + .dbname')
fi

exec "$@"

password には記号が入る可能性があるので .password|@uri をつかってエスケープしています。

現在は

この方法はやめてシンプルに Secrets Manager に別途 Secret String 形式で RDS への接続 URL を保存してしまっています。

コンテナイメージは普通の hasura/graphql-engine を使っています。 はじめはローカルや CI/CD 環境からから Admin Secret を持ってマイグレーションを叩きに行くよりもセキュリティ的にいいだろうと思い cli-migrations 版のイメージをベースにマイグレーションファイルを COPY してコンテナイメージを生成していたのですが、毎回コンテナをデプロイしていると結構時間がかかってしまっていたため、今は諦めて外からマイグレーションしています。