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
CDKを活用した 大規模コンテナ移行 プロジェクトの紹介
Search
akita
September 25, 2024
Programming
0
140
CDKを活用した 大規模コンテナ移行 プロジェクトの紹介
akita
September 25, 2024
Tweet
Share
More Decks by akita
See All by akita
AWSやJAWS-UGとの出会いを振り返る
yoyoyopg
1
320
AWS Control Tower で マルチアカウント運用を試した話
yoyoyopg
0
47
CDK + ecspressoでお手軽コンテナ3分クッキング
yoyoyopg
0
630
Other Decks in Programming
See All in Programming
GraphQLにおけるページネーションベストプラクティス
estie
0
150
Hermes: Better Performance with Bytecode Translation (React Universe 2024)
tmikov2023
0
180
GitHub Copilot Workspace で我々のアプリ開発がどう変わるのか?
shuyakinjo
0
720
Kotlin 2.0が与えるAndroid開発の進化
masayukisuda
2
770
Data Contracts In Practice With Debezium and Apache Flink
gunnarmorling
0
180
ECS向けのドリフト検知機構を実装してみた
tkikuc
0
140
Micro Frontends Unmasked: Opportunities, Challenges, Alternatives
manfredsteyer
PRO
0
210
はじめてみよう量子プログラミング
itokoichi01
0
260
"型"のあるRailsアプリケーション開発 / Typed Rails application development
sinsoku
7
2k
Modernisation Progressive d’Applications PHP
hhamon
0
150
Shinjuku.rb#95:心の技術書紹介
free_world21
1
120
Composing an API the *right* way (Droidcon New York 2024)
zsmb
2
460
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
129
8.8k
10 Git Anti Patterns You Should be Aware of
lemiorhan
653
59k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
248
20k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
124
18k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
225
22k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
28
1.7k
GraphQLとの向き合い方2022年版
quramy
43
13k
VelocityConf: Rendering Performance Case Studies
addyosmani
322
23k
Into the Great Unknown - MozCon
thekraken
29
1.4k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
43
2k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
26
4k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
30
2.6k
Transcript
JAWS-UG CDK支部 #16 ~CDK Conference 2024 Extra~ 2024/09/25 あきた(yoyoyo_pg) CDKを活用した 大規模コンテナ移行
プロジェクトの紹介
• あきた(@yoyoyo_pg) • 経歴 ◦ 名古屋の士業系SaaS ◦ Java開発2年 -> AWS歴2年半
◦ SREとしてインフラ構築・運用 ◦ JAWS-UG名古屋運営(2024年~) • 好きなAWSサービス ◦ AWS CDK 自己紹介 2
3 話す事 • CDKを用いて100台近くのコンテナ・CICDパイプライ ンの構築フローを定めた事例 ◦ 複数人での構築作業において、構築や運用の手間を 減らすうえで工夫した点や今後の課題 話さない事 •
CDKのベストプラクティス • CDK自体の内部構造や技術的な話 • コンテナへのデプロイフロー・移行作業の話 今日お話すること
4 • 20年物のモノリスなJavaアプリケーションのEoL対応 に伴い、約1年かけ動作基盤をEC2からコンテナ(ECS on Fargate)へと移行 ◦ 元々CloudFormationで構築していたVPCやALBなど 共通リソースはそのままで、モノリスを分解しつつ アプリケーションを段階的に移行する形
• コンテナ化・CICDパイプラインの構築のために、IaC ツール(CDK + ecspresso)を導入 プロジェクトの概要
Virtual private cloud (VPC) Private subnet Public subnet 5 簡易構成図(移行前)
Application Load Balancer Amazon Aurora Amazon EC2 アプリケーション約 15個が同居
Virtual private cloud (VPC) Private subnet Public subnet 6 簡易構成図(移行後)
Application Load Balancer Service Amazon ECS Container Amazon Aurora Amazon EC2 1アプリケーション=1ECSサービスとし て構築し、段階的に移行
7 簡易構成図(移行後) Application Load Balancer Amazon ECS ServiceA Amazon Aurora
ServiceE ServiceI ServiceB ServiceF ServiceJ ServiceD ServiceH ServiceC ServiceG ServiceK Virtual private cloud (VPC) Private subnet Public subnet
構成図(全体) 8 8 • 7 環境 × 15 コンテナ =
約 100 パターンのコンテナと 60 パターンのCICDパイプライン ◦ TEST環境×4, デモ環境, STG環境, 本番環境
9 • 約 100 パターンのコンテナ・60 パターンのCICDパイ プラインの構成を定義 ◦ 環境別に 15
アプリケーション分を定義 ◦ 構築量が多く、スタックは分けざるを得なかった CDKスタック構成 ▪コンテナ用スタック • Test1Container • Test2Container • StgContainer • ProdContianer ・・・ ▪CICD用スタック • Test1Cicd • Test2Cicd • StgCicd • ProdCicd ・・・
10 スタック別の構築内容 ▪コンテナ用スタック • ECSクラスター • タスクロール • タスク実行ロール •
セキュリティグループ • ターゲットグループ • ロググループ • SSMパラメータストア ▪CICD用スタック • CodePipeline • CodeBuild • buildspec.yml • 各種ロール • 環境別の設定ファイル ▪ecspresso • ECSサービス • ECSタスク
11 大まかな構築の流れ ▪コンテナ用スタック • ECSクラスター • タスクロール • タスク実行ロール •
セキュリティグループ • ターゲットグループ • ロググループ • SSMパラメータストア ①コンテナスタックを構築 ②空のターゲットグループ をALBに紐づけ ▪CICD用スタック • CodePipeline • CodeBuild • buildspec.yml • 各種ロール • 環境別の設定ファイル ④CICDパイプラインを構築 ▪ecspresso • ECSサービス • ECSタスク ③コンテナ本体を構築 ※SSMパラメータストアで名前解決
12 • コンテナ・CICDパイプラインの構成を、共通コンスト ラクトとして定義 • 共通コンストラクトには主に「アプリ名」「環境名」 をpropsとして渡す ◦ 共通で構築しないリソースに関しては、権限付与用 の関数を用いて構築
▪ セキュリティグループやECSタスクロールの内、 本番環境のみメール通知権限、アプリAとアプリ BのみS3アクセス権を付与、など CDKの共通コンストラクト
13 実装例(パラメータとスタック)
14 実装例(パラメータとスタック) アプリ名・環境名を parameter.tsで定義 各アプリがどの機能を 使うかを定義
15 実装例(パラメータとスタック) アプリ名・環境名を parameter.tsで定義 各アプリがどの機能を 使うかを定義 コンテナスタックを 環境別に定義 アプリ別コンテナコン ストラクトを定義
16 実装例(コンストラクト) 権限付与用の関数を 用いて権限の付与
17 • テストコード(スナップショットテスト)導入 ◦ CDKバージョンアップやリファクタリングが容易に • npm install の自動化 ◦
VSCodeの機能(tasks.json)で、プロジェクトを 開いた時に自動的に npm install が走るように ▪ CDKバージョンアップ後にチームにアナウンス する手間を削減 • コーディング規約・運用規約の制定 ◦ 最初にある程度の共通認識をすり合わせておけた ◦ レビュー時のコスト削減 取り組んでよかった事
18 • コンストラクトツリーによる構造化 ◦ 自作コンストラクトを作成しアプリ別に分割 ▪ リソースをCloudFormationの画面上からも、 コードベース上からも確認しやすく • エスケープハッチの活用
◦ L2からL1を取り出してのパラメータの指定 取り組んでよかった事
19 • cdk import と cdk migrate の実施 ◦ 既存のリソース(手動構築・CFnによる構築)を出
来るだけCDK管理下へ • CDK用パイプラインの導入 ◦ 当時は導入の判断を見送っていた • バリデーションチェックや単体テストの導入 ◦ まずは本番環境用リソースに対して • ecspressoで構築したECSサービス・タスクをどう管理 するかの検討(CDK以外の部分) 今後取り組みたい事
20 • cdk import と cdk migrate の実施 ◦ 既存のリソース(手動構築・CFnによる構築)を出
来るだけCDK管理下へ • CDK用パイプラインの導入 ◦ 当時は導入の判断を見送っていた • バリデーションチェックや単体テストの導入 ◦ まずは本番環境用リソースに対して • ecspressoで構築したECSサービス・タスクをどう管理 するかの検討(CDK以外の部分) 今後取り組みたい事
21 JAWS-UG 名古屋 「IaC運用のリアルを 語りたい!LT大会(仮)」 10月28日(月)19:00~21:00 会場:コラボベース NAGOYA connpass上で後日イベントページを公開します 宣伝
22 ご清聴ありがとうございました おわり
23 次のスライドからは、 本編で紹介しきれなかった 取り組みの例を紹介します おまけ
24 コーディング規約例 • コンストラクト名はパスカルケースで記載 • デフォルトのパラメータは可能な限り活用 • リソースやリソース名は自動生成を可能な限り活用 • GrantやAllow系メソッドは可能な限り活用
設計面の規約例 • 可能な限り同一スタックで定義 • 自作コンストラクト・関数の置き場所の指定 • SSMパラメータ参照・コンストラクト間の値参照の活用 取り組み例:コーディング規約
25 ルール例 • CDK化の基準 ◦ ex. 全てのインフラ操作を「CDKで管理」する訳で はなく、普段メール通知を閉じておくテスト環境は メール通知を閉じておく等 •
GitHub上のルール ◦ ブランチ名は作業者名/操作内容 ◦ ラベルによる管理(環境別のラベルを作成) 取り組み例:運用ルールの制定