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
6.6k
はてなにおける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
toittaにOpenTelemetryを導入した話 / Mackerel APM リリースパーティ
cohalz
1
580
はてなのSRE組織2024 / Road to SRE NEXT@福岡
cohalz
2
1.8k
SREのキャリア、 あるいは生態 / #ya8
cohalz
11
1.7k
カンファレンスのボランティアスタッフって何やるの? / DAIMYO Meetup #4
cohalz
0
170
小さなものでも Step Functions / Serverless Meetup Fukuoka Re:boot
cohalz
0
210
ECSのCI/CD改善と標準化の取り組み / JAWS FESTA 2023 in Kyushu
cohalz
8
7.3k
ecspressoへの貢献を振り返る / JAWS-UG コンテナ支部 #24 ecspresso MeetUp
cohalz
1
7.3k
はてなフォトライフをECSに移行した話 / Hatena Engineer Seminar #20
cohalz
1
19k
SREの異動と働き方 〜はてなブログ編〜 / Hatena Engineer Seminar #13
cohalz
0
2.4k
Other Decks in Programming
See All in Programming
社内での開発コミュニティ活動とモジュラーモノリス標準化事例のご紹介/xPalette and Introduction of Modular monolith standardization
m4maruyama
1
130
CursorはMCPを使った方が良いぞ
taigakono
0
150
Java on Azure で LangGraph!
kohei3110
0
160
AIコーディング道場勉強会#2 君(エンジニア)たちはどう生きるか
misakiotb
1
240
Is Xcode slowly dying out in 2025?
uetyo
1
180
今ならAmazon ECSのサービス間通信をどう選ぶか / Selection of ECS Interservice Communication 2025
tkikuc
11
2.8k
コード書くの好きな人向けAIコーディング活用tips #orestudy
77web
3
330
Spring gRPC で始める gRPC 入門 / Introduction to gRPC with Spring gRPC
mackey0225
2
520
すべてのコンテキストを、 ユーザー価値に変える
applism118
2
470
「ElixirでIoT!!」のこれまでとこれから
takasehideki
0
370
C++20 射影変換
faithandbrave
0
500
DroidKnights 2025 - 다양한 스크롤 뷰에서의 영상 재생
gaeun5744
3
300
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Stop Working from a Prison Cell
hatefulcrawdad
270
20k
Producing Creativity
orderedlist
PRO
346
40k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.8k
Typedesign – Prime Four
hannesfritz
42
2.7k
Automating Front-end Workflow
addyosmani
1370
200k
Code Reviewing Like a Champion
maltzj
524
40k
Building an army of robots
kneath
306
45k
Agile that works and the tools we love
rasmusluckow
329
21k
Navigating Team Friction
lara
187
15k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
920
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