Slide 1

Slide 1 text

実践! CloudFormation Best Practice ~設計編~ レバレジーズ株式会社 村本 雄太 2018/12/19

Slide 2

Slide 2 text

目次 ● 自己紹介 ● 背景 ● 解説!CloudFormation Best Practice ● 実践!CloudFormation Best Practice ● まとめ

Slide 3

Slide 3 text

自己紹介.yaml Name: 村本 雄太 BelongsTo: レバレジーズ株式会社: SRE Team Tags: - 新卒2年目 - いんふらえんじにあ

Slide 4

Slide 4 text

自己紹介.png

Slide 5

Slide 5 text

自己紹介.png

Slide 6

Slide 6 text

自己紹介.png

Slide 7

Slide 7 text

自己紹介.png

Slide 8

Slide 8 text

背景

Slide 9

Slide 9 text

背景 CloudFormationテンプレートを管理するのにつかれた

Slide 10

Slide 10 text

CloudFormationテンプレートが肥大化 どこに何を書けばよいかわからない そして誰も使わなくなる... 背景 CloudFormationテンプレートを管理するのにつかれた

Slide 11

Slide 11 text

誰も使わないテンプレートじゃなくて みんなが使うものを作ろう!

Slide 12

Slide 12 text

背景

Slide 13

Slide 13 text

AWS CloudFormation Best Practice を実践しよう!

Slide 14

Slide 14 text

解説!AWS CloudFormation Best Practice by https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/best-practices.html

Slide 15

Slide 15 text

解説!AWS CloudFormation Best Practice 1. ライフサイクルと所有権でスタックを整理 2. クロススタック参照を利用して共通リソースをエクスポート 3. ネストされたスタックを利用して共通テンプレートパターンを再利用 4. テンプレートを再利用して複数環境にスタックを複製する

Slide 16

Slide 16 text

1. ライフサイクルと所有権でスタックを整理

Slide 17

Slide 17 text

解説!CloudFormation Best Practice ライフサイクルと所有権によるStackの整理 ● Stackを分ける基準についての項目 ● ライフサイクルと所有権という概念でStackを分ける ● 他リソースに影響を与えずリソースセットを変更可能

Slide 18

Slide 18 text

ライフサイクルとは

Slide 19

Slide 19 text

解説!CloudFormation Best Practice ライフサイクルが同じリソースはまとめて管理しよう ● AWSリソースのライフサイクルのこと ● テンプレートの変更による影響を閉じられる ● Point: AWSリソースの死に際を意識する ○ あるAWSリソースを削除する時に同時に削除されるべきものを纏める

Slide 20

Slide 20 text

解説!CloudFormation Best Practice 例: 期間限定のキャンペーン用のサーバをつくる Campaign EC2 Campaign ELB WebSite ELB WebSite EC2 S3 RDS

Slide 21

Slide 21 text

解説!CloudFormation Best Practice 例: 期間限定のキャンペーン用のサーバをつくる Campaign EC2 Campaign ELB WebSite ELB WebSite EC2 S3 RDS キャンペーン終了後 使ったリソースを 削除したい

Slide 22

Slide 22 text

解説!CloudFormation Best Practice 例: 期間限定のキャンペーン用のサーバをつくる Campaign EC2 Campaign ELB WebSite ELB WebSite EC2 S3 RDS キャンペーン終了後 使ったリソースを 削除したい

Slide 23

Slide 23 text

解説!CloudFormation Best Practice 例: 期間限定のキャンペーン用のサーバをつくる Campaign EC2 Campaign ELB WebSite ELB WebSite EC2 S3 RDS キャンペーン終了後 使ったリソースを 削除したい キャンペーンでS3 使ってたっけ?

Slide 24

Slide 24 text

解説!CloudFormation Best Practice

Slide 25

Slide 25 text

解説!CloudFormation Best Practice 解決策: キャンペーン用のStackを別に作成する Campaign EC2 Campaign ELB WebSite ELB WebSite EC2 S3 RDS Campaign ELB Campaign EC2 S3 WebSite ELB WebSite EC2 S3 RDS

Slide 26

Slide 26 text

解説!CloudFormation Best Practice 例: 期間限定のキャンペーン用のサーバをつくる Campaign ELB Campaign EC2 S3 WebSite ELB WebSite EC2 S3 RDS キャンペーン終了は キャンペーンのStack を削除するだけ

Slide 27

Slide 27 text

解説!CloudFormation Best Practice 解決策: キャンペーン用のStackを別に作成する Campaign ELB Campaign EC2 S3 WebSite ELB WebSite EC2 S3 RDS キャンペーン終了は キャンペーンのStack を削除するだけ キャンペーンリソースが 削除された事による影 響を閉じられる

Slide 28

Slide 28 text

所有権とは

Slide 29

Slide 29 text

解説!CloudFormation Best Practice 所有権が異なるリソースは分けて管理しよう ● AWSリソースの所有権のこと ● AWSリソースを誰が管理すべきかという観点で考える ● 各チームのリソース変更にかかるコストを減らせる ● テンプレートの柔軟な変更が可能となる

Slide 30

Slide 30 text

解説!CloudFormation Best Practice 例: DBチームとWebチームで運用されているサービス EC2 ELB RDS Parameter Groups Security Group Security Group

Slide 31

Slide 31 text

DBチーム: RDS SecurityGroup を変更したい 解説!CloudFormation Best Practice 例: DBチームとWebチームで運用されているサービス EC2 ELB RDS Parameter Groups Security Group Security Group

Slide 32

Slide 32 text

Webチーム: Web SecurityGroup を変更したい 解説!CloudFormation Best Practice 例: DBチームとWebチームで運用されているサービス EC2 ELB RDS Parameter Groups Security Group Security Group

Slide 33

Slide 33 text

更新タイミング の調整 影響範囲の確認 解説!CloudFormation Best Practice 例: DBチームとWebチームで運用されているサービス EC2 ELB RDS Parameter Groups Security Group Security Group

Slide 34

Slide 34 text

解説!CloudFormation Best Practice

Slide 35

Slide 35 text

解説!CloudFormation Best Practice 解決策: WebチームとDBチームでStackを分ける EC2 ELB RDS Parameter Groups Security Group Security Group EC2 ELB RDS Security Group Parameter Groups Security Group

Slide 36

Slide 36 text

解説!CloudFormation Best Practice 解決策: WebチームとDBチームでStackを分ける EC2 ELB RDS Security Group Parameter Groups Security Group 更新タイミング の調整は不要 影響範囲もStack内 で確認できればOK

Slide 37

Slide 37 text

解説!CloudFormation Best Practice ● SOA = Service Oriented Architecture ○ ServiceをNetwork上で連携させてシステムの全体構成をしていく ○ Service: 業務上の一処理 ● 多層アーキテクチャ ○ アプリケーションを複数の層に分け, 独立したモジュールとして開発 ○ 各層はその直下の層に依存する おまけ: 詳細なStackの分け方は多層アーキテクチャとSOAが使える(らしい)

Slide 38

Slide 38 text

2. クロススタック参照を利用して共有リソースを エクスポート

Slide 39

Slide 39 text

解説!CloudFormation Best Practice クロススタック参照で共有リソースをエクスポートする ● 別Stackのリソースの値を参照できる ● 参照されている値の変更は不可能 ○ 依存関係ができるので利用する際は注意が必要 ● ハードコードするくらいならクロススタック参照

Slide 40

Slide 40 text

3. ネストされたスタックを使用して 共通テンプレートパターンを再利用する

Slide 41

Slide 41 text

● StackとTemplateは別の概念と認識する ● Template: 呼び出す際に値を注入して利用 ● Stack: AWSリソースを作るための情報を全て持つ ● テンプレートが膨大になることを防ぐ ○ どこに何を書けばよいかわからない状態を防げる 解説!CloudFormation Best Practice ネストされたスタックを使用して共通パターンを再利用する

Slide 42

Slide 42 text

● StackもCloudFormationで作ることができる ● 共通したパターンを別Templateに抽出する ● 抽出したTemplateからStackを作成する ● ネストされたStackの変更は参照先に伝搬する 解説!CloudFormation Best Practice AWS::CloudFormation::Stackを使う

Slide 43

Slide 43 text

解説!CloudFormation Best Practice ネストされたStackを利用するメリット ● コピペを減らせる ● Stackをコンポーネントに閉じることができる ● コンポーネントの保守を分担できる(かも)

Slide 44

Slide 44 text

4. テンプレートを再利用して 複数環境にスタックを複製する

Slide 45

Slide 45 text

解説!CloudFormation Best Practice テンプレートを再利用して複数環境にスタックを複製する ● CloudFormationは条件式を使った制御が可能 ● 開発、テスト、本番の環境を条件式で制御する

Slide 46

Slide 46 text

● Stackは極力簡潔に書きたい ● 条件式による制御をいれると複雑になってしまう ● あと、各環境で差分が結構ありそう ○ 冗長化をしない ○ 低スペックにする ○ テスト環境は社内アクセスのみ 解説!CloudFormation Best Practice 個人的な疑問点

Slide 47

Slide 47 text

実践!CloudFormation Best Practice

Slide 48

Slide 48 text

実践!CloudFormation Best Practice ディレクトリ構成: StackとTemplateを分ける

Slide 49

Slide 49 text

● ライフサイクルと所有権によってStackを分ける ● 再利用されないことを前提とする ● AWSリソースを作るために必要な情報を全て記述 ○ CloudFormationで管理していないものはここでハードコードする 実践!CloudFormation Best Practice Stacks: AWSリソースを作るために必要な情報を全て記述する

Slide 50

Slide 50 text

● 共通したライフサイクルと所有権を持つリソース郡 ● 間の連携にはクロススタック参照を用いる ● SOAの考えが利用できる部分(かもしれない) 実践!CloudFormation Best Practice : ある機能を構成するAWSリソース郡をまとめたもの

Slide 51

Slide 51 text

● 各層のリソースは類似したライフサイクルと所有権を持つ ● 各層はその直下の層に依存する ● 各層はネストされたStackとして依存解決を行う 実践!CloudFormation Best Practice : 多層アーキテクチャでいう独立したモジュール

Slide 52

Slide 52 text

● 以下のディレクトリには必ずmaster.yamlを置く ● 各層の依存解決を担う ● クロススタック参照で使う値のエクスポートも行う 実践!CloudFormation Best Practice master.yaml: 各層の依存解決を行うCloudFormationテンプレート

Slide 53

Slide 53 text

● 再利用されることを前提に記述する ● ParametersやConditionsを使用して制御を行う ● よく使う設定をここにまとめる 実践!CloudFormation Best Practice Templates: 共通パターンのテンプレート郡

Slide 54

Slide 54 text

まとめ

Slide 55

Slide 55 text

CloudFormation Best Practiceを実践する まとめ 所有者が明確になり、 少ない操作で安全にAWSリソースを更新できる みんなが使うテンプレートの完成!?!

Slide 56

Slide 56 text

おわり