Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
20k
はてなフォトライフを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
toittaにOpenTelemetryを導入した話 / Mackerel APM リリースパーティ
cohalz
1
790
はてなにおけるfujiwara-wareの活用やecspressoのCI/CD構成 / Fujiwara Tech Conference 2025
cohalz
3
9k
はてなのSRE組織2024 / Road to SRE NEXT@福岡
cohalz
2
2.1k
SREのキャリア、 あるいは生態 / #ya8
cohalz
11
1.8k
カンファレンスのボランティアスタッフって何やるの? / DAIMYO Meetup #4
cohalz
0
230
小さなものでも Step Functions / Serverless Meetup Fukuoka Re:boot
cohalz
0
250
ECSのCI/CD改善と標準化の取り組み / JAWS FESTA 2023 in Kyushu
cohalz
8
7.5k
ecspressoへの貢献を振り返る / JAWS-UG コンテナ支部 #24 ecspresso MeetUp
cohalz
1
8.1k
SREの異動と働き方 〜はてなブログ編〜 / Hatena Engineer Seminar #13
cohalz
0
2.5k
Other Decks in Programming
See All in Programming
MAP, Jigsaw, Code Golf 振り返り会 by 関東Kaggler会|Jigsaw 15th Solution
hasibirok0
0
230
Go コードベースの構成と AI コンテキスト定義
andpad
0
120
宅宅自以為的浪漫:跟 AI 一起為自己辦的研討會寫一個售票系統
eddie
0
500
JETLS.jl ─ A New Language Server for Julia
abap34
1
380
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
120
30分でDoctrineの仕組みと使い方を完全にマスターする / phpconkagawa 2025 Doctrine
ttskch
3
830
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
150
なあ兄弟、 余白の意味を考えてから UI実装してくれ!
ktcryomm
11
11k
ゲームの物理 剛体編
fadis
0
330
SwiftUIで本格音ゲー実装してみた
hypebeans
0
320
tparseでgo testの出力を見やすくする
utgwkk
1
210
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
130
Featured
See All Featured
Leading Effective Engineering Teams in the AI Era
addyosmani
8
1.3k
Designing for Performance
lara
610
69k
Mobile First: as difficult as doing things right
swwweet
225
10k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Code Review Best Practice
trishagee
74
19k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Rails Girls Zürich Keynote
gr2m
95
14k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.3k
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