Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rubyで Amazon CloudWatch Events 定期ジョブを書けるやつ作った話

Rubyで Amazon CloudWatch Events 定期ジョブを書けるやつ作った話

Shinjuku.rb #43の発表内容です。

Yuichi Takeuchi

November 30, 2016
Tweet

More Decks by Yuichi Takeuchi

Other Decks in Technology

Transcript

  1. @takeyuweb • VAIOスキー • 高専卒 • 元フリー→法人成り • 大宮在住 •

    32歳既婚一児の父 • 最近のマイブームは Tree of Savior (MMORPG)
  2. crond • 定番 • Unix系OSでジョブ(コマンド)スケジューリングするやつ • バッチ処理など • whenever gem

    • Ruby DSLでスケジュールを書く • デプロイ先でコマンド実行するスケジュール書き換え
  3. crond: whenever job_type :runner, "cd :path && bundle exec ruby

    bin/rails runner -e :environment ':task' :output" every 5.minutes do runner 'Video.schedule_activation_all' runner 'Video.expire_grace_all' runner 'Content::Recommendation::Popularity.randomize_all' runner 'Content::List::List.schedule_activation!' runner 'Content::List::List.schedule_expiration!' end every '0 2 20 * *' do runner "Video.create_sale_list(Time.current)" end
  4. crond: pros and cons pros • 基本的なコマンド • 導入が簡単 •

    学習コスト小さい • 手軽 cons • 冗長化めんどい • 1台のバッチ処理用サーバに • 単一障害点 • 負荷が集中
  5. これ使えそう!たとえば… 1. 定期的にLambdaファンク ション起動 2. Lambdaファンクションか らSQSにジョブ登録 3. ワーカー(1台以上)でジョ ブを取り出す

    4. 実行 AWS Lambda ... イベント発生時にアップロードしたコード(JavaScriptなど)を AWS内で実行してくれるやつ AWS SQS ... フルマネージドのメッセージキュー。
  6. コマンドを実行する $ bundle exec kyklos -c config/schedule.rb ¥ > --adapter

    shoryuken ¥ > --adapter_args=[queue_url] ¥ > --identifier=nanairo_production
  7. ワーカーを起動する $ bundle exec shoryuken ¥ > -r ./kyklos_worker.rb ¥

    > -C config/shoryuken.yml これでRubyで書いたスケジュールに基づいて、 1.定期実行ジョブが登録され 2.ジョブに対応するRubyコードが実行されます。 shoryuken ... AWS SQSをバックエンドに使っている、非同期処理用のgem
  8. 何が起きたか?(1) • kyklosコマンド 1. Ruby DSL→定期実行ルールリストを組み立て 2. AWS SDKで登録 1.

    CloudWatchEventsに組み立てたルールとスケジュールを登録 2. SQSキューにpushできるようにポリシードキュメント編集
  9. gemにした • kyklos: キクロス • 「周期」とかのギリシア語 • lambda = λ

    : ギリシア文字 • はじめlambdaでSQS登録するやつ 作ろうと思ってたから。 • ただし1日ででっちあげたや つなので課題はいろいろある • ロールまわり • APIエラーハンドリング • 実行結果の取得と再実行など • shoryuken以外のアダプタ • そのほか運用に耐えうる機能
  10. Amazon SQSの問題 • メッセージ(ジョブ)は少なくとも1回 • 必ず1回は配信される(at-least-once) • 2回以上配信される場合がある • 繰り返し実行されても同じ結果になるように

    注意して設計する必要がある(冪等性) • 順番を保証しない • キュー内に複数のメッセージがあるとき、 到着順が前後することがある • 順番に依存する設計はまずい • (でもこれはCRONでもそう。普通時間を空けるとかしますよね) https://speakerdeck.com/takeyuweb/rails-on-awsdefalsefei-tong-qi
  11. 2016/11/17 殺伐としたSQSに救世主が!! • FIFO • 先入れ先出し First-In First-Out • 順番が保証される!

    • Exactly-Once Processing • 1つのメッセージは1回しか実行 されない • Deduplication • 誤って多重登録されることを自 動で防ぐ • 5分以内に同じ内容のメッセー ジがあったら無視 ※ただし東京リージョンはまだ。
  12. 開発パートナー/社員募集 • Ruby on Rails Webアプリケーションや、PowerCMSによる CMSなど、弊社受注案件を一緒に開発してくれるフリーランス 開発者を探しています。 • 完全リモート可

    • 条件交渉可 • 最低稼働時間の取り決め無し可 • 会社勤めしたくなくて引きこもりフリー開発者だった僕でも 「働いてもよいかも」と思える会社にする方法を考え中です。 • 完全リモート可 • 自由研究制度 • カンファレンス参加費が経費で出る 予定 タケユー・ウェブ株式会社 https://takeyuweb.co.jp/