はてなフォトライフをECSに移行した話 / Hatena Engineer Seminar #20
by
cohalz
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
はてなフォトライフを ECSに移行した話 id:cohalz / @cohalz Hatena Engineer Seminar #20 AWS Renovation 編 1
Slide 2
Slide 2 text
自己紹介 ● id:cohalz (こはる) ● 2018年新卒入社 ● 2019年からはてなブロ グのチーム 2
Slide 3
Slide 3 text
はてなフォトライフ について ● f.hatena.ne.jp ● 2004年リリース ● 画像アップロードサー ビス ● はてなブログの編集画 面からもアップロード できる 3
Slide 4
Slide 4 text
以前のはてなフォトライフのインフラ 〜 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
Slide 5
Slide 5 text
今回のアプリケーションのECS移行 2018 〜 2021年 ● EC2 ● Debian 8 ● In Placeデプロイ ○ Capistrano 2 2021年 〜 ● ECS on Fargate ● Debian 11 ● Blue/Greenデプロイ ○ CodeDeploy 5
Slide 6
Slide 6 text
6 なぜECSに移行したか
Slide 7
Slide 7 text
なぜECSに移行したか ● トリガー: Let’s Encryptのルート証明書期限切れ ● モチベ1: チームで開発・運用をしやすくする ● モチベ2: ブログのECS移行に向けての知見獲得 7
Slide 8
Slide 8 text
Let’s Encryptのルート証明書期限切れ ● 2021/10以降OpenSSL 1.0.2以下のクライ アントからLet’s Encryptを使っているサイト に対してHTTPS接続できなくなる ○ はてなブログやAkamai、FastlyなどのCDNも対象 ○ 構築タイミングでの依存があるかもしれない ■ スケールをはじめ運用できなくなる恐れ 8
Slide 9
Slide 9 text
OSのバージョンを上げられるか ● Debian 9 LTSのEOLが2022/6 ● まだ社内にDebian 10以上のAMIが用意され ていなかった ○ 他のチームでコンテナ化が進んでいた ● そもそも社内の古い仕組みを触るのも大変 ○ 属人性が高い 9
Slide 10
Slide 10 text
10 チームで開発・運用を しやすくする
Slide 11
Slide 11 text
開発オーナーの移行 ● 2020年に開発オーナーをブログチームに移行 ○ ブログ起因のタスクの着手順をコントロールしやすく するため ○ 少しずつブログ側で開発・運用していくように ● ブログチームがやりやすい仕組みにしていく ○ オーナー移行により仕組みを変えやすくなった 11
Slide 12
Slide 12 text
オーナー移行によりレイアウトシフト対策の 機能もブログチームで開発できた 12
Slide 13
Slide 13 text
ECSにしてチームで 開発・運用をしやすくする ● ECSに移行することで ○ チームが理解しやすい仕組みにしていく ■ 世の中で広く使われている技術にする ○ できるだけチーム内で完結できるように ■ 他チームのリソースへの依存を減らす ■ チーム間コミュニケーションコストの削減 13
Slide 14
Slide 14 text
14 ブログのECS移行に 向けての知見獲得
Slide 15
Slide 15 text
ブログのECS移行に向けての知見獲得 ● はてなブログ本体だけEC2という状況 ● トラフィックがあるサービスで移行の知見を 獲得していく 15
Slide 16
Slide 16 text
スコープ外も伝えておく ● サブシステムの改善はついでに頼まれがち ○ 普段気づかないものを発掘してしまうタイミング ● エラー率やレイテンシの改善は今はやらない ○ 将来的にはやりやすくなるので待って欲しいと伝えた 16
Slide 17
Slide 17 text
17 最初に 切り替え方針の決定
Slide 18
Slide 18 text
そもそものプロダクトの難しさ ● 歴史のあるサービスで詳しい人がいない ○ 2018年の移行を担当した人も退職していた ● ブログと同じPerlでも違う構成要素 ○ Apache + mod_perl2 ○ ImageMagick 18
Slide 19
Slide 19 text
19 正直わからないことだらけ
Slide 20
Slide 20 text
20 わからないなりに移行する
Slide 21
Slide 21 text
わからないなりに移行する ● 大きく考えられる手段は二つ ○ 十分に動作確認してメンテ入れて移行する ○ カナリアリリースで少しずつ移行していく ● 今回は後者でPOと方針の合意を取った ○ 問題があった時にも素早く戻しやすい 21
Slide 22
Slide 22 text
22 まずはDockerfileの作成
Slide 23
Slide 23 text
Dockerfileの作成 ● ベースイメージは motemen/mod_perl ● 各レイヤは社内のmod_perlのDockerfileを 全部見ていいとこ取り 23
Slide 24
Slide 24 text
GitHub Actionsでビルドしたい ● 社内にある独自パッケージを使っていた ○ GitHub Actionsからアクセスできない ● CIを他に変えるのはあまりしたくない ○ プロダクトごとにCIが変わってしまう ○ 本当に社内にあるパッケージが必要か? 24
Slide 25
Slide 25 text
社内aptlyを使う 必要があるか確認 ● POに仕様を確認し不要 と判断 ● EC2側で先にパッケー ジを変えて動作確認 ● コンテナでも同じパッ ケージを使って差分を なくす 25
Slide 26
Slide 26 text
26 これで(おそらく)動く イメージができた
Slide 27
Slide 27 text
27 移行作戦
Slide 28
Slide 28 text
アプリケーションの移行 ● ALBの加重ターゲットグループ機能を使う ○ 0.1%刻みでトラフィックの割合を変えられる ○ 反映も一瞬 ● CodeDeployのBlue/Greenデプロイも採用 ○ ローリングデプロイよりもロールバックが高速 ○ ecspressoを利用 28
Slide 29
Slide 29 text
カナリアリリース前に事前に確認 ● ALBのリスナールールを変更して特定のヘッ ダをつけたらECSに流れるように ○ これで割合に関係なくリクエスト先を選べるように 29
Slide 30
Slide 30 text
移行の構成図 30
Slide 31
Slide 31 text
Mackerelのダッ シュボードで確認 ● EC2とECSのターゲッ トグループを式グラフ で同じグラフに載せる ● 割合を50:50にしてエ ラー率とレイテンシが ほぼ一致していること を確認 31
Slide 32
Slide 32 text
いくつか気づいた点 ● 加重ターゲットグループを使っているときは B/Gデプロイができない ○ 一旦加重ルーティングをやめて両方デプロイしその後 戻すことが必要 ■ とはいえEC2の台数を減らしてなければ問題にはならない 32
Slide 33
Slide 33 text
いくつか気づいた点2 ● どっちにリクエストが流れているか分かりづ らい ○ ヘッダなどで区別をつけられると良い ○ 開発者の検証用ならfaviconを変えるのもオススメ 33
Slide 34
Slide 34 text
ecspressoにフィー ドバック いくつか欲しかった機能を 追加 ● CodeDeployのロール バック ● initでタグもインポート ● desiredCountのdiff ● Terraform Cloud対応 34
Slide 35
Slide 35 text
35 アプリケーションの 移行完了
Slide 36
Slide 36 text
36 最後にバッチの移行
Slide 37
Slide 37 text
バッチの移行を考える ● cronで動かしていた ● 一つ一つまだ必要かPOに確認 ● 実行時間は短いものしかなかったのでリクエ ストベースでの実行に変更していく ○ 最低限APIキー認証だけ含める 37
Slide 38
Slide 38 text
バッチ移行先 ● リクエストを受けるエンドポイントを増やす のも大変でちゃんと動くかわからない ● SQLを実行するバッチは事前に安全なクエリ に差し替えて動くのを確認 ○ レスポンスに実行したSQLのクエリと実行時間と成功 失敗を含めてデバッグしやすいように 38
Slide 39
Slide 39 text
バッチのトリガー EventBridge + Lambda ● LambdaがHTTPリクエ ストを送る ● Mackerelに実行時間と 成功/失敗をメトリック にして送る ● 他チームで動いている ものを真似して再実装 39
Slide 40
Slide 40 text
40 こうして移行完了
Slide 41
Slide 41 text
おわり ● プロジェクト期間は約2ヶ月ほど ○ 大きな問題も発生せず完了 ● この知見を元にはてなブログ本体のECS移行 も進行中 41
Slide 42
Slide 42 text
(参考) 2018年に行った移行について ● MySQLをアップデートする話 - Hatena Developer Blog ● Hatena Engineer Seminar #11で「MySQL自前運用やめて Aurora導入する話」した - 角待ちは対空 ● Legacy Meetup Kyotoで「レガシーシステムとインフラオー ナーシップ 」という発表した - 角待ちは対空 42