【CloudFormation】Black Beltをブログ化してみた・後編
はじめに
こんにちは、ちゃだいん (@chazuke4649) です。
Macを使うようになってから、Windowsキー(ウィンドウを全画面・右半分・左半分など簡単に操作できるWindowsPC独自のキー)だけはなんとかして取り戻したいと願ってます。
前回に引き続き、 AWS CloudFormation (以下 CFn) のBlack Beltの資料をブログ化してみました。
誰かのお役に立てれば幸いです。
※前編はコチラ
【CloudFormation】Black Beltをブログ化してみた・前編
掲載元資料
- Slideshare
- 動画
アジェンダ
- CFn 概要
- コンセプト
- 機能(後半はここから)
- 設計まわりの機能
- 運用まわりの機能
- ベストプラクティス
- まとめ
CFnの機能(設計まわりと運用まわり)
基本機能
- 作成
- テンプレートに定義された構成でスタックを自動作成
- 変更
- スタックに前回のテンプレートとの差分を適用
- リソース変更時には無停止変更・再起動・再作成のいずれが発生
- Change Set を作ることで差分の内容を事前に確認可能
- Drift Detection で実際のリソースとの差分を確認可能
- 削除
- 依存関係を解決しつつリソースを全て削除
- データストアは保持・スナップショット取得が可能
- 注意)手動で行った変更はCFnの管理外
設計まわりの機能
- Nested Stacks
- Cross Stack Reference
- AWS SAM (AWS Serverless Application Model)
- Macros
- Dynamic References
- AWS CDK (AWS Cloud Development Kit)
1. Nested Stacks
- 各テンプレートの共通部分を専用テンプレートとして作成
- スタックの親子関係を実現
2. Cross Stack Reference (クロススタック参照)
- あるスタックから値をエクスポートし、別のスタックで参照
- 多層またはサービス指向アーキテクチャを実現
3. AWS SAM (AWS Serverless Application Model)
- AWS上でサーバレスアプリケーションを管理及び展開する
- CFnでネイティブにサポートされている構文を使用して、サーバレスアプリケーションとして代表的なサービスであるLambda, API Gateway DynamoDBを簡単に定義可能
- 利用にはCFnにてサーバレスアプリケーションの宣言を行う
4. Macros
- テンプレートの標準的な機能では実現できない処理を、Lambda関数を呼び出すことで実現
- 検索や置換などの単純な操作からテンプレート全体の変換まで独自処理が可能
- Lambda関数でリソースの作成や削除を行わないことを推奨
5. Dynamic References
- AWS Systems ManagerのパラメータストアとAWS Secrets Managerに格納されたデータを動的に参照
- どちらのデータもAWS Systems Managerのパラメータストアから参照可能
- 例)AWS Systems Managerに保存されたSecureStringを参照
- AWS Systems Managerには最新のAmazon Linux AMIのIDが格納されているため、テンプレートから最新のAMI IDのマッピングが不要
6. AWS CDK (AWS Cloud Development Kit)
- 開発者プレビュー
- ソフトウェア開発のフレームワーク
- インフラをJava等のコードで定義してCFnでプロビジョニング
- オブジェクト指向的に記述&ループ等の使用可能
- 推奨デフォルト値が設定済みのためコード量が少ない
- 現在、Java,JavaScript,Typescript,.NETに対応
運用まわりの機能
- Change Set
- Drift Detection
- Rollback triggers
- StackSets
- AWS CloudFormation Designer
- スタックとリソースの保護
- スタックの削除保護
- スタックポリシー
- リソースのDeletionPolicy属性
- ユーザのIAMポリシー
1. Change Set (変更セット)
- 変更を要求した箇所とそ音変更により影響を受ける箇所を事前に確認可能
- リソース変更時には無停止変更・再起動・再作成のいずれかが発生するため、Change Setによる事前確認が必要
- 変更に伴うサービス停止の有無は各リソースの各プロパティによって変わる
2. Drift Detection(ドリフト検出)
- テンプレートと現状のリソースの差分(ドリフト)を検出
- スタックを作成した後に手動(マネジメントコンソール、CLI,SDK)で実施した変更作業によって発生した差分をチェック可能
- 現在、EC2,RDSなど17サービスに対応 *最新リストはwebを参照
- Config のマネージドルールにより、差分が発生したらすぐに検知可能
- テンプレートに記載されていないプロパティについては差分をチェックしない
3. Rollback Triggers
- スタックの作成・更新中にアプリケーションの状態をCFnでモニタリングし、指定したアラームのしきい値を超過した場合に、そのオペレーションをロールバック
- 例)スタックの行進中にアプリケーションの外形監視でエラーが発生したらロールバック
4. StackSets
- 1つのテンプレートを複数のawsアカウント及び複数のリージョンに展開可能
5. AWS CloudFormaiton Designer
- テンプレート内のリソースを可視化
- テンプレートの修正をドラック&ドロップで対応可能
- サンプルテンプレートのカスタマイズが用意
- JSON⇄YAML変換が可能
6. スタックとリソースの保護
- スタックやリソースが謝って変更・削除されないように保護するための機能
- 複数のレイヤで保護機能を提供
(1) スタックの削除保護
- スタックが誤って削除されるのを防ぐ
- スタックの削除保護を有効または無効にすると、スタックに属するネストされた全てのスタックにも設定される
(2) スタックポリシー
- スタックの更新中にスタックのリソースが意図せずに変更・削除されるのを防ぐ
- 指定したリソースに対して実行できるアクションを定義するJSONドキュメント
- 例)RDSリソースに対する変更を禁止するポリシー
(3) リソースのDeletionPolicy属性
- スタックが削除された際にリソースを保持またはバックアップ
- 例)スタックが削除されてもS3バケットを保持
(4) ユーザーのIAMポリシー
- IAMポリシーでCFnのアクションを制御
- 例)IAMユーザに対するスタック作成を禁止
運用のベストプラクティス
- テンプレート分割
- テンプレートの作成方法
- スタックの更新手順
- 権限の分離
テンプレート分割
- 規模が大きくなると単一のテンプレートでの管理は手間と時間がかかり、変更時の影響範囲も大きくなるため、テンプレートを分割する
テンプレートの作成方法
- クイックスタート
- サンプルテンプレート&テンプレートスニペット
- 自らテンプレートを作成
1.クイックスタート
- セキュリティや可用性を考慮したベストプラクティス
- マイクロソフト、SAP、トレンドマイクロなどの製品をサポート
- 15分程度でアプリケーションをAWS上に展開可能、カスタマイズも可能
2.サンプルテンプレート&テンプレートスニペット
- これからCFnを使い始める場合
- 独自のテンプレートを短時間で作成したい場合
3.自らテンプレートを作成
- JSON/YAML形式でのテンプレートをゼロから作成
- 試行錯誤はあるが結局一番描きやすい
- リファレンスを見ながら作成(https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)
- ツールによる書式・構文チェックを活用
- VScodeの"CloudFormation support for Visual Studio Code"(https://marketplace.visualstudio.com/items?itemName=aws-scripting-guy.cform)
- Linterのcfn-python-lint(https://github.com/awslabs/cfn-python-lint)
- 各エディタExtensionsあり(https://marketplace.visualstudio.com/items?itemName=kddejong.vscode-cfn-lint)
- CLIから"aws cloudformation validate-template"もあるがこのLinterの方が範囲が広い
- お好きなエディタでハイライト、フォーマッティング、構文チェック、自動補完
- テンプレート作成中はスタック作成とロールバックの繰り返し→CLIで操作
- しかし長いコマンドの入力は手間
- ヘルパースクリプトの作成を推奨
- よく使うコマンドを簡単に使えるようにしておく
- 作成・更新・削除・状態確認・validation
スタックの更新手順
※図が中心となるスライドのため、そのまま掲載します
まとめ
- 開発や本番運用に必要なAWSリソースをテキストファイルで記述し、そのリソースを適切な順序でプロビジョニングが可能
- 設計、運用に関する様々な機能を提供
- ベストプラクティスを参考にして運用
参考資料
- ドキュメント https://dev.classmethod.jp/wp-content/uploads/2019/01/httpstls.oguri_.classmethod.infoindex.html-2019-01-25-06-37-20.png#lang/ja_jp
- テンプレートの分析 https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-anatomy.html
- リソースタイプ https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html
- サンプルテンプレート https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-sample-templates.html
- よくある質問 https://aws.amazon.com/jp/cloudformation/faqs/
終わりに
いかがでしたか。
Black Belt の資料を読み込もうとしている方のお力になれれば幸いです。それではまた。