⼩ネタ共有アプリ

におけるRubyとパブリッククラウドを活⽤した
クラウドネイティブなシステム開発
Rubyとパブリッククラウドの親和性

株式会社Relic エンジニア
だい けんたろう臺 健太郎© Copyright 2020 Relic Inc. All rights reserved.

Speaker紹介
だいけんたろう臺 健太郎
⼤阪府出⾝。2019年9⽉にはじめてプログラムを書き、その後、株式会社Relicに⼊社。（エンジニア歴は2年7ヶ⽉）

Rails, Nuxt.js, TypeScript, AWS(CFn,CDK,SAM), GCP,Docker, GitHubActions, CircleCI, etc
https://twitter.com/kenkentarouu
https://www.facebook.com/kentaro.di/https://www.slide-commenter.com/

⽬次
開発プロダクト概要
昨今の新規事業開発のトレンド
Rubyを新規事業開発に使うメリット
Ruby/パブリッククラウド連携の分類
Ruby on Rails(Web API)からプッシュ通知配信
Ruby on Rails(Web API)とBigQueryの連携
Pumaとクラウドによる堅牢なRubyアプリケーションの構築
RakeタスクとAmazon ECSを連携したバッチ処理
Sinatraを使ったAWS SAMによるサイドApp開発
まとめ3

開発プロダクト概要

開発プロダクト概要

まちの⼩ネタ共有アプリ

https://lp.loupe-app.com/

Loupeは株式会社NTTドコモの新規事業創出プログラム「39works」から⽣まれ、株式会社Relicがサービス提供しています。

昨今の新規事業開発のトレンド

昨今の新規事業開発のトレンド
短期間での⾼速なプロダクト開発/検証
MVPから本格商⽤までの⼀貫したスケーラビリティ
パブリッククラウドの活⽤による低⼯数/低コストでフルマネージドなインフラ運⽤
既存事業の短命化

導入期

成長期

成熟期

衰退期

売上
高時
間

Rubyを新規事業開発に使うメリット

Rubyを新規事業開発に使うメリット

パブリッククラウドとのインテグレーションを⽬的としたライブラリが豊富

サーバレスコンピューティングとの相性もよくフェーズに応じたアプリケーションの柔軟なスケールが可能

Ruby Style Guide やRuby on Rails によるコーディングルールが充実していることで新規事業特有の流動性の中でもコード品質の維持が容易Ruby / パブリッククラウド連携の分類

Ruby / パブリッククラウド連携の分類● 今回ご紹介するRubyとパブリッククラウド連携の事例整理

⼤分類

クラウド連携Rubyとの親和性の背景

機能開発

●

push通知配信基盤●AWS SDK●

FirebaseAnalytics/BigQuery連携●

GCP SDK （データ分析基盤と連携）●●●

サーバーのスケーラビリティ
バッチ処理基盤
ServerlessApplicationの構築●●●

Puma + Fargate
Fargate + EventBridge + Rakeタスク
AWS Serverless Application Modelとの連携

データ分析基盤

実⾏基盤

Ruby on Rails(Web API)からプッシュ通知配信

Ruby on Rails(Web API)からプッシュ通知配信
push配信

APNs(iOS)
GCM(Android)

push通知のトリガー

Rubyアプリケーションとプッシュ通知の配信/予約を連携
各端末のエンドポイント
へpush

AWS CloudトピックA

workerAPP

publishAmazon ECSAmazon ECS

Redis
ジョブを
enque

ジョブをdeque

⾮同期処理

AmazonSNS

publishpublish

ジョブを
実⾏

エンド
ポイントA

エンド
ポイントB

エンド
ポイントC

aws-sdk-sns
subscribe
エンドポイントC●

ユーザーのアクションをトリガーにした膨⼤なpush通知の安定配信を実現●

アプリの通信遅延の抑⽌のために⾮同期処理基盤SidekiqやRedisを活⽤Ruby on Rails(Web API)とBigQueryの連携

Ruby on Rails(Web API)とBigQueryの連携● FirebaseAnalytics取得した投稿の閲覧(PV)数などのデータを分析する必要● BigQueryで保管し、そのデータをRuby on Rails (WebAPI)により呼び出す機構を構築● gem「 google-cloud-bigquery」を活⽤しシームレスにBigQueryのデータ分析を実現

Firebase
Analytics

pageviewなどのイベント

１⽇⼀回定期的にFAのデータをBigQueryにエクスポートしてBigQuery上で永続化

データを蓄積BigQuery

ユーザー

連携
BigQueryのSQLパラメータを付加してAPIリクエスト
Ruby on Rails(WebAPI)

管理画⾯

Ruby on Rails(WebAPI)を介してBigQueryの実⾏結果を受け取る

リクエスト・レスポンス

Pumaとクラウドによる堅牢なRubyアプリケーションの構築

Pumaとクラウドによる堅牢なRubyアプリケーションの構築

Rubyでアプリケーションを作る時には同時処理能⼒の⾼いPumaを使うことができ、パブリッククラウドと連携することでRubyのエコシステムの恩恵を受けたスケーラブルなサービスを構築できる

Ruby/RackアプリケーションサーバーPumaのクラスタモードを活⽤してプロセスを複製してマルチスレッド化した上でスレッド数を増やし、より効率的に多くのリクエストを受け付けることが可能

Amazon ECSが提供する「AutoScaling」機能を組み合わせることで、⾼いスケーラビリティを持つシステムを構築

概念図● PumaとAmazon ECSが提供する「AutoScaling」機能を組み合わせて効率的にスレッド等を管理
worker = pumaの親プロセスからforkした⼦プロセス
空いているworkerにリクエストを素早くルーティング
Amazon ECS
CPU: 2core

Amazon RDS

pool: 6thread: 3

socketworker: 2

max connections: 1000
DBのmax connectionsを⽬安にworker数やthread数を柔軟に調整

Auto Scale

Auto Scaleにより接続できるthread数を柔軟に増加

・・・・増減RakeタスクとAmazon ECSを連携したバッチ処理

RakeタスクとAmazon ECSを連携したバッチ処理● 従来のコンテナや仮想サーバ⾃体にcronを設定する⽅法よりも、より簡単にバッチ処理の構築/拡張を実現

RakeタスクとAmazon ECSのタスクスケジューリングを組み合わせてバッチ処理⽤のタスクを⾃動配備

AWS Cloud
VPC

ECSTaskScheduleで管理

Amazon ECS
Fargate
task

ターゲット
Rule

AmazonEventBridgecron(0 11 * * ? *)Amazon ECR

更新pushContainer
バッチ処理タスク実⾏（Rakeコマンド）

GitHub
ActionsSinatraを使った
AWS SAMによるサイドApp開発

Sinatraを使ったAWS SAMによるサイドApp開発● 投稿がSNS等でシェアされた際のリンク先として、OGPを含むwebページを表⽰する
webアプリをRuby製WebアプリケーションフレームワークSinatraを使って実装。
AWS SAMをベースにサーバレスアーキテクチャでAWS Cloud

ローカルホスティングし⾼可⽤性とスケーラビリティを実現

SAM

Amazon ECR

Sinatraの特性を⽣かして、

Amazon S3

最⼩限の記述量でアプリを構築

Sinatraアプリケーションのイメージをpush

DockerfileやTemplate

Sinatra反映

Sinatraのソース

AmazonAPI Gateway

AWS CloudFormation

Stack

AWS
Lambdaまとめまとめ

Rubyとパブリッククラウドの掛け合わせにより低コスト/低⼯数で安定した機能開発

豊富なライブラリを活⽤しデータ分析基盤との連携も容易に
Rubyのエコシステムとパブリッククラウドの掛け合わせにより堅牢なバックエンドサーバーを構築

株式会社Relicでは今後も新規事業開発にRubyを活⽤し数々のサービスを世に送り出していきます。

ご清聴ありがとうございました！

今年、島根県に開設した拠点「松江イノベーションスクエア」