はじめに
今回はAWSインフラ構築のコード化(IaC)にかかせない、AWS CloudFormationの基礎についてまとめてみました。
少しでもご参考になれば幸いです。
CloudFormationとは
AWS CloudFormationは、AWSのリソース(EC2、S3、VPCなど)をコードで定義して自動構築・管理するサービスです。
AWSコンソール上でリソースを手動で管理する必要がなくなるため、ヒューマンエラー削減や再利用性が向上といったメリットがあります。
よく出る単語
テンプレート
・JSONまたはYAMLでリソース構成を定義したドキュメントのことを指します。
スタック
・テンプレートから実際に作られたリソースの集合のことを指します。
処理の流れ
YAMLを書く
↓
CloudFormationに送信する
↓
(CloudFormationが)内部でJSON化 + 構文チェック
↓
(CloudFormationが)スタックを作成(スタック単位で管理)
↓
(CloudFormationが)リソース依存関係の解決・作成順序の決定
↓
(CloudFormationが)各AWSサービスにAPIコール
↓
リソース作成完了
↓(必要に応じて)
YAMLを修正する
↓
CloudFormationに送信して更新する
↓(不要になったら)
リソースを削除する
YAMLの記述方式
※実務では可読性・記述量の少なさといった点からYAMLが主流のため、今回はYAMLで記述しています。
Key:<半角スペース>Value
・キーとバリューの組み合わせでデータを表現します
・半角スペースが必要です
・Valueのデータ型には[文字列・数値・ブール値]が入ります
・インデントでデータの構造を表現します
・#を使用してコメントを書くことができます(JSONだとできない)
セクション
Resources
・唯一の必須項目です
・AWSリソース郡を定義します
Parameters
・実行時に渡す変数値を定義します
・実行者によって値を変えたい場合などに使います
Mappings
・環境によって変わる値をMap形式で定義します
・リージョンによって変わるAMIなどを定義しておきます
Metadata
・パラメータのグルーピングに使用します
Conditions
・条件式の結果(true/false)に応じてリソースの作成有無を分岐できます
・パラメータと組み合わせて使うことが多いです
Outputs
・作成したリソースに関する情報をコンソールに出力します
・スタック間のリソース情報の連携に使用します
組み込み関数
!Ref
・他の要素を参照します
・作成されるまでわからない値(VPCIdなど)に使用します
・AWSリソースごとにRefが参照する値は変わるため、公式ドキュメントで確認する必要があります
!Sub
・他の要素を参照します(!Refとは異なり${}が必要です)
・文字列の結合ができます
!GetAtt
・リソースの論理ID.属性で任意に指定した要素を参照できます
・Outputsセクションで使用することが多いです
・!GetAttで取得できる値もAWSリソースごとに公式ドキュメントで確認する必要があります
!FindInMap
・Mappingsで定義された値からキーに合致する値を参照します
!ImportValue
・他のスタックから値をインポートします
!Equals
・Conditionsの条件式の中で値が一致するかを判定します
疑似パラメータ(事前に定義された変数)
AWS::Region
・テンプレートが実行されたリージョンを自動で取得します
AWS::AccountId
・テンプレートが実行されたアカウントIDを自動で取得します
DependsOnが必要なケース
!Ref等を使用する場合、CloudFormationは依存関係を自動で解決してくれますが、
以下のように 「!Ref等を使用しないリソース間に依存関係がある場合」 にはDependsOnが必要になります。
PublicRouteはPublicRouteTableとmyInternetGatewayに対して!Refを使用していますが、AttachGatewayには使用していません(依存関係はあるのに)
myInternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: test-igw
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref myVPC
InternetGatewayId: !Ref myInternetGateway
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref myVPC
Tags:
- Key: Name
Value: public-rt-a
# 0.0.0.0/0 → IGW
PublicRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway # IGWアタッチ後にルート作成するため DependsOn を使う
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref myInternetGateway
おわりに
実際に使ってみた記事もぜひ合わせてご参照ください。