【CloudFormation】Black Beltをブログ化してみた・前編

はじめに

こんにちは、Macで文章打つときは「サジェスト無効・ライブ変換有効」が一番よさげと感じている ちゃだいん(@chazuke4649)です。

今日は AWS CloudFormation (以下 CFn) のBlack Beltの資料をブログ化してみました。(とても長いので前半後半に分けました)

誰かのお役に立てれば幸いです。

※後編はコチラ

【CloudFormation】Black Beltをブログ化してみた・後編

掲載元資料

  • Slideshare

  • PDF

PDF版はコチラ

  • 動画

 

アジェンダ

  • 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 概要
  • コンセプト
  • 機能 (後半はここからです)
    • 設計まわりの機能
    • 運用まわりの機能
  • ベストプラクティス
  • まとめ

前半はここまで。後半は機能からです。ではでは。