Railsの DATABASE_URL で指定できるパスワードの文字種

Railsアプリケーションを動かすAWSリソースをTerraformで作る場合、random_password を使ってDBパスワードを生成します。
しかし、 DBパスワードに一部の記号が含まれていると環境変数 DATABASE_URL で渡す際に URI::InvalidURIError が発生してしまうため、使える文字種を調べた。

調査

URI.parse を使ってるのは分かったので、実際に解析して調べた。

require 'uri'

specials = '!@#$%&*()-_=+[]{}<>:?'.chars
check = -> { URI.parse("postgres://myuser:#{_1}@localhost/somedatabase").password rescue nil }

specials.select(&check).join
#=> "!$&*()-_=+:"
specials.reject(&check).join
#=> "@#%[]{}<>?"

結果

使える文字種は "!$&*()-_=+:" なので、DBパスワードを生成するときの定義は以下の通り。

resource "random_password" "password" {
  special          = true
  override_special = "!$&*()-_=+:"
}

*1:他の箇所に記載あったかもしれないが、詳細は調べてない