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
はてなにおけるfujiwara-wareの活用やecspressoのCI/CD構成 / Fuj...
Search
cohalz
January 17, 2025
Programming
3
4.3k
はてなにおけるfujiwara-wareの活用やecspressoのCI/CD構成 / Fujiwara Tech Conference 2025
https://connpass.com/event/338668/
cohalz
January 17, 2025
Tweet
Share
More Decks by cohalz
See All by cohalz
はてなの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.9k
ecspressoへの貢献を振り返る / JAWS-UG コンテナ支部 #24 ecspresso MeetUp
cohalz
1
6.6k
はてなフォトライフをECSに移行した話 / Hatena Engineer Seminar #20
cohalz
1
19k
SREの異動と働き方 〜はてなブログ編〜 / Hatena Engineer Seminar #13
cohalz
0
2.3k
Envoy.なんか / Kyoto.なんか #5
cohalz
1
200
Other Decks in Programming
See All in Programming
[JAWS-UG横浜 #80] うわっ…今年のServerless アップデート、少なすぎ…?
maroon1st
1
160
Linux && Docker 研修/Linux && Docker training
forrep
23
4.3k
DROBEの生成AI活用事例 with AWS
ippey
0
120
VitePressを2週間使ってみた感想
hal_spidernight
0
100
テストをしないQAエンジニアは何をしているか?
nealle
0
110
[JAWS-UG横浜 #79] re:Invent 2024 の DB アップデートは Multi-Region!
maroon1st
1
140
令和7年版 あなたが使ってよいフロントエンド機能とは
mugi_uno
12
6.1k
振り返れば奴(Cline)がいる
keiyagi
0
160
ASP.NET Core の OpenAPIサポート
h455h1
0
170
自分ひとりから始められる生産性向上の取り組み #でぃーぷらすオオサカ
irof
8
2.2k
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
8
1.7k
ISUCON14公式反省会LT: 社内ISUCONの話
astj
PRO
0
160
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
6
230
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Adopting Sorbet at Scale
ufuk
74
9.2k
GraphQLとの向き合い方2022年版
quramy
44
13k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Unsuck your backbone
ammeep
669
57k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
Bash Introduction
62gerente
610
210k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Done Done
chrislema
182
16k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Transcript
はてなにおける fujiwara-wareの活用や ecspressoのCI/CD構成 id:cohalz / @cohalz 2025/1/17 Fujiwara Tech Conference
2025 1
自己紹介 • こはる(@cohalz) • 株式会社はてな SRE • 趣味でfujiwara-wareに コントリビュート 2
今日話すこと • 社内で利用しているfujiwara-wareの紹介 • ecspressoのCI/CD構成 3
4 fujiwara-wareの活用
色々使ってます • 扱ってる技術が近いのもあり日々便利に 使ってます ◦ ECSやAWS全般、Mackerel ◦ PerlやGo 5
ecspresso / lambroll • ほぼ全てでecspressoを採用 ◦ リリース手順が違うなどはある • lambrollは一部利用 ◦
あまり更新のないものはCDKのままにすることも 6
maprobe • Mackerelのメトリックをいい感じに取ったり 集計したりするツール ◦ AWSのマネージドサービスにプラグイン実行したり ◦ ホストメトリックを集計してサービスメトリックにしたり • 最近はOTel形式に変換する機能なども
7
Redis::Setlock • Redisで排他制御をするためのPerlモジュール ◦ Redisを使って排他制御するwrapperコマンド Redis-Setlock をPerlとGoで書いた - 酒日記 はてな
支店 • EventBridge経由のバッチで利用 ◦ at-least-onceの多重実行を防ぐ 8
AWS::XRay • PerlでX-Rayにトレースを送るモジュール ◦ 当然公式にX-RayのSDKはないため ◦ Perlでも分散トレーシングしたい!AWS::XRay によ る解析とその実装 /
YAPC::Tokyo 2019 - Speaker Deck 9
fujiwara-wareではないが... • カヤック社のOSSも利用し始めています ◦ mirage-ecs ◦ shimesaba ◦ prepalert •
カヤック発OSSカタログ - KAYAC Engineers' Blog 10
どうやって探してる? • ブログやGitHubから他のものをざっと見る ◦ 好みのOSSを作ってるなら他も似た課題を持ってるはず • 個人や会社の他のOSSもdigって見ると良いかも 11
12 ecspressoを よりよく使う
ecspressoを本番運用するにあたって • イメージの更新どうやる? • 設定ファイル共通化したい! • どこからデプロイする? • レビューやリリースのプロセスは? 13
イメージの更新どうやる? • イメージの確認・更新が悩ましい ◦ タスク定義は巨大になりがちで見にくい ◦ コンテナ定義内のimage差し替えも割と面倒 14
改善策 • デプロイ時に環境変数などで渡す • 別のファイルから読み込む • jsonnetでやる方法の紹介 15
16 jsonnetの工夫
::を使うと隠しフィールドに { params:: { env: '', }, name: $.params.env, }
// => { "name": "" } 17
ファイルの読み込みと更新 import 'base-task-def.libsonnet' { params+: { env: 'production', }, cpu:
'2048', } // => { "name": "production", "cpu": "2048" } 18
実際に使ってる機能は? • コメント、値の上書き、ファイル分割程度 ◦ 各環境の共通部分を分離 • 複雑なことをしすぎない方がわかりやすい ◦ 関数、if、ループなども避ける 19
20 事故を防ぐ工夫
よくある(?)事故 • デプロイするバージョンを間違える! • デプロイするサービスを間違える!! • ECRのイメージが消えてタスクが立たない!!! 21
デプロイを間違える対策案 • 手元からデプロイしない(大事!!) • デプロイするバージョンやサービスを レビューできる 22
ECRのイメージが消える対策案 • いい感じのライフサイクルポリシーを決める ◦ 本番用は個数、それ以外は日数がおすすめ • デプロイ不可な状態に早めに気付く仕組み ◦ 防ぐことはできないがリスクは緩和 23
それを踏まえてCI/CDはどうするか • SSOTで宣言的な構成にしたい • 自動化したい • 複数のサービスを同じ方法で扱いたい ◦ 一つ一つ設定していくのは手間 ◦
はてなだとチームで見るECSサービスも多い 24
25 ecspressoのCI/CDを 作っていく
CI/CDの構成を考える • 社内にEKS+ArgoCDのCI/CDが既にあった • これを元に手作り ◦ GitOpsぽい形に 26
デプロイ用の リポジトリを作る • コードともCDKとも違 うリポジトリを作るよ うに • このリポジトリに全 サービスのECS設定を 置く
27
アプリリポジトリの方からJSONを送って更新 28
PRが作られると • 変更されたファイルからデプロイ対象を特定 ◦ どのサービスがデプロイされるのかの確認もできる • そのECSサービスのみverifyとdiffを実行 ◦ チェックが通らないとデプロイできない 29
デプロイされる対象のみチェックする 30
mainにマージすると • GitHub Actionsでecspresso deployを実行 ◦ CIでテストしたサービスのみが自動でデプロイ • ロールバックしたい時はrevertするだけ ◦
リポジトリとECSの状態は常に同じ 31
複数サービスも同じリポジトリに • チームでメンテする全てのサービスを集約 ◦ これによりチーム内では1つのデプロイ方法だけ覚えれば 良くなる 32
さらに利用を広げたい • 別チームでも同じ構成を使えるようにしたい • 新規サービスを追加しやすくしたい 33
リリース用リポジトリのテンプレート • 必要なワークフローなど揃えたテンプレート • Cloneしてecspressoのファイルを置く ◦ 既に構築したCI/CDをすぐ使える 34
ファイル分割ツールも用意 • 既存のECSのサービスをこの構成の ecspressoファイルを書き出してくれる ◦ 分割だけでなく環境変数のパラメータ化なども 35
Actionの再利用 • 社内向けComposite Action / Reusable Workflowにする ◦ 各チームはそれを利用する形 ◦
アップデートはRenovateで拾う 36
Renovateで社内のActionを更新 リリースノートも確認できる 37
38 リリースのフロー
普段の開発のフロー • PRをmainから作ってマージする ◦ GitHub Flowに近いスタイル • リリース手順が書かれたissueが作られる ◦ stagingが更新されてるので確認
39
リリース手順が書かれたissueが作られる 内容と手順を確認してclose 40
Issueを閉じるとリリース • タグが打たれリリースリポジトリに通知 ◦ それをマージすればデプロイ完了 ◦ ECRにエイリアスタグを作るだけでビルド待ちもなし • 問題があった時は ◦
アプリ/リリースどちらかのリポジトリで戻す 41
42 GitHub Actionsで 実行しているもの紹介
ECRイメージの存在確認 • 定期的に全サービスにverifyを実行 ◦ 失敗したものをSlackへ通知 • initしてverifyならecspresso管理してなくて も検証できる 43
デプロイ設定のファイルを用意 • デプロイ時に動作をカスタマイズしたい ◦ 別のECSサービスも同時/順番にデプロイしたい ◦ Mackerelにアノテーションしたい • 別途JSONファイルを独自に利用して実現 •
ActionsがそのJSONの値を見て処理する ◦ デフォルトでjqが同梱されてるので扱いやすい 44
ステージング環境を夜間休日落とす • 開発しない時間に止める ◦ 落とす対象を決めてスケジュール実行 • 落とす時はscale —tasks=0 • 戻す時はdeployし直すだけ
45
リリースの履歴を残す • GitHubのリリースにも変更一覧を出す ◦ github-scriptでgithub.rest.repos.createRelease ◦ generate_release_notes: trueするだけ • タイミングをMackerelにアノテーション
◦ cohalz/post-mackerel-annotation 46
ecspressoのバージョン固定&更新 • asdfやGitHub Actionsでecspressoのバージョ ンを固定しRenovateで更新する - Re:cohalz 47
48 色々やってきた結果
現状 • 社内で多くのサービスがこの構成になった ◦ チームメンバーが異動してもすぐ構成を理解できる • 事故も少なく平和に過ごせている 49
課題もある • どうしても手作りが多くて複雑 ◦ 単一のECSサービスの利用には大袈裟 ◦ 使うだけならいいが中身を理解しようとすると大変 • Lambdaのデプロイどうするか ◦
ecspressoのリポジトリと同居する? 50
おわり • fujiwara-wareやecspressoの活用事例を紹介し ました • こうしてるよとかの話を聞きたい! 51