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
PHP ユーザのための OpenTelemetry 入門 / phpcon2024-opentelemetry
shin1x1
1
210
DevFest 2024 Incheon / Songdo - Compose UI 조합 심화
wisemuji
0
100
マルチプロダクト開発の現場でAWS Security Hubを1年以上運用して得た教訓
muziyoshiz
3
2.3k
Postman と API セキュリティ / Postman and API Security
yokawasa
0
200
Turing × atmaCup #18 - 1st Place Solution
hakubishin3
0
480
[Ruby] Develop a Morse Code Learning Gem & Beep from Strings
oguressive
1
160
サービスでLLMを採用したばっかりに振り回され続けたこの一年のあれやこれや
segavvy
2
430
生成AIのガバナンスの全体像と現実解
fnifni
1
190
5分でわかるDuckDB
chanyou0311
10
3.2k
How to be an AWS Community Builder | 君もAWS Community Builderになろう!〜2024 冬 CB募集直前対策編?!〜
coosuke
PRO
2
2.8k
生成AIをより賢く エンジニアのための RAG入門 - Oracle AI Jam Session #20
kutsushitaneko
4
230
オプトインカメラ:UWB測位を応用したオプトイン型のカメラ計測
matthewlujp
0
170
Featured
See All Featured
Building Applications with DynamoDB
mza
91
6.1k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Fireside Chat
paigeccino
34
3.1k
A designer walks into a library…
pauljervisheath
204
24k
It's Worth the Effort
3n
183
28k
Side Projects
sachag
452
42k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
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
ありがとうございました!!!