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
2
3.1k
実践!CloudFormation Best Practice ~CloudFormationで始める組織改革~
urmot
February 23, 2019
Tweet
Share
More Decks by urmot
See All by urmot
DDDにおける認可の扱いとKotlinにおける実装パターン / authorization-for-ddd-and-kotlin-implement-pattern
urmot
4
740
ログラスを支える設計標準について / loglass-design-standards
urmot
12
2.6k
ログラスを支える技術的投資の仕組み / loglass-technical-investment
urmot
10
5.7k
CircleCIを導入した話
urmot
0
61
SPA on AWS
urmot
0
170
実践!CloudFormation Best Practice
urmot
0
170
RDBのログを取る時にDMSを使うという選択肢
urmot
0
93
ベンチャー企業のインフラを運用して学んだ99のこと
urmot
0
1.1k
Other Decks in Technology
See All in Technology
ブラックフライデーで購入したPixel9で、Gemini Nanoを動かしてみた
marchin1989
1
520
Amazon Kendra GenAI Index 登場でどう変わる? 評価から学ぶ最適なRAG構成
naoki_0531
0
100
小学3年生夏休みの自由研究「夏休みに Copilot で遊んでみた」
taichinakamura
0
150
AI時代のデータセンターネットワーク
lycorptech_jp
PRO
1
280
レンジャーシステムズ | 会社紹介(採用ピッチ)
rssytems
0
150
社外コミュニティで学び社内に活かす共に学ぶプロジェクトの実践/backlogworld2024
nishiuma
0
250
日本版とグローバル版のモバイルアプリ統合の開発の裏側と今後の展望
miichan
1
120
Postman と API セキュリティ / Postman and API Security
yokawasa
0
200
複雑性の高いオブジェクト編集に向き合う: プラガブルなReactフォーム設計
righttouch
PRO
0
110
Snowflake女子会#3 Snowpipeの良さを5分で語るよ
lana2548
0
220
Snykで始めるセキュリティ担当者とSREと開発者が楽になる脆弱性対応 / Getting started with Snyk Vulnerability Response
yamaguchitk333
2
180
大幅アップデートされたRagas v0.2をキャッチアップ
os1ma
2
520
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Optimizing for Happiness
mojombo
376
70k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Practical Orchestrator
shlominoach
186
10k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
Speed Design
sergeychernyshev
25
670
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Code Reviewing Like a Champion
maltzj
520
39k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
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
ありがとうございました!!!