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
実践!CloudFormation Best Practice ~CloudFormation...
Search
urmot
February 23, 2019
Technology
3.6k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
実践!CloudFormation Best Practice ~CloudFormationで始める組織改革~
urmot
February 23, 2019
More Decks by urmot
See All by urmot
DDDにおける認可の扱いとKotlinにおける実装パターン / authorization-for-ddd-and-kotlin-implement-pattern
urmot
4
1.9k
ログラスを支える設計標準について / loglass-design-standards
urmot
12
3k
ログラスを支える技術的投資の仕組み / loglass-technical-investment
urmot
10
6.2k
CircleCIを導入した話
urmot
0
120
SPA on AWS
urmot
0
240
実践!CloudFormation Best Practice
urmot
0
290
RDBのログを取る時にDMSを使うという選択肢
urmot
0
170
ベンチャー企業のインフラを運用して学んだ99のこと
urmot
0
1.4k
Other Decks in Technology
See All in Technology
「エンジニア進化論」2028年の開発完全自動化、エンジニアはどう進化するか
cyberagentdevelopers
PRO
6
5.2k
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
3
820
Bucharest Tech Week 2026 - Reinventing testing practices in the AI era
edeandrea
PRO
1
160
SONiCで構築・運用する生成AI向けパブリッククラウドネットワーク ~実装編~
sonic
0
210
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.5k
【2026年版】 ベクトル検索䛸 Embedding最前線
mocobeta
0
160
【NRUG vol.18】KubernetesにおけるNew Relicデータ取得量削減の考え方
nrug_member
0
120
LLMにもCAP定理があるという話
harukasakihara
0
380
Chainlitで作るお手軽チャットUI
ynt0485
0
250
20260619 私の日常業務での生成 AI 活用
masaruogura
1
210
データサイエンスを価値につなげるプロジェクト設計 〜 DS一年目が現場で得た気づき 〜
ysd113
1
250
Disciplined Vibes: Scaling AI-Assisted Engineering
sheharyar
0
150
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
130
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
Producing Creativity
orderedlist
PRO
348
40k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
The Cost Of JavaScript in 2023
addyosmani
55
10k
The Curse of the Amulet
leimatthew05
1
13k
ラッコキーワード サービス紹介資料
rakko
1
3.6M
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
Transcript
実践! CloudFormation Best Practice ~CloudFormationで始める組織改革~ レバレジーズ株式会社 村本 雄太 2019/02/23
目次 1. 自己紹介 & 会社紹介 2. 問題点 3. 実践!ベストプラクティス 4.
まとめ
目次 1. 自己紹介 & 会社紹介 2. 問題点 3. 実践!ベストプラクティス 4.
まとめ
• 村本 雄太 • レバレジーズ株式会社 ᄂ SREチーム リーダー • @urmot2
好きなAWSサービスはCloudFormationです
None
働きがいのある会社 ベストカンパニーに選出
働きがいのある会社 女性ランキング4位
目次 1. 自己紹介 & 会社紹介 2. 問題点 3. 実践!ベストプラクティス 4.
まとめ
Templateがモノリシックで管理がつらい... 1. 全リソースを1Stackで集中管理 2. 数千行を超えるTemplate 3. Parametersによる複雑な制御 厳選!モノリシックTemplateのつらみ3選
1. 全リソースを1Stackで集中管理 2. 数千行を超えるTemplate 3. Parametersによる複雑な制御 Templateがモノリシックで管理がつらい... 厳選!モノリシックTemplateのつらみ3選
複数サービスのリソースが混在 ServiceA ELB ServiceB ELB ServiceA EC2 ServiceB EC2 ServiceA
S3 ServiceB EC2 ServiceC EC2 ServiceA EC2 VPC PrivateA Subnet PublicC Subnet
あらゆるリソースが依存関係を持っていた ServiceA ELB ServiceB ELB ServiceA EC2 ServiceB EC2 ServiceA
S3 ServiceB EC2 ServiceC EC2 ServiceA EC2 VPC PrivateA Subnet PublicC Subnet
変更時の影響が把握しづらい ServiceA ELB ServiceB ELB ServiceA EC2 ServiceB EC2 ServiceA
S3 ServiceB EC2 ServiceC EC2 ServiceA EC2 VPC PrivateA Subnet PublicC Subnet 変更したら どうなるんだ...
毎回恐る恐る更新 ServiceA ELB ServiceB ELB ServiceA EC2 ServiceB EC2 ServiceA
S3 ServiceB EC2 ServiceC EC2 ServiceA EC2 VPC PrivateA Subnet PublicC Subnet 変更したら どうなるんだ... 更新ボタンを 押したくない...
もうやだ... ServiceA ELB ServiceB ELB ServiceA EC2 ServiceB EC2 ServiceA
S3 ServiceB EC2 ServiceC EC2 ServiceA EC2 VPC PrivateA Subnet PublicC Subnet 変更したら どうなるんだ... 更新ボタンを 押したくない...
モノリシックなTemplateは管理がつらい... 1. 全リソースを1Stackで集中管理 2. 数千行を超えるTemplate 3. Parametersによる複雑な制御 厳選!Template管理のつらみ3選
最終的に3000行のTemplateに 1 --- 2 AWSTemplateFormatVersion: '2010-09-09' 3 Description: 'My CloudFormation'
4 2459 ServiceCSqs: 2560 Type: AWS::CloudFormation::Stack 2561 Properties: 2562 Parameters:
1 --- 2 AWSTemplateFormatVersion: '2010-09-09' 3 Description: 'My CloudFormation' 4
2459 ServiceCSqs: 2560 Type: AWS::CloudFormation::Stack 2561 Properties: 2562 Parameters: どこを変更すれば良いかわからない どこを変更すれば 良いの...?
1 --- 2 AWSTemplateFormatVersion: '2010-09-09' 3 Description: 'My CloudFormation' 4
2459 ServiceCSqs: 2560 Type: AWS::CloudFormation::Stack 2561 Properties: 2562 Parameters: インフラ担当に依頼するしかない インフラ担当が 全部管理 どこを変更すれば 良いの...?
1 --- 2 AWSTemplateFormatVersion: '2010-09-09' 3 Description: 'My CloudFormation' 4
2459 ServiceCSqs: 2560 Type: AWS::CloudFormation::Stack 2561 Properties: 2562 Parameters: インフラ担当に負荷が集中 インフラ担当が ボトルネックに... どこを変更すれば 良いの...?
1 --- 2 AWSTemplateFormatVersion: '2010-09-09' 3 Description: 'My CloudFormation' 4
2459 ServiceCSqs: 2560 Type: AWS::CloudFormation::Stack 2561 Properties: 2562 Parameters: 申し訳ない... インフラ担当が ボトルネックに... どこを変更すれば 良いの...?
1. 全リソースを1Stackで集中管理 2. 数千行を超えるTemplate 3. Parametersを使った複雑な制御 モノリシックなTemplateは管理がつらい... 厳選!Template管理のつらみ3選
複数環境に対応しようとしていた 43 --- 44 Parameters: 45 EnvType: 46 Type: String
151 Conditions: 152 IsProd: !Equals [!Ref EnvType, Prod] 153 IsStag: !Equals [!Ref EnvType, Stag] 154
43 --- 44 Parameters: 45 EnvType: 46 Type: String 151
Conditions: 152 IsProd: !Equals [!Ref EnvType, Prod] 153 IsStag: !Equals [!Ref EnvType, Stag] 154 環境の差分を把握するのが困難 これを変えると どうなるの?
43 --- 44 Parameters: 45 EnvType: 46 Type: String 151
Conditions: 152 IsProd: !Equals [!Ref EnvType, Prod] 153 IsStag: !Equals [!Ref EnvType, Stag] 154 環境ごとの違いを吸収しなければならない 記述が複雑に...
43 --- 44 Parameters: 45 EnvType: 46 Type: String 151
Conditions: 152 IsProd: !Equals [!Ref EnvType, Prod] 153 IsStag: !Equals [!Ref EnvType, Stag] 154 何も考えたくない...
つらい...
なんとかしなければ...
そうだ!
AWSのベストプラクティス を実践しよう!
• 設計時の推奨事項 • テンプレート作成時の推奨事項 • 運用時の推奨事項 AWSさんがベストプラクティスを提供してくださっている
• 設計時の推奨事項 • テンプレート作成時の推奨事項 • 運用時の推奨事項 今回は設計に着目
目次 1. 自己紹介 & 会社紹介 2. 問題点 3. 実践!ベストプラクティス 4.
まとめ
時間がないので3つだけ 1. ライフサイクルと所有権でStackを整理 2. 他Stackの値を安全に利用する 3. 共通パターンを再利用
1. ライフサイクルと所有権でStackを整理 2. 他Stackの値を安全に利用する 3. 共通パターンを再利用 時間がないので3つだけ
Stackを分割する基準についての項目 ライフサイクルと所有権に着目!
ライフサイクルとは
AWSリソースのライフサイクルのこと • ライフサイクルが異なるリソースを分ける • Template更新による影響をシャットアウト
例: 期間限定のキャンペーン用サーバを作る場合 WebSite ELB WebSite EC2 RDS S3 WebSite Stack
1. WebSite Stackにキャンペーン用リソースを追加 WebSite ELB WebSite EC2 RDS S3 WebSite
Stack Campaign ELB Campaign EC2
2. キャンペーン終了後はキャンペーン用リソースを削除 WebSite ELB WebSite EC2 RDS S3 WebSite Stack
Campaign ELB Campaign EC2 使ったリソースを 削除したい
3. キャンペーン用リソースをピックアップ WebSite ELB WebSite EC2 RDS S3 WebSite Stack
Campaign ELB Campaign EC2 使ったリソースを ピックアップ
4. リソース削除による影響範囲を調査 WebSite ELB WebSite EC2 RDS S3 WebSite Stack
Campaign ELB Campaign EC2 このリソースの 影響範囲は...
5. WebSiteにも影響を与えそうなりソースを発見 WebSite ELB WebSite EC2 RDS S3 WebSite Stack
Campaign ELB Campaign EC2 WebSiteでも S3使ってる... このリソースの 影響範囲は...
既存のリソースに影響を与えるところだった...
解決策: WebSiteとCampaignでStackを分割する ELB EC2 RDS S3 WebSite Stack ELB EC2
S3 Campaign Stack
1. キャンペーン用のStackを作成 ELB EC2 RDS S3 WebSite Stack ELB EC2
S3 Campaign Stack
2. キャンペーン用リソースを削除する ELB EC2 RDS S3 WebSite Stack ELB EC2
S3 Campaign Stack
3. Campaign Stackを削除するだけ ELB EC2 RDS S3 WebSite Stack ELB
EC2 S3 Campaign Stack
削除による影響をシャットアウト ELB EC2 RDS S3 WebSite Stack ELB EC2 S3
Campaign Stack 無傷
所有権
所有権が異なるリソースを分割管理 • 変更の意思決定にかかるコストを減らせる • Templateの柔軟な変更が可能となる リソースを誰が管理すべきかを考える
例: DBチームとWebチームで運用されているサービス ELB EC2 RDS Security Group Parameter Group Security
Group Service Stack
ELBの SecurityGroupを 変更したい 1. DBチームとWebチームが同時に変更要望を出す ELB EC2 RDS Security Group
Parameter Group Security Group Service Stack Webチーム RDSの SecurityGroupを 変更したい DBチーム
2. 更新タイミングの調整, 影響範囲の確認が必要になる ELB EC2 RDS Security Group Parameter Group
Security Group Service Stack 影響範囲の調査 更新タイミング の調整
変更コストが高いなぁ...
解決策: WebチームとDBチームでStackを分割する ELB EC2 Security Group Web Stack RDS Security
Group Parameter Group DB Stack
ELBの SecurityGroup を変更したい 1. DBチームとWebチームが同時に変更要望を出す ELB EC2 Security Group Web
Stack RDS Security Group Parameter Group DB Stack Webチーム RDSの SecurityGroup を変更したい DBチーム
2. 各チームのタイミングで変更してリリース ELB EC2 Security Group Web Stack RDS Security
Group Parameter Group DB Stack 今日変更して 今日リリース!! Webチーム 今日変更して 明日リリース!! DBチーム
更新タイミングの調整が不要 ELB EC2 Security Group Web Stack RDS Security Group
Parameter Group DB Stack 更新タイミング の調整は不要
影響範囲も確認しやすい ELB EC2 Security Group Web Stack RDS Security Group
Parameter Group DB Stack 更新タイミング の調整は不要 Stack内の 影響範囲を 確認すればOK
ハッピー ELB EC2 Security Group Web Stack RDS Security Group
Parameter Group DB Stack 更新タイミング の調整は不要 Stack内の 影響範囲を 確認すればOK
1. ライフサイクルと所有権でStackを整理 2. 他のStackの値を安全に利用する 3. 共通パターンを再利用 時間がないので3つだけ
他のStackの値を安全に利用したい • Templateにハードコード • Parametersで他Stackの値を渡す • クロススタック参照 他のStackの値の参照方法はいくつかある
他のStackの値を安全に利用する • Templateにハードコード • Parametersで他Stackの値を渡す • クロススタック参照 他のStackの値の参照方法はいくつかある
例: MyVpcのVPC IDをMyAppで利用する MyVpc ELB MyApp Subnet EC2 MyApp VPC
# MyVpc.yaml Outputs: VpcId: Value: !Ref Vpc Export: Name: MyVpc-Id
1. MyVpcでVPC IDをExport
# MyVpc.yaml Outputs: VpcId: Value: !Ref Vpc Export: Name: MyVpc-Id
1. MyVpcでVPC IDをExport リージョン内で一意である 必要がある
# MyApp.yaml Resources: MyAppSubnet: Type: AWS::EC2::Subnet Properties: VpcId: !ImportValue MyVpc-Id
2. MyAppでMyVpcの値をImport !ImportValueで MyVpc-Idを指定
# MyVpc.yaml Outputs: VpcId: Value: !GetAtt Vpc.CidrBlock Export: Name: MyVpc-Id
VPC IDから CIDR Blockに変更 3. Exportの値を変更してみる
# MyVpc.yaml Outputs: VpcId: Value: !GetAtt Vpc.CidrBlock Export: Name: MyVpc-Id
VPC IDから CIDR Blockに変更 4. 変更をMyVpc Stackに適応
# MyVpc.yaml Outputs: VpcId: Value: !GetAtt Vpc.CidrBlock Export: Name: MyVpc-Id
5. エラーが発生し変更がロールバック 参照されているExportの 値は変更できない
6. 参照されているExportは変更できない # MyApp.yaml Resources: PrivateASubnet: Type: AWS::EC2::Subnet Properties: VpcId:
!ImportValue MyVpc-Id 勝手に変更されない為 安全に利用可能
やったー! # MyApp.yaml Resources: PrivateASubnet: Type: AWS::EC2::Subnet Properties: VpcId: !ImportValue
MyVpc-Id 勝手に変更されない為 安全に利用可能
1. ライフサイクルと所有権でStackを整理 2. 他Stackの値を安全に利用する 3. 共通パターンを再利用 時間がないので3つだけ
• 共通パターンの保守が容易に • 専用Templateの保守を分担 共通パターン = よく使う設定パターン 共通パターンを専用Templateに集約
例: 社内IPを許可するSecurityGroupにIPを追加する ELB EC2 Security Group ServiceA Stack ELB Security
Group EC2 ServiceB Stack
1. 新しい支店のIPを追加する ELB EC2 Security Group ServiceA Stack ELB Security
Group EC2 ServiceB Stack
2. 各Stackの管理者にIP追加を依頼 ELB EC2 Security Group ServiceA Stack ELB Security
Group EC2 ServiceB Stack 支店のIPを SecurityGroup に追加してー
3. Stackの管理者はIPを確認しSecurityGroupに追加 ELB EC2 Security Group ServiceA Stack ELB Security
Group EC2 ServiceB Stack ServiceAに 支店のIPを追加 ServiceBに 支店のIPを追加
SecurityGroupが二重管理 ELB EC2 Security Group ServiceA Stack ELB Security Group
EC2 ServiceB Stack 同じ設定を 2箇所で管理 2つだけなら まだいいけど...
管理がつらそう
解決策: 社内IPを許可する専門Templateを作成 CompanySG.yaml
1. 社内IPを許可する専用Templateを作成 CompanySG.yaml 社内IPを許可する SecurityGroupを 追加 Company SG
2. 専用テンプレートをS3にアップロード CompanySG.yaml Company SG
3. 各Stackにネストされたスタックとして作成 ELB EC2 Company SG ServiceA Stack ELB Company
SG EC2 ServiceB Stack Company SG 各Stackで 同じTemplate を参照
新しい支店のIPを追加する CompanySG.yaml Company SG
1. CompanySGに新しい支店のIPを追加する 支店のIPを CompanySG に追加 CompanySG.yaml Company SG
2. CampanySG.yamlをS3にアップロード CompanySG.yaml Company SG
3. 各Stackを更新 ELB EC2 Company SG ServiceA Stack ELB Company
SG EC2 ServiceB Stack Company SG 変更を 加えずに更新
4. Campany.yamlの変更が各Stackに反映される ELB EC2 Company SG ServiceA Stack ELB Company
SG EC2 ServiceB Stack Company SG Campany.yaml と同期
Stackの管理者 は社内IPの 保守はしない 共通パターンの保守が容易に ELB EC2 Company SG ServiceA Stack
ELB Company SG EC2 ServiceB Stack Company SG
Stackの管理者 は社内IPの 保守はしない 仕事が減った! ELB EC2 Company SG ServiceA Stack
ELB Company SG EC2 ServiceB Stack Company SG
おまけ
より詳細な実践方法はブログをご参照ください
目次 1. 自己紹介 & 会社紹介 2. 問題点 3. 実践!ベストプラクティス 4.
まとめ
1. 記述の簡素化 2. Stackの管理を分担 3. 変更コストが激減 CloudFormationの管理が圧倒的に楽になったッッ!!!
1. 記述の簡素化 2. Stackの管理を分担 3. 変更コストが激減 CloudFormationの管理が圧倒的に楽になったッッ!!!
• 1Templateの行数: 3000行 → • Parametersの数: 20個 → Templateの記述がかなりシンプルになった Stack分割で1Templateがミニマム化
• 1Templateの行数: 3000行 → 200行 • Parametersの数: 20個 → Templateの記述がかなりシンプルになった
Stack分割で1Templateがミニマム化
• 1Templateの行数: 3000行 → 200行 • Parametersの数: 20個 → 2〜5個
Templateの記述がかなりシンプルになった Stack分割で1Templateがミニマム化
• 1Templateの行数: 3000行 → 200行 • Parametersの数: 20個 → 2〜5個
よっしゃ! Stack分割で1Templateが小さくなった
1. 記述の簡素化 2. Stackの管理を分担 3. 変更コストが激減 CloudFormationの管理が圧倒的に楽になったッッ!!!
• アプリ側でもリソースの管理が可能に • テスト環境の作成依頼がなくなる • インフラ担当がボトルネックじゃなくなる チームとStackを分担して管理可能に 専用Templateを作成した結果
• アプリ側でもリソースの管理が可能に? • テスト環境の作成依頼がなくなるかも... よかった! 所有権でStackを分割した結果
1. 記述の簡素化 2. Stackの管理を分担 3. 変更コストが激減 CloudFormationの管理が圧倒的に楽になったッッ!!!
• Stack間の連携が容易に • 影響範囲の特定が容易に • リリース日の調整が不要に 変更にかかるコストが激減 クロススタック参照でリソースの依存が限定された
• 影響範囲の特定が容易に • リリース日の調整が不要に • 変更セットが使用可能に! やったね! Stackの分割でリソースの依存が限定された
さいごに
None
ありがとうございました!!!