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
はてなフォトライフをECSに移行した話 / Hatena Engineer Seminar #20
Search
cohalz
June 07, 2022
Programming
1
19k
はてなフォトライフをECSに移行した話 / Hatena Engineer Seminar #20
Hatena Engineer Seminar #20 AWS Renovation 編
https://hatena.connpass.com/event/249039/
の発表資料です
cohalz
June 07, 2022
Tweet
Share
More Decks by cohalz
See All by cohalz
はてなにおけるfujiwara-wareの活用やecspressoのCI/CD構成 / Fujiwara Tech Conference 2025
cohalz
2
2.5k
はてなのSRE組織2024 / Road to SRE NEXT@福岡
cohalz
2
1.6k
SREのキャリア、 あるいは生態 / #ya8
cohalz
11
1.6k
カンファレンスのボランティアスタッフって何やるの? / DAIMYO Meetup #4
cohalz
0
140
小さなものでも Step Functions / Serverless Meetup Fukuoka Re:boot
cohalz
0
180
ECSのCI/CD改善と標準化の取り組み / JAWS FESTA 2023 in Kyushu
cohalz
8
6.8k
ecspressoへの貢献を振り返る / JAWS-UG コンテナ支部 #24 ecspresso MeetUp
cohalz
1
6.4k
SREの異動と働き方 〜はてなブログ編〜 / Hatena Engineer Seminar #13
cohalz
0
2.3k
Envoy.なんか / Kyoto.なんか #5
cohalz
1
190
Other Decks in Programming
See All in Programming
月刊 競技プログラミングをお仕事に役立てるには
terryu16
1
1.2k
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
930
React 19でお手軽にCSS-in-JSを自作する
yukukotani
5
560
Rubyでつくるパケットキャプチャツール
ydah
0
160
CQRS+ES の力を使って効果を感じる / Feel the effects of using the power of CQRS+ES
seike460
PRO
0
240
Jaspr Dart Web Framework 박제창 @Devfest 2024
itsmedreamwalker
0
150
ESLintプラグインを使用してCDKのセオリーを適用する
yamanashi_ren01
2
210
技術的負債と向き合うカイゼン活動を1年続けて分かった "持続可能" なプロダクト開発
yuichiro_serita
0
290
サーバーゆる勉強会 DBMS の仕組み編
kj455
1
300
chibiccをCILに移植した結果 (NGK2025S版)
kekyo
PRO
0
110
「とりあえず動く」コードはよい、「読みやすい」コードはもっとよい / Code that 'just works' is good, but code that is 'readable' is even better.
mkmk884
6
1.4k
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
860
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Documentation Writing (for coders)
carmenintech
67
4.5k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Gamification - CAS2011
davidbonilla
80
5.1k
Designing for humans not robots
tammielis
250
25k
Typedesign – Prime Four
hannesfritz
40
2.5k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
The World Runs on Bad Software
bkeepers
PRO
66
11k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Transcript
はてなフォトライフを ECSに移行した話 id:cohalz / @cohalz Hatena Engineer Seminar #20 AWS
Renovation 編 1
自己紹介 • id:cohalz (こはる) • 2018年新卒入社 • 2019年からはてなブロ グのチーム 2
はてなフォトライフ について • f.hatena.ne.jp • 2004年リリース • 画像アップロードサー ビス •
はてなブログの編集画 面からもアップロード できる 3
以前のはてなフォトライフのインフラ 〜 2018年 • オンプレ • CentOS 5 • Perl
5.8.8 • MySQL 4.0 2018 〜 2021年 • EC2 • Debian 8 • Perl 5.28.1 • Amazon Aurora MySQL 5.6 4
今回のアプリケーションのECS移行 2018 〜 2021年 • EC2 • Debian 8 •
In Placeデプロイ ◦ Capistrano 2 2021年 〜 • ECS on Fargate • Debian 11 • Blue/Greenデプロイ ◦ CodeDeploy 5
6 なぜECSに移行したか
なぜECSに移行したか • トリガー: Let’s Encryptのルート証明書期限切れ • モチベ1: チームで開発・運用をしやすくする • モチベ2:
ブログのECS移行に向けての知見獲得 7
Let’s Encryptのルート証明書期限切れ • 2021/10以降OpenSSL 1.0.2以下のクライ アントからLet’s Encryptを使っているサイト に対してHTTPS接続できなくなる ◦ はてなブログやAkamai、FastlyなどのCDNも対象
◦ 構築タイミングでの依存があるかもしれない ▪ スケールをはじめ運用できなくなる恐れ 8
OSのバージョンを上げられるか • Debian 9 LTSのEOLが2022/6 • まだ社内にDebian 10以上のAMIが用意され ていなかった ◦
他のチームでコンテナ化が進んでいた • そもそも社内の古い仕組みを触るのも大変 ◦ 属人性が高い 9
10 チームで開発・運用を しやすくする
開発オーナーの移行 • 2020年に開発オーナーをブログチームに移行 ◦ ブログ起因のタスクの着手順をコントロールしやすく するため ◦ 少しずつブログ側で開発・運用していくように • ブログチームがやりやすい仕組みにしていく
◦ オーナー移行により仕組みを変えやすくなった 11
オーナー移行によりレイアウトシフト対策の 機能もブログチームで開発できた 12
ECSにしてチームで 開発・運用をしやすくする • ECSに移行することで ◦ チームが理解しやすい仕組みにしていく ▪ 世の中で広く使われている技術にする ◦ できるだけチーム内で完結できるように
▪ 他チームのリソースへの依存を減らす ▪ チーム間コミュニケーションコストの削減 13
14 ブログのECS移行に 向けての知見獲得
ブログのECS移行に向けての知見獲得 • はてなブログ本体だけEC2という状況 • トラフィックがあるサービスで移行の知見を 獲得していく 15
スコープ外も伝えておく • サブシステムの改善はついでに頼まれがち ◦ 普段気づかないものを発掘してしまうタイミング • エラー率やレイテンシの改善は今はやらない ◦ 将来的にはやりやすくなるので待って欲しいと伝えた 16
17 最初に 切り替え方針の決定
そもそものプロダクトの難しさ • 歴史のあるサービスで詳しい人がいない ◦ 2018年の移行を担当した人も退職していた • ブログと同じPerlでも違う構成要素 ◦ Apache +
mod_perl2 ◦ ImageMagick 18
19 正直わからないことだらけ
20 わからないなりに移行する
わからないなりに移行する • 大きく考えられる手段は二つ ◦ 十分に動作確認してメンテ入れて移行する ◦ カナリアリリースで少しずつ移行していく • 今回は後者でPOと方針の合意を取った ◦
問題があった時にも素早く戻しやすい 21
22 まずはDockerfileの作成
Dockerfileの作成 • ベースイメージは motemen/mod_perl • 各レイヤは社内のmod_perlのDockerfileを 全部見ていいとこ取り 23
GitHub Actionsでビルドしたい • 社内にある独自パッケージを使っていた ◦ GitHub Actionsからアクセスできない • CIを他に変えるのはあまりしたくない ◦
プロダクトごとにCIが変わってしまう ◦ 本当に社内にあるパッケージが必要か? 24
社内aptlyを使う 必要があるか確認 • POに仕様を確認し不要 と判断 • EC2側で先にパッケー ジを変えて動作確認 • コンテナでも同じパッ
ケージを使って差分を なくす 25
26 これで(おそらく)動く イメージができた
27 移行作戦
アプリケーションの移行 • ALBの加重ターゲットグループ機能を使う ◦ 0.1%刻みでトラフィックの割合を変えられる ◦ 反映も一瞬 • CodeDeployのBlue/Greenデプロイも採用 ◦
ローリングデプロイよりもロールバックが高速 ◦ ecspressoを利用 28
カナリアリリース前に事前に確認 • ALBのリスナールールを変更して特定のヘッ ダをつけたらECSに流れるように ◦ これで割合に関係なくリクエスト先を選べるように 29
移行の構成図 30
Mackerelのダッ シュボードで確認 • EC2とECSのターゲッ トグループを式グラフ で同じグラフに載せる • 割合を50:50にしてエ ラー率とレイテンシが ほぼ一致していること
を確認 31
いくつか気づいた点 • 加重ターゲットグループを使っているときは B/Gデプロイができない ◦ 一旦加重ルーティングをやめて両方デプロイしその後 戻すことが必要 ▪ とはいえEC2の台数を減らしてなければ問題にはならない 32
いくつか気づいた点2 • どっちにリクエストが流れているか分かりづ らい ◦ ヘッダなどで区別をつけられると良い ◦ 開発者の検証用ならfaviconを変えるのもオススメ 33
ecspressoにフィー ドバック いくつか欲しかった機能を 追加 • CodeDeployのロール バック • initでタグもインポート •
desiredCountのdiff • Terraform Cloud対応 34
35 アプリケーションの 移行完了
36 最後にバッチの移行
バッチの移行を考える • cronで動かしていた • 一つ一つまだ必要かPOに確認 • 実行時間は短いものしかなかったのでリクエ ストベースでの実行に変更していく ◦ 最低限APIキー認証だけ含める
37
バッチ移行先 • リクエストを受けるエンドポイントを増やす のも大変でちゃんと動くかわからない • SQLを実行するバッチは事前に安全なクエリ に差し替えて動くのを確認 ◦ レスポンスに実行したSQLのクエリと実行時間と成功 失敗を含めてデバッグしやすいように
38
バッチのトリガー EventBridge + Lambda • LambdaがHTTPリクエ ストを送る • Mackerelに実行時間と 成功/失敗をメトリック
にして送る • 他チームで動いている ものを真似して再実装 39
40 こうして移行完了
おわり • プロジェクト期間は約2ヶ月ほど ◦ 大きな問題も発生せず完了 • この知見を元にはてなブログ本体のECS移行 も進行中 41
(参考) 2018年に行った移行について • MySQLをアップデートする話 - Hatena Developer Blog • Hatena
Engineer Seminar #11で「MySQL自前運用やめて Aurora導入する話」した - 角待ちは対空 • Legacy Meetup Kyotoで「レガシーシステムとインフラオー ナーシップ 」という発表した - 角待ちは対空 42