ボクココ

個人開発に関するテックブログ

Heroku Addons で SendGrid を使ってる方が必要な年内対応

ども、@kimihom です。 Heroku Advent Calendar 2020 の記事として投稿します。

f:id:cevid_cpp:20201206111929j:plain

Heroku で SendGrid アドオンを前から使ってる人は、直近ですぐに対応しなければならないことがあるので、リマインドも兼ねて記事として残しておく。

必要な対応

SendGrid と接続するときに、メールアドレスとパスワードで認証して送信してたのが、来年の1月20日でできなくなる。API Key のみの認証をサポートすることになるとのこと。 これは、SendGrid の運営元 Twilio 側で最近セキュリティ周りの強化が強くなり、SendGrid 側でもその影響を受けていそうだ。

以下、Ruby on Rails の場合の対応を記しておく。

API キーの取得

まず、SendGrid から、API キーを新規作成しよう。

Heroku 側の Addons から SendGrid をクリックし、SendGrid へ遷移。 SendGrid の左メニューより、Settings > API Keys より、 Create API Key をクリックしよう。

API Key の名前は Heroku とかにして、API Key PermissionsRestricted Access を選ぼう。単に今まで SendGrid からメールを送っていただけの場合、ここで Mail Send だけ有効にすれば良い。

f:id:cevid_cpp:20201206110930p:plain

そして作られた API Key をコピーして、環境変数としてペーストできるようにしておこう。

コードの変更

config/environments/production.rb にてメール接続の設定で、user_name と password を環境変数から取ってきて設定しているかと思う。それを apikey という固定のuser_name と、先ほど取得した APIキーSENDGRID_APIKEY 環境変数をpasswordへセットすることになる。

ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => 587,
  :authentication => :plain,
-    :user_name      => ENV['SENDGRID_USERNAME'],
-    :password       => ENV['SENDGRID_PASSWORD'],
+  :user_name      => 'apikey',
+  :password       => ENV['SENDGRID_APIKEY'],
  :domain         => 'heroku.com',
  :enable_starttls_auto => true
}

適用できたかの確認

現在、SendGrid 側で 2段階認証(Settings > Two-Factor Authentication)を ON にすると、API Key からの作成のみメール送信を許可できるような設定となっているようだ。 そのため、SendGrid 側で 2段階認証を ON にしてメール送信の色々なコードを実行して確認し、SendGrid 側でエラーが起きていなければ OK となる。

それ以外で SendGrid 認証しているところがないか確認しよう

私がその後ハマったのが、とあるケースで SendGrid からのエラーが止められない問題があった。

それは、完全にこっちの問題で、 AWS Lambda で別コードで実行されている場所で、SendGrid 認証の部分を Rails とは別の JavaScript 側で設定していたからだった。 その JavaScript 側の環境変数コードにも同様に user_name, password の書き方を変えることで、無事に完了した。

いつまでにやらないといけないか

SendGridユーザー宛に2020/12/03 に、以下のようなメールが届いているはずだ。

On January 20th, 2021 we will no longer accept basic authentication with username and password, and we will be requiring 2FA to login to your account.

今のところ来年の1月20日がデッドラインとなる予定だ。本来の予定日から延期となったということで、おそらくまだ設定を変えていないプロジェクトがたくさんあるのだと考えられる。

昔からあって放置していた Heroku アプリで SendGrid を使っていないか、冬の大掃除と一緒に探してきれいにしておこう。

個人開発のための Webサービス公開マニュアル

個人開発のための Webサービス公開マニュアル