Help us understand the problem. What is going on with this article?

SQSとSESを上手く使って通知を出そう!(後編)

More than 1 year has passed since last update.

どういう所に実装したのか

 前回の話から、今回はどこにどのように実装したのかを説明していきます。とは言っても至極かんたんな話です。

SQS

SQSはiDen(=遺伝)と呼ばれる、コンテンツツリーを作り出すためのシステムに実装しました。iDenをもう少し詳しく説明すると、その名の通りコンテンツを遺伝させるための物で、例えばAさんが作ったキャラクターをBさんが借りて継承して創作したいときに、そのキャラクターをBさんはクリエイティブ・コモンズ(以下、CC)に準拠してAさんにお願い通知を出すことが出来る機能です。
このときに配慮したのが、メッセージのやりとりはさせないこと。あくまで規定された文章にYes、Noだけでやり取りする必要があると考えました。そのため、単純なPushよりもメッセージ機能を優先しSQSを選択しています。

SES

SESはRuby on Railsの認証用gemであるdeviseを利用して認証周りを作った際に、ログインアカウントをメールアドレスにしたので、アカウント作成時にメール通知を出す必要がありました。
その際、通知メールを送信するには、当然メール送信用のSMTPサーバが必要ですし、ネットワークに設定が必要となります。それを簡略化出来るのがSESの良いところです。
これをSESとRoute53側で実装すれば1時間以内に動かすことも出来ると思います。もちろん、Gmailの法人版でも可能ですが外部のSMTPの場合、SLAの対象となるかは微妙ですし、できれば同一システム内で組んだほうが良いでしょう。
また、リージョンで分けて使えばリスクも分散されるため、メールシステムに関しては、アーキテクチャを統一したほうが良いと私は考えます。

実装上の問題

 SQSについては、RailsのgemであるShorykenを使って実装しました。ただ、このsyorykenを実装する時に、以下のように書くと、CircleCIなどのテストツールではエラーがでるため、書き方を修正しています。

config/initialize/shoryuken.rb
      Shoryuken.configure_client do |config|
  Aws.config[
    access_key_id:  ENV['環境変数_ID'],
    secret_access_key: ENV['環境変数_KEY'],
    region: "ap-northeast-1",
  ]
end

     Shoryuken.configure_server do |config|
  Aws.config[
    access_key_id:  ENV['環境変数_ID'],
    secret_access_key: ENV['環境変数_KEY'],
    region: "ap-northeast-1",
  ]
  Rails.logger = Shoryuken::Logging.logger
  Rails.logger.level = Rails.application.config.log_level
end

この、Aws.config[...を当初はconfig.aws = {と書いており、これが単体テスト時にエラーとなって先に進みませんでしたが、実装上には問題がありませんでした。書き方の問題らしいので、Aws.config[で書くことでSDKを使う場合は統一したほうが良さそうです。

SESはどうでしょうか?Ruby on Railsに付属するActionMailerを使うことでシステム全体に簡単に実装できます。殆ど設定情報を書き、deviseの認証にもメールアドレスを記述するだけです。特にコード側には問題はありません。

application.rb
       config.action_mailer.delivery_method = :smtp
       ActionMailer::Base.smtp_settings = {
        address: 'email-smtp.hoge.amazonaws.com',
        port: 587,
        domain: 'example.com',
        authentication: :login,
        user_name: ENV['環境変数_NAME'],
        password: ENV['環境変数_PASSWORD'],
     }
application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: 'info@example.com'
  layout 'mailer'
end
devise.rb
Devise.setup do |config|
   config.mailer_sender = 'info@example.com'

ですが、問題なのは、route53に設定するDKIMやSPFなどの認証に時間がかかり、そのプロセスがマニュアルとは違い一部不明瞭なため、何度か認証行程を踏むこともあり、送信が出来ない理由がそこにあります。

実際に実装してみてどうだったのか

 実装が簡単で、テストも直ぐにできるため、開発工数は相当に削減できています。基本的な機能やサービスは、なんども実装するものですから、同じパターンで実装できるようにしておくほうが効率は良いです。このように昔からある実装パターンは構築の仕方をある程度モジュール化しておくことが大事ですし、海外の開発者が短時間で組み上げているのはこのような、作らない事を重要視しているからだと思われます。
 私の開発方針は「作るな使え」です。とにかく、素早く作る事が大事です。そのためには便利なツールやインフラ基盤を活用し、車輪の再発明をどんどん減らしていくべきです。その方がずっと楽になると思います。

まとめ

 今回はSQSとSESを利用して、通知をする機能を実装しました。コード自体はシンプルに出来ていて、ライブラリやサービスがとても良く出来ているし、サーバレスアーキテクチャのため、素人でも実装できる点がとても良かったです。
 次はAWS SNS(Simple notification Service)を利用して、Push通知をアプリ含めて実装してみたいなと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away