Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
手段先行でも悪くはない!Ruby on Lambdaで はじめるServerless / aw...
Search
ぷぽ
March 27, 2019
Technology
2
900
手段先行でも悪くはない!Ruby on Lambdaで はじめるServerless / aws serverless tech
「AWS Serverless Tech/事例セミナー - サーバーレスで Ruby 他、いろんな言語が使えるよ」で登壇した内容です。
ぷぽ
March 27, 2019
Tweet
Share
More Decks by ぷぽ
See All by ぷぽ
こわくない、越境(改) - 小心者でも越境マンになれた理由 - / DevLoveKansai 20180825
pupupopo88
1
32k
こわくない、越境 - 小心者でも越境マンになれた理由 - / DevLove 201
pupupopo88
3
2.7k
採用・研修に携わる意義をつたえるために / DevLove 199
pupupopo88
1
990
Other Decks in Technology
See All in Technology
Why does continuous profiling matter to developers? #appdevelopercon
salaboy
0
190
複雑なState管理からの脱却
sansantech
PRO
1
140
Adopting Jetpack Compose in Your Existing Project - GDG DevFest Bangkok 2024
akexorcist
0
110
スクラム成熟度セルフチェックツールを作って得た学びとその活用法
coincheck_recruit
1
140
100 名超が参加した日経グループ横断の競技型 AWS 学習イベント「Nikkei Group AWS GameDay」の紹介/mediajaws202411
nikkei_engineer_recruiting
1
170
Security-JAWS【第35回】勉強会クラウドにおけるマルウェアやコンテンツ改ざんへの対策
4su_para
0
180
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
430
Application Development WG Intro at AppDeveloperCon
salaboy
0
190
Amazon Personalizeのレコメンドシステム構築、実際何するの?〜大体10分で具体的なイメージをつかむ〜
kniino
1
100
iOSチームとAndroidチームでブランチ運用が違ったので整理してます
sansantech
PRO
0
130
テストコード品質を高めるためにMutation Testingライブラリ・Strykerを実戦導入してみた話
ysknsid25
7
2.6k
透過型SMTPプロキシによる送信メールの可観測性向上: Update Edition / Improved observability of outgoing emails with transparent smtp proxy: Update edition
linyows
2
210
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
860
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
The Language of Interfaces
destraynor
154
24k
Code Review Best Practice
trishagee
64
17k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
370
Building Your Own Lightsaber
phodgson
103
6.1k
Optimizing for Happiness
mojombo
376
70k
How to Ace a Technical Interview
jacobian
276
23k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Speed Design
sergeychernyshev
25
620
Transcript
Ruby on Lambdaで はじめるServerless 2019-03-27(水) AWS Serverless Tech/事例セミナー 株式会社ヴァル研究所
福本江梨奈 \手段先行でも悪くはない/
?
None
None
None
None
None
None
None
None
❖ 会社・チーム概要 ❖ なぜ Ruby on Lambda ? ❖ 検討
/ 導入事例 ❖ 今後の展望 ❖ まとめ アジェンダ
コンシューマー向けWebアプリ担当 インフラ〜フロントまでなんでもやる フルなんちゃらエンジニア 自己紹介 福本 江梨奈 @pupupopo88 Rubyという言語とコミュニティが大すき
インフラ周りは四苦八苦しつつ勉強中...
ձࣾ / νʔϜ֓ཁ
❖ 創業:1976年 ❖ 従業員:160名弱 ❖ メイン商材:駅すぱあと ヴァル研究所
MSDOS版 駅すぱあと
Web App
カレンダーに予定を 入れるだけ!
❖ 創業:1976年 ❖ 従業員:160名弱(エンジニアは4割ほど) ❖ メイン商材:駅すぱあと ❖ 開発言語はサービスによってバラバラ ❖ ここ数年の新人研修ではRubyを導入しているた
め、若い人は多少触れる…はず ヴァル研究所
❖ 駅すぱあとに関連した、コンシューマ向けのサー ビスを開発運用 ❖ iOSアプリ、Androidアプリ、Webアプリ…etc 所属チーム
Web App さっきのこれとか
❖ 駅すぱあとに関連した、コンシューマ向けのサー ビスを開発運用 ❖ iOSアプリ、Androidアプリ、Webアプリ…etc ❖ リーダー + メンバー9人 ❖
iOS / Android / Web でなんとなくな班わけ 所属チーム
❖ 所属チーム(Web商材)のメイン言語がRuby ❖ Rails(5.2以上)、Sinatra、時々Java… なぜ Ruby on Lambda?
❖ 所属チーム(Web商材)のメイン言語がRuby ❖ Rails(5.2以上)、Sinatra、時々Java… ❖ リーダーがRubyすき なぜ Ruby on Lambda?
❖ 所属チーム(Web商材)のメイン言語がRuby ❖ Rails(5.2以上)、Sinatra、時々Java… ❖ リーダーがRubyすき なぜ Ruby on Lambda?
❖ 所属チーム(Web商材)のメイン言語がRuby ❖ Rails(5.2以上)、Sinatra、時々Java… ❖ リーダーがRubyすき ❖ 私もすき なぜ Ruby
on Lambda?
❖ 所属チーム(Web商材)のメイン言語がRuby ❖ Rails(5.2以上)、Sinatra、時々Java… ❖ リーダーがRubyすき ❖ 私もすき ❖ 好き大事!!!
→チームではRuby on Lambdaを推奨していく方針 なぜ Ruby on Lambda?
ところで
ਓͳͥɺ4FSWFSMFTTΛ ࢦ͢ͷ͔ʜ
https://aws.amazon.com/serverless/?nc1=h_ls
❖サーバーの管理が不要 ❖柔軟性のあるスケーリング ❖価値に対する支払い ❖高可用性の自動化
❖サーバーの管理が不要 ❖柔軟性のあるスケーリング ❖価値に対する支払い ❖高可用性の自動化
ʘΘ͔͠͞Βղ์͞Ε͍ͨʗ
❖ (誰も)慣れていない言語で書かれているとメンテが大変 ❖ そもそもコードレビューも満足にできない ❖ リファクタリングする気が起きない ❖ いざメンテが発生した時に時間がかかる つらかったPython 学習きっかけにはなった
→他の言語を触ってみるのは良いこと
でもこれからは…!
ݕ౼ࣄྫ
όοναʔόͷ ஔ͖͑
❖ ガラケーおよび、スマホのキャリア公式サービス の様々なバッチ処理を雑多に詰め込んだ闇鍋… もとい闇サーバ どんなバッチサーバ?
まだまだ運用中…
❖ ガラケーおよび、スマホのキャリア公式サービス の様々なバッチ処理を雑多に詰め込んだ闇鍋… もとい闇サーバ ❖ 全体把握している人は…?→メンテ難しい ❖ 中身は全てRubyのスクリプトで、cronで定期的に 実行している どんなバッチサーバ?
保存 アプリケーションで 使用するデータを取得 (JSONとか)
データ取得 集計データを メールで飛ばす
アプリケーションで 使用するデータを取得 保存
❖ (バージョンの違いはあれど) 元がRubyのスクリプトだからそのまま使えそう ❖ CloudWatch Eventsでcron実行できる ❖ バッチ処理のLambda化はこれまでも事例があ り情報は豊富そう そのまま移行できそう!
例えば
データ取得 データ保存
CloudWatch Events (cron設定できる!) データ取得 データ保存
試してみた…
しかし問題が…
❖ Rubyの外部ライブラリ(Gem)はnative extensions (libxml2とか)を利用しているものがある ❖ 有名どころ:nokogiri, mysql, pgなど… native extensions
問題 よくある「nokogiriインストールできない問題」 はだいたいこの辺が原因
❖ Rubyの外部ライブラリ(Gem)はnative extensions (libxml2とか)を利用しているものがある ❖ 有名どころ:nokogiri, mysql, pgなど… ❖ これらのGemを利用するには、
実際に利用する環境と同等の環境でinstallする必 要がある ❖ OSSでLambda用のDockerコンテナが提供されて いるのでそちらを活用すると良さそう native extensions 問題 参考:https://www.stevenringo.com/ruby-in-aws-lambda-with-postgresql-nokogiri/
ざっくりいうと
lambci/lambda:build-ruby2.5 install bundle install deploy 場合によってはこいつを 別途個別管理したり…
それだけじゃない…
RDBMSとLambdaの相性問題 ❖ Functionごと(コンテナごと)にDBへのコネクショ ンが張られるため、負荷増加やコスト増加になる 参考:https://www.keisuke69.net/entry/2017/06/21/121501
コネクション 使い回せない…! 一月間隔! 一日間隔! 十分間隔! 一分間隔!!
❖ Functionごと(コンテナごと)にDBへのコネクショ ンが張られるため、負荷増加やコスト増加になる 参考:https://www.keisuke69.net/entry/2017/06/21/121501 ❖ LambdaからDBに接続するための中間層作る…? ❖ AWS Aurora
Serverlessならいけるみたいだけど、 PostgreSQLから移行…する…? https://dev.classmethod.jp/cloud/aws/amazon-aurora-serverless-avaible-http-endpoint/ RDBMSとLambdaの相性問題
None
❖ サーバをなくしたい、管理をラクにしたいという目的 に逆行する ❖ 依存しているnative extensionsをインストールし たLambdaコンテナを別途管理する…? ❖ Function数が多くバッチ処理の間隔も短いため、 RDSのconnection数、DBの移行コストを考えると
あまり現実的ではない ❖ DBの問題が解決できず、全バッチを移行できない (サーバが残る)ため旨味が少ない… 移行は見送り
όοναʔόͷ ஔ͖͑ อ ཹ
؆қAPIαʔόͷ ஔ͖͑
❖ ガラケー用Webアプリにて、一部のコンテンツペー ジを表示する際に利用 どんなAPIサーバ?
例えば:My天気情報 自分が登録した地域の 週間天気が表示される
APIアクセス データ取得 ページアクセス
❖ ガラケー用Webアプリにて、一部のコンテンツペー ジを表示する際に利用 ❖ memcachedからデータを引っ張ってきて、 JSONで返す ❖ Ruby(Sinatra)製 ❖ ほぼメンテされてなかったので
アップデートとかもしたかった… どんなAPIサーバ?
❖ API Gateway + Lambdaで実現できそう ❖ 既に他言語での事例がたくさんあるのでRuby だっていけるはず! ❖ エンドポイントもかなり少ない、アクセスも少な
いのでAPI Gateway + Lambda向き! そのまま移行できそう!
つまり
ページアクセス APIアクセス データ取得
具体的に検討してみた…
⁉ けど…
そもそもこの機能自体 いらない!!!! (ということに気がついた)
❖ 利用者数 vs 運用コストの関係で、ガラケーサイ トのコンテンツ自体少しずつCloseしていってた ❖ 占い、晩御飯のレシピ、鉄道画像コーナー… ❖ APIサーバが担う部分が減ってきた どうして?
❖ 利用者数 vs 運用コストの関係で、ガラケーサイ トのコンテンツ自体少しずつCloseしていってた ❖ 占い、晩御飯のレシピ、鉄道画像コーナー… ❖ APIサーバが担う部分が減ってきた ❖
かろうじて残る機能も、別サーバから直接データ を取得できることが判明 ❖ アクセス負荷も(今は)あまり心配いらない どうして?
全体図
これは不要 これ使うので
None
❖ サーバ(コンテンツデータAPI)そのものを無くそ うという方向に ❖ Lambdaを使いたいがために、不要なものをそ のままにしておく or 新しい環境をつくるなど 言語道断 移行は見送り
❖ サーバ(コンテンツデータAPI)そのものを無くそ うという方向に ❖ Lambdaを使いたいがために、不要なものをそ のままにしておく or 新しい環境をつくるなど 言語道断 移行は見送り
\これが本当のServerless/
❖ サーバ(コンテンツデータAPI)そのものを無くそ うという方向に ❖ Lambdaを使いたいがために、不要なものをそ のままにしておく or 新しい環境をつくるなど 言語道断 移行は見送り
\これが本当のServerless/
؆қAPIαʔόͷ ஔ͖͑ อ ཹ
ϓϧϦΫ͓Βͤbotͷ ஔ͖͑
❖ 会社全体のコミュニケーションツールとしてSlack を利用中 ❖ 朝会(10:00)前に、プルリクが出ているものを チームのチャンネルにお知らせ どんなbot?
締切近いのをピックアップ してくれたりも パッと分かるよう タイトルに日付入れる運用
❖ 持っている商材が多く、リポジトリ数も膨大 ❖ 比較的モダンなものから、あまり触れたことの ないものまで… ❖ TeamIDと紐づいているリポジトリだけでも45… ❖ プルリクを出しても気付かれない、忘れられる、 (最悪数年後closeされる)ってことがあった
❖ (当時は)Lambda + Pythonの学習 作った元々の背景
❖ (前述の)メンテ問題 ❖ ずっと直したいバグがあった&Rubyならやる気が 上がる Ruby移行の背景
❖ (前述の)メンテ問題 ❖ ずっと直したいバグがあった&Rubyならやる気が 上がる ❖ このイベント ❖ むしゃくしゃしたので意地でもRuby on
Lambda 使いたかった Ruby移行の背景
❖ CloudWatch Events ❖ Ruby on Lambda ❖ GitHub API
v3 ❖ Slack API(& Incoming WebHooks) 構成
ϓϧϦΫ͓Βͤbotͷ ஔ͖͑ Ҡ ߦ ྃʂ
❖ 感覚で使える、便利機能・メソッドが豊富 ❖ each周りとか、.digとか、&.とか、とにかくデー タが扱いやすい ❖ Rubyの標準機能のみで完結することができたため、 bundle installの必要もなくメンテがラク ❖
ローカル環境でDebugしやすい ❖ あんなこともできそう、こんなこともしたい!と 機能が充実してくる(モチベが上がる) 移行してよかったところ
通知除外するパターン設定
好きなメッセージを付与 デフォルトはメッセージなし アイコンと合わせて自分好みのbotに…!
Layersに設定してみたり 最低限の設定で 誰でも利用可能! https://github.com/pupupopo88/pr_slack_notifier
そういえば…
Ruby遅いとか言う人もいるし 高機能にもなったし
Pythonより遅くなっ…た 34.4 sec
だ…ろ……、えっ? 23.8 sec
さすがにLayersは…、えっ? 25.2 sec
❖ Pythonで書いたコードがかなりだった可能性 ❖ 45リポジトリのプルリク取得してるので ちょっとの差が響いてくる ❖ Pythonで書いたやつの方が単純な作りだったはず… Pythonも内部ライブラリだけで書いてたけど… ❖ 気持ちが通じた(???)
❖ ちなみにどっちもウォームスタートでVPC外 なぜ早くなった???
͖ɾಘҙਖ਼ٛʂ \よくわからないけど/
❖ Slackでの発言内容に反応して情報を取得する ❖ API Gateway + Lambda + Slack Bot
❖ 「締め切り間近のプルリクは?」とか挑戦中… ❖ 通知対象条件の充実 ❖ 今はタイトルとリポジトリ名のみ まだまだ拡張の余地
ࠓޙͷల
ݕ౼͍ͨ͜͠ͱ
❖ ガラケーやスマホ公式サイトのユーザー登録で利用 ❖ 元々メールサーバだったものを Lambda(Python)+SendGridで置き換えた ❖ これを作り終わったくらいでRubyが… ❖ 同じくメンテがしづらい… ユーザ登録用空メール送信
スクリプトの移行
ユーザー登録 ワンタイム token保存とか メール送信 受信メールの情報と突合 その後の処理へ
ΑΓϥΫͳӡ༻Λ ࢦͯ͠
❖ (Rubyに限らず)本番稼働している環境が少ない、変更もそ う多くないため、管理・運用の最適化まで行き届いていない ❖ 正直今は手動でzipで固めてコンソール上からアップする ことがほとんど(やっててもshellくらい) ❖ samも触ってみたけど個人的にあまりしっくりこなかった →今持っているものからすると機能過多に感じた ❖
GitHubのリポジトリ数を圧迫するし…で、 Lambda関連のリポジトリを一つにまとめてしまってる ❖ Ruby, Pythonごちゃ混ぜ、商材ごちゃ混ぜ 悩みどころ:管理・運用
ぜひ知見ください✋
·ͱΊ
❖ 簡単な処理であればすぐ書ける ❖ 便利な機能が標準で備わっており、データの取り 回しがしやすい ❖ Debugしやすい ❖ 好き・得意な言語を使うことでラクに楽しく! Ruby
on Lambdaは楽しい
❖ 簡単な処理であればすぐ書ける ❖ 便利な機能が標準で備わっており、データの取り 回しがしやすい ❖ Debugしやすい ❖ 好き・得意な言語を使うことでラクに楽しく! ❖
より大切なことに時間を使える! Ruby on Lambdaは楽しい
❖ 使用するGemの種類によっては別途環境を用意・ 管理する必要がある ❖ 今後積極的に活用していく計画があればよいが、 Rubyバージョンがバラけると苦しくなりそう ❖ 使い所は分かれると思う ❖ 1秒単位に何かするくらいの速さを求められる
と厳しいかも… ここが大変Ruby on Lambda
手段先行でも悪くはない ❖ 「Tryしてみたけどやめた」の積み重ねは無駄ではない ❖ 既存アーキテクチャの深い理解に
ここ、そうなってたんだ アーキテクチャの深い理解 あれ、これいらなくない? こんなサーバがあったなんて…
こんなに 潰せた
手段先行でも悪くはない ❖ 「Tryしてみたけどやめた」の積み重ねは無駄ではない ❖ 既存アーキテクチャの深い理解に ❖ 理想の構成を考え、新サービスも知るきっかけに
そもそもこの作りはどうなんだ…? 理想の構成を考えるきっかけ 今はこんな便利な サービスがあるのか! こうなってたらよかったのに…
❖ 「Tryしてみたけどやめた」の積み重ねは無駄ではない ❖ 既存アーキテクチャの深い理解に ❖ 理想の構成を考え、新サービスも知るきっかけに ❖ 運用改善、新規案件でServerlessも視野に入る 手段先行でも悪くはない
Serverlessも視野に入る いつも通り、 インスタンス立てて… 以前 あれ、これこそ Lambdaでいいのでは… 現在
❖ 「Tryしてみたけどやめた」の積み重ねは無駄ではない ❖ 既存アーキテクチャの深い理解に ❖ 理想の構成を考え、新サービスも知るきっかけに ❖ 運用改善、新規案件でServerlessも視野に入るように ❖ AWS様へのフィードバックでサービス改善に
手段先行でも悪くはない
使う フィードバック サービス改善 ユーザ増える 知見集まる
使う フィードバック サービス改善 ユーザ増える 知見集まる Win-Win !!
❖ 「Tryしてみたけどやめた」の積み重ねは無駄ではない ❖ 既存アーキテクチャの深い理解に ❖ 理想の構成を考え、新サービスも知るきっかけに ❖ 運用改善、新規案件でServerlessも視野に入るように ❖ AWS様へのフィードバックでサービス改善に
→AWS様も我々ユーザーも明るい未来へ!!! 手段先行でも悪くはない ただし、Lambdaを使うこと自体をゴールにしない (学習自体が目的だったらよいと思います)
❖ いきなり「さぁServerlessだ!」と意気込んで やっていくと怪我するかも ❖ 学習コストはもちろん、「言語」「全体構成」 「管理」「デプロイ方法」などなど、考えなけ ればいけないことは結構多い ❖ まず、小さな機能からやってみて感覚をつかむ ❖
運用改善したいところから少しずつ組んだり置き 換えを検討すると、思わぬ副次効果もあってよい 小さく始めるのがオススメ
タイトルテキスト ͓·͚
❖ Lambda用のコンテナを使いやすくする何か? ❖ 特にRuby2.6でbundlerが標準になったので、同 等環境でのGemインストールがしやすくなるの では? ❖ 最低限メジャーなGemが使えるコンテナを指定 できるとか ❖
Aurora移行しなくても…そのままLambdaが使いや すく…なれば…(わがまま AWS様へのお願い