ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

Railsでaws-sesからaws-sdk-railsに乗り換える方法とハマったこと

はじめに

RailsAWSのSESを使うときに、雑に調べるとaws-sesを用いた例が多く、それを使っていたのですが、よく調べてみるとaws-sdk-railsという公式のgemがあり、最近のメンテ具合からもaws-sdk-railsに乗り換えたいと思いました。
(公式のgemがあるならば、公式には乗るべきだと考えています)

ただ、後者のほうが後発なこともあり、後者についてはドキュメントもあまり多くなく、少しハマる部分もあったので、簡単にまとめます。

基本的な乗り換え方法

普通にIAM userを使っている場合は、以下のように書き換えて、gemを入れ替えるだけです。

変更前の記述

ActionMailer::Base.add_delivery_method
  :ses, AWS::SES::Base, 
  access_key_id: ENV['AWS_ACCESS_KEY_ID'], 
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
  region: 'us-east-1'

config.action_mailer.delivery_method = :ses

変更後の記述

creds = Aws::Credentials.new(
  ENV['AWS_ACCESS_KEY_ID'],
  ENV['AWS_SECRET_ACCESS_KEY']
)
Aws::Rails.add_action_mailer_delivery_method(:aws_sdk, credentials: creds, region: 'us-east-1')

config.action_mailer.delivery_method = :aws_sdk

ハマったこと(IAM roleを使う場合)

ローカルなどで、IAM userを使っている場合には、上のように書けば問題ないのですが、IAM roleを使っている場合には、少し注意が必要でした。

といっても記述は簡単で、

Aws::Rails.add_action_mailer_delivery_method(:aws_sdk, region: 'us-east-1')

のように、認証情報等を明示的に与えなくても動いてくれます。
(この挙動、README見るだけじゃなかなか察せなくないですか?)

明示的には見つかりませんでしたが、このissueを読んで、なんとなく察して実装できました。

おわりに

まず、普通に調べると、aws-sesの例ばかり出てくるのはかなりマズイなあと思います。現状ならば、aws-sdkに乗っておくのが無難ですが、あんまり考えていないとaws-sesを使ってしまいそうですね。
ちゃんと調べてライブラリを吟味するのは大事だと思っているので、これからも頑張っていろいろ考えてからライブラリを使うようにします。
今回は、たまたまaws-sdkのドキュメントを読んでいたら見つかったという感じなので、探し方も難しいですが……。

選定理由なども、たまにブログにまとめていきます。