Heroku使っていて、アドオンについてかなり苦戦したので備忘的に残しておきます。
MailgunとPostgresです。
HerokuのアドオンのMailgunのプランを変えたらリセットされてsandboxドメインになっていた
やりたかったこと
メールの独自ドメインの認証を済ませて、すでに動かしているプロダクトだったのですが、固定IPが欲しくなって課金しました。
起きたこと
Starter(Free)
から Production 100k
にしたんですが固定IPもらえなさそうだったので戻しました。
しばらくすると「メールが送信できない」と報告があり、見に行くとSandoboxで送ろうとしているエラー文。
調査すると、Herokuの環境変数(MAILGUN_SMTP_SERVER
など)が書き換わっている。
Mailgunはプラン変更やドメイン追加のタイミングで、自動的に環境変数を書き換えることがあり、Herokuアドオンを使っていると、これがサイレントで起こるのが超怖い。
なんで勝手にそんなことするんですか。やめてくれと思いながら設定し直しました。
そもそもcredentialsで環境変数を設定しよう;;
本番Mailgunのアドオンをstgに使い回そうとして、SMTP認証エラー&attach不可のW地雷を踏んだ話
やりたかったこと
本番と同じ独自ドメインをstgでも使えるようにしようとしました。
やったこと
ステップ1:stgに本番と同じ環境変数を設定
$ heroku config:set MAILGUN_SMTP_SERVER=smtp.mailgun.org \
MAILGUN_SMTP_LOGIN=postmaster@yourdomain.com \
MAILGUN_SMTP_PASSWORD=xxx \
--app hogehoge-staging
ステップ2:テスト送信 → Net::SMTPAuthenticationError 発生
Net::SMTPAuthenticationError: 535
本番と同じなんですが?
ステップ3:「SMTP Credential mismatch」説が濃厚に
staging側からprod用のCredentialで送ると弾かれる(マルチテナント対策?)らしい、けどドキュメント見つけられず(AIが言ってた)
ステップ4:Herokuアドオンの attach を実施
$ heroku addons:attach mailgun-adjacent-xxxx --app hogehoge-staging
Error: That add-on resource is already attached to an app and may only be attached once.
Attachできないのかよ〜
Mailgunアドオンは1アプリ=1アドオンの原則(attach不可)らしかったです。
めっちゃ頑張ったのにできなかった;;
stg環境でもメール送信が必要なら、Mailgun本体で追加ドメインを作る or 別途テスト用ドメインを使うのがよさそうです。
固定IPがほしいので本体のアカウントを作成してそっちでやることにしました。じゃあもうHeroku使う意味あんまないね。
てかそもそも本番とstgではドメイン分けた方が安全ぽいですね。
Postgresの並行接続数が足りなくてstandardに上げたかったのに、GUIでできずCLI&DB移行が必要だった件
やりたかったこと
並行処理の制限(connection limit)が 20
しかなくて、too many requests
が頻発。
standard-0
だと 120
になるため、Postgresアドオンを essential-0
→ standard-0
にアップグレードしたかった。
やったこと
ダッシュボードからプラン変更を試すと essential-2
までは選べるがstandard-0
は一覧にない、
Dyno Typeが basic
だからか?と思い、プランを変更。
でも、Postgresのプラン変更候補は変わらず。
いろいろ調べるとCLIから叩けることがわかりました。
heroku addons:create heroku-postgresql:standard-0 --app your-app-name
これでようやく standard-0
を指定して作成できました。
CLIじゃないとできないことがあるんだね。
essential
→ standard
間では物理的に別インスタンスになるらしく、自動で中身が移るわけではないので、DBの再アタッチ・移行作業が必須。
heroku pg:wait -a your-app-name
heroku maintenance:on -a your-app-name
heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_NEW_URL -a your-app-name
heroku pg:promote DATABASE_URL --app your-app-name
heroku maintenance:off -a your-app-name
HEROKU_POSTGRESQL_NEW_URL
はinfoで確認。
めんどいしDB周りの移行は怖いので最初から standard-0
でもよかったかもしれないです。
ただ、金額は高いので迷いどころかもですね。