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
3
4.8k
はてなのSRE組織2024 / Road to SRE NEXT@福岡
cohalz
2
1.7k
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.9k
ecspressoへの貢献を振り返る / JAWS-UG コンテナ支部 #24 ecspresso MeetUp
cohalz
1
6.7k
SREの異動と働き方 〜はてなブログ編〜 / Hatena Engineer Seminar #13
cohalz
0
2.3k
Envoy.なんか / Kyoto.なんか #5
cohalz
1
200
Other Decks in Programming
See All in Programming
Domain-Driven Transformation
hschwentner
2
1.9k
ASP. NET CoreにおけるWebAPIの最新情報
tomokusaba
0
370
SRE、開発、QAが協業して挑んだリリースプロセス改革@SRE Kaigi 2025
nealle
3
4.3k
お前もAI鬼にならないか?👹Bolt & Cursor & Supabase & Vercelで人間をやめるぞ、ジョジョー!👺
taishiyade
6
4k
XStateを用いた堅牢なReact Components設計~複雑なClient Stateをシンプルに~ @React Tokyo ミートアップ #2
kfurusho
1
890
Linux && Docker 研修/Linux && Docker training
forrep
24
4.5k
第3回関東Kaggler会_AtCoderはKaggleの役に立つ
chettub
3
1k
Multi Step Form, Decentralized Autonomous Organization
pumpkiinbell
1
730
Rails アプリ地図考 Flush Cut
makicamel
1
120
[JAWS-UG横浜 #80] うわっ…今年のServerless アップデート、少なすぎ…?
maroon1st
1
180
『品質』という言葉が嫌いな理由
korimu
0
160
AWSマネコンに複数のアカウントで入れるようになりました
yuhta28
2
160
Featured
See All Featured
Fireside Chat
paigeccino
34
3.2k
A designer walks into a library…
pauljervisheath
205
24k
Code Review Best Practice
trishagee
67
18k
Rails Girls Zürich Keynote
gr2m
94
13k
4 Signs Your Business is Dying
shpigford
182
22k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Faster Mobile Websites
deanohume
306
31k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.6k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Building Adaptive Systems
keathley
40
2.4k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
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