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
5.7k
はてなにおける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.8k
SREのキャリア、 あるいは生態 / #ya8
cohalz
11
1.6k
カンファレンスのボランティアスタッフって何やるの? / DAIMYO Meetup #4
cohalz
0
160
小さなものでも Step Functions / Serverless Meetup Fukuoka Re:boot
cohalz
0
200
ECSのCI/CD改善と標準化の取り組み / JAWS FESTA 2023 in Kyushu
cohalz
8
7.1k
ecspressoへの貢献を振り返る / JAWS-UG コンテナ支部 #24 ecspresso MeetUp
cohalz
1
7k
はてなフォトライフをECSに移行した話 / Hatena Engineer Seminar #20
cohalz
1
19k
SREの異動と働き方 〜はてなブログ編〜 / Hatena Engineer Seminar #13
cohalz
0
2.4k
Envoy.なんか / Kyoto.なんか #5
cohalz
1
210
Other Decks in Programming
See All in Programming
海外のアプリで見かけたかっこいいTransitionを真似てみる
shogotakasaki
1
170
生成AIを使ったQAアプリケーションの作成 - ハンズオン補足資料
oracle4engineer
PRO
3
220
SEAL - Dive into the sea of search engines - Symfony Live Berlin 2025
alexanderschranz
1
130
Youtube Lofier - Chrome拡張開発
ninikoko
0
2.4k
RuboCop: Modularity and AST Insights
koic
2
470
Strategic Design (DDD)for the Frontend @DDD Meetup Stuttgart
manfredsteyer
PRO
0
140
Optimizing JRuby 10
headius
0
300
リアクティブシステムの変遷から理解するalien-signals / Learning alien-signals from the evolution of reactive systems
yamanoku
3
1.2k
音声プラットフォームのアーキテクチャ変遷から学ぶ、クラウドネイティブなバッチ処理 (20250422_CNDS2025_Batch_Architecture)
thousanda
0
160
MCP調べてみました! / Exploring MCP
uhzz
2
2.3k
Building Scalable Mobile Projects: Fast Builds, High Reusability and Clear Ownership
cyrilmottier
2
280
Compose Hot Reload is here, stop re-launching your apps! (Android Makers 2025)
zsmb
1
500
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
660
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
5
550
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
23
2.6k
A designer walks into a library…
pauljervisheath
205
24k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
Writing Fast Ruby
sferik
628
61k
BBQ
matthewcrist
88
9.6k
Into the Great Unknown - MozCon
thekraken
37
1.7k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
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