Railsの DATABASE_URL で指定できるパスワードの文字種
Railsアプリケーションを動かすAWSリソースをTerraformで作る場合、random_password を使ってDBパスワードを生成します。
しかし、 DBパスワードに一部の記号が含まれていると環境変数 DATABASE_URL
で渡す際に URI::InvalidURIError
が発生してしまうため、使える文字種を調べた。
調査
- 環境変数のフォーマットは database.yml に記載されている
- 例:
DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
- 参考: railties/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt
- 例:
- この文字列の解析には
URI.parse
が使用されてそう - RFCのUser Informationに文字種は書かれていない*1
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:他の箇所に記載あったかもしれないが、詳細は調べてない