【CloudFormation】Black Beltをブログ化してみた・前編
はじめに
こんにちは、Macで文章打つときは「サジェスト無効・ライブ変換有効」が一番よさげと感じている ちゃだいん(@chazuke4649)です。
今日は AWS CloudFormation (以下 CFn) のBlack Beltの資料をブログ化してみました。(とても長いので前半後半に分けました)
誰かのお役に立てれば幸いです。
※後編はコチラ
【CloudFormation】Black Beltをブログ化してみた・後編
掲載元資料
- Slideshare
- 動画
アジェンダ
- CFn 概要
- コンセプト (前半はここまで)
- 機能
- 設計まわりの機能
- 運用まわりの機能
- ベストプラクティス
- まとめ
CFnの概要
AWSを利用するときによくあるケース
- AWSリソースの構築・管理を効率化したい
- 開発標準に基づいてインフラを作成・変更したい
- リソースの依存関係やプロビジョニングの順序を確実にしたい
- ソフトウェアのようにインフラをコード化し、バージョン管理、レビューしたい
→ そんなときにクラウドフォーメーション
AWS CloudFormation とは
- シンプルなテキストファイル(テンプレート)を使用して、あらゆるリージョンとアカウントでアプリケーションに必要とされるAWSリソースをプロビジョニングできるサービス
- プロビジョニングされたAWSリソースに対する変更・削除も可能で、削ぐとウェアに対し行うのと同じ方法でインフラを管理できる
- 追加料金なし(プロビジョニングされたAWSリソース分の料金のみ発生)
CloudFormationの特徴
- JSON/YAMLファイル形式
- 安全な管理
- 変更のプレビュー
- 依存関係の管理
- クロスアカウントとクロスリージョンの管理
- 拡張性
- CFnがサポートする主なサービス(最新情報はコチラ)
コンセプト
全体像
- テンプレート(JSON/YAML形式のテキスト)
- リソースの定義
- パラメータの定義
- CFn(フレームワーク)
- スタックの作成・変更・削除
- エラー検知とロールバック
- スタック(AWSリソースの集合)
テンプレートの概要
- CFnの心臓部
- スタックの設計図
- どのリソースをどう起動するかを記述する
- リソースの依存関係はCFnが自動判定する
- JSON/YAML形式で記述
テンプレートの要素
- AWS TemprateVersion
- Description
- Metadata
- Parameters
- Mappings
- Conditions
- Transform
- Resources
- Outputs
Resources
- EC2やELB,RDSなど、起動するリソースを指定
- 必須のセクション
- リソースごとに決められたプロパティを指定
- 利用可能なリソースタイプは現在69サービス(最新情報はウェブを参照)
論理IDと物理ID
- 論理ID
- テンプレート内で一意
- テンプレートの他の部分のリソースを参照するために使用
!Ref
や!GetAtt
で使用
- 論理ID
- リソースに実際に割り当てられている名前(EC2インスタンスID,S3バケットなど)
- CFnテンプレート以外のリソースを識別する場合に使用
Metadata
- テンプレートに関する追加情報を提供するオブジェクト
- 例)Instanceの説明文をMetadataに記述
Metadata Key
- 一部の機能では、metadataセクションで定義した設定又は設定情報を取得可能
- 例)AWS::CloudFormation::Interface -> パラメータをグループ化およびソートする方法を定義するmetadata key
Parameters
- スタック作成・更新時にユーザに入力させる値を定義
- データ型、デフォルト値、最大値、最小値、などのプロパティを設定可能
- Parametersの主なプロパティ
- Parametersの参照
組み込み関数
- パラメータの参照や値の加工などに利用する関数
- 記法は完全名の
[Fn::xxx]
と短縮形の[!XXX]
の2つ - 以下主な組み込み関数
名称 | 記法 |
---|---|
値を参照する | !Ref, !GetAtt |
文字列を結合する | !Join |
AZを取得する | !GetAZs |
エクスポート値取得 | Fn::InportValue |
Base64エンコード | Fn::Base64 |
条件関数 | Fn::If, Fn::Equals, Fn::Not |
組み込み関数の使い方
- !Ref
- テンプレート内の論理名(ID)から物理名(ID)までを参照する
- 戻り値はリソースによって異なる
- 例) "!Ref EC2 (AWS::EC2::Instance)の論理名" -> EC2のインスタンス名
- 例) "!Ref RDS (AWS::RDS::DBINstance)の論理名" -> RDSのインスタンス名
- !GetAtt
- リソースが持つ属性値を取得する
- 例)"!GettAtt EC2の論理名.PublicDnsName" -> EC2のパブリックDNS名
- 例)"!GettAtt EC2の論理名.PrivateIp" -> EC2のプライベートIP
- 例)"!GettAtt RDSの論理名.Endpoint.Port" -> RDSの起動ポート
- !Join
- 一連の値を特定の区切り文字で区切って1つの値にする
擬似パラメータ (Pseudo Parameters)
- あらかじめ定義された擬似パラメータ群で
"!Ref"
により参照可能 - 利用可能な主なパラメータ
- AWS::Region -> リージョン名を取得
- AWS::StackId -> スタックIDを取得
- AWS::StackName -> スタック名を取得
- AWS::AccountId -> AWSアカウントIDを取得
- AWS::NoValue -> 指定されたプロパティを無視するようCFnに伝える
Mappings
- キーと値のマッピングテーブルを管理
- リージョンやユーザ入力パラメータによって、値が変わるものを利用
- Mappingsを利用することでテンプレートの再利用性が向上
Mappingsの使い方
- 組み込み関数の
"Find::InMap"
を使って値を取得 - 例)
"Fn::FindInMap" :[”MapName","Key","Value"]
- 引数の
MapName
,Key,Value
には"!ref"
が利用可能
Conditions
- 条件名と成立条件を列挙
- Resourcesセクションなどで、「ある条件が成立している時のみリソースを起動」といった条件ベースの制御が可能
- 本番環境と検証環境で構成が異なる場合に便利
- Conditionsを多く使用すると、テンプレートの可読性が下がる
Transform
- テンプレートの処理に使用する1つ以上のマクロを指定
- AWS::Serverless
- AWS::Include
- Macros
Outputs
- スタック構築後に取得・表示したい情報を定義
- アクセスURLや、DBの通信先情報、作成したIAMユーザ名など、あとで使用したい情報がある場合に便利
- Cross Stack Reference(後述)でのEXportにも使用
テンプレートまとめ
- JSON/YAML形式でスタックの情報を記載
- リソース間の依存関係はCFnが自動判別
- Parametersを利用すれば、パラメータのユーザ入力を受け取れる
- マネジメントコンソールに値を出力したい場合はOutputsに記述
スタックの概要
- テンプレートからプロビジョニングされるリソースの集合
- スタック単位でリソースの管理が可能(スタックの削除を実行すると、スタックにひもづくリソースが削除される)
- 使用するリソースおよびリソースの構築順は、テンプレートに依存関係からCFnが自動的に決定
スタックの作成方法
- マネジメントコンソール
- AWS CLI
- AWS SDK
- Java
- .NET
- Node.js
- PHP
- Python
- Ruby
- Go
- C++
後半に続く
アジェンダ(再掲)
- CFn 概要
- コンセプト
- 機能 (後半はここからです)
- 設計まわりの機能
- 運用まわりの機能
- ベストプラクティス
- まとめ
前半はここまで。後半は機能からです。ではでは。