【AWS】CloudFormation ~ 基本編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/10/26/224812

の続き。

AWS CloudFormation (CFn) について、
もう少し掘り下げてみる。

目次

【1】CloudFormation を使った構成管理の流れ
【2】テンプレートの各セクション
 01)AWSTemplateFormatVersion - 形式バージョン
 02)Description - テンプレートの説明
 03)Metadata - メタデータ
 04)Parameters - パラメータ
 05)Rules - ルール
 06)Mappings - マッピング
 07)Conditions - 条件
 08)Transform - 変換
 09)Resources - リソース宣言
 10)Outputs - 出力
【3】テンプレート管理 - スタック分割

【1】CloudFormation を使った構成管理の流れ

https://youtu.be/Viyqh9fNBjw?t=567

の 9:27から説明されている。
~~~~~~~~~~~~~~
1)テンプレートをJSON/YAMLで記述
2)テンプレートをアップロード
3)スタックの作成
4)AWSリソースの作成と管理
~~~~~~~~~~~~~~

【2】テンプレートの各セクション

* テンプレートは、いくつかのセクションに分かれている。

* とりあえず、(個人的に)初学者は、
 以下の7つを押さえておけばいいのかと。
~~~~~~
01)AWSTemplateFormatVersion - 形式バージョン
02)Description - テンプレートの説明
04)Parameters - パラメータ
06)Mappings - マッピング
07)Conditions - 条件
09)Resources - リソース宣言 <= ★ここが一番重要
10)Outputs - 出力
~~~~~~

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-anatomy.html

全体像

* 以下の動画(8:33)でも開設されている。

https://youtu.be/HU47ZAM3mtw?t=513

# 01)形式バージョン (任意)
AWSTemplateFormatVersion: "version date"

# 02)テンプレートの説明 (任意)
Description:
  String

# 03)メタデータ (任意)
Metadata:
  template metadata

# 04)パラメータ (任意)
Parameters:
  set of parameters

# 05)ルール (任意)
Rules:
  set of rules

# 06)マッピング (任意)
Mappings:
  set of mappings

# 07)条件 (任意)
Conditions:
  set of conditions

# 08)変換 (オプション)
Transform:
  set of transforms

# 09)リソース宣言 (必須)
Resources:
  set of resources

# 10)出力 (任意)
Outputs:
  set of outputs

01)AWSTemplateFormatVersion - 形式バージョン

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/format-version-structure.html

* テンプレートの機能を識別する
 => 現状、以下「サンプル」で固定。

サンプル

AWSTemplateFormatVersion: "2010-09-09"

02)Description - テンプレートの説明

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-description-structure.html

* このテンプレートの説明書き
 => オプションだけど、目的くらい書いといた方が親切かなっと

サンプル

Description: This is a sample for Hello world

03)Metadata - メタデータ

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html

* テンプレートに関する追加情報を提供する項目
 => 何かAWS管理コンソール上のデザイナから作成した時に利用されてた

動画解説
https://youtu.be/HU47ZAM3mtw?t=707

Metadata key

AWS::CloudFormation::Interface
 => AWS CloudFormation コンソールで
  パラメータをグループ化およびソートする方法を定義

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-interface.html

サンプル

Parameters:
  SampleValue1:
    Description: This is a sample value for demo
    Type: String
    Default: val1
  SampleValue2:
    Description: This is a sample value for demo
    Type: String
    Default: val2
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      # パラメータを入力する画面で「Demo for values」と表示
      - Label:
        defalut: Demo for values
        # その配下に「SampleValue1」「SampleValue2」がグルーピングされて表示
        Parameters:
        - SampleValue1
        - SampleValue2

04)Parameters - パラメータ

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html

* CloudFormation における 入力値を設定できる項目
* データ型、デフォルト値、最大値、最小値などを設定可能
* 指定した値は、「Resources」「Outputs」で使用できる
 => 詳細は、以下の関連記事を参照のこと

CloudFormation ~ Parameters ~
https://dk521123.hatenablog.com/entry/2024/02/29/220042

動画解説
https://youtu.be/HU47ZAM3mtw?t=783

05)Rules - ルール

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/rules-section-structure.html

* スタックの作成または更新時に、
 テンプレートに渡されたパラメータで検証する

06)Mappings - マッピング

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/mappings-section-structure.html

* キー・バリュー型の定数を定義できる
* 指定した値は、「Resources」で使用できる
 => 詳細は、以下の関連記事を参照のこと

CloudFormation ~ Mappings ~
https://dk521123.hatenablog.com/entry/2024/03/09/000428

動画解説
https://youtu.be/HU47ZAM3mtw?t=1052

07)Conditions - 条件

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html

* 条件によりリソースを作成する際に利用
 => ただし、可読性が下がりやすいので、多用は厳禁。
* 指定した値は、「Resources」「Outputs」で使用できる
 => 詳細は,以下の関連記事を参照

CloudFormation ~ 条件分岐 ~
https://dk521123.hatenablog.com/entry/2022/07/02/214543

動画解説
https://youtu.be/HU47ZAM3mtw?t=1120

サンプル

Conditions:
  IsProduction: !Equals [ !Ref EnvironmentType, "prod" ]

Resources:
  S3Bucket:
    Type: 'AWS::S3::Bucket'
    Conditions: IsProduction # prodだったら、S3バケットを作る

08)Transform - 変換

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/transform-section-structure.html

* CloudFormationからLambda関数を呼び出す場合や、
 他のテンプレートをインクルードする場合に使用

動画解説
https://youtu.be/HU47ZAM3mtw?t=1175

09)Resources - リソース宣言

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resources-section-structure.html

* VPC、EC2、S3バケットなど作成するAWSリソースを宣言
 => ★ここが重要

動画解説
https://youtu.be/HU47ZAM3mtw?t=594

構文

Resources:
  CodeBuildProject: # <論理ID> ... テンプレート内で一意
    Type: AWS::CodeBuild::Project # <リソースタイプ>
    Properties: # <リソースごとのプロパティ>

サンプル

Resources: 
  MyEC2Instance: 
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m1.small

10)Outputs - 出力

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html

* Stake構築後に表示した値や他Stakeとの連携のための出力

動画解説
https://youtu.be/HU47ZAM3mtw?t=1226

サンプル

Outputs:
  CodeBuildProjectArn:
    Description: This is an output value.
    Value: !GetAtt CodeBuildProject.Arn
    Export:
      Name: !Sub "${EnviromentType}-CodeBuildProjectArn"
  PipelineProjectArn:
    Value: !GetAtt PipelineProject.Arn

補足:別スタックで値を参照するには (Cross Stack Reference)
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html

# Fn::ImportValue 組み込み関数 で参照可能
Name: !Sub
  - "www.${EnvironmentType}.${Domain}"
  - EnvironmentType:  {'Fn::ImportValue': EnvironmentType}
  - Domain: {'Fn::ImportValue': Domain}

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html

【3】テンプレート管理 - スタック分割

https://youtu.be/Viyqh9fNBjw?t=2475

の 41:15 以降 で説明されている
スタックのテンプレートを分割して管理した方がいいって話。

分割スタック

1)Network Layer
2)Security Layer
3)Application Layer
 A) Application
 B) Data
 C) Shared Service

1)Network Layer

* VPC
* Subnet
* Endpoint
* Route Table
* Route53
* インターネットゲートウェイ (IGW)
* NAT
* ゲートウェイ(GW)
* 仮想プライベートゲートウェイ(VGW)

2)Security Layer

* Security group
* IAM role
* IAM group
* IAM policy

3)Application Layer

* EC2
* RDS
* ELB
* SQS
* Active Directory
* CI/CD server

A) Application

* EC2
* ECS
* ELB
* Auto Scaling
* API Gateway

B) Data

* S3
* RDS
* Redshift
* ElasticCache
* SQS
* EC2(データ保持している場合)

C) Shared Service

* Directory Service
* EC2
* CodeX
* SES
* Route53

参考文献

https://qiita.com/namoshika/items/528d8a50f399b998b14b

関連記事

CloudFormation ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2024/02/10/231900
CloudFormation ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/10/26/224812
CloudFormation ~ 開発環境 ~
https://dk521123.hatenablog.com/entry/2022/05/22/000000
CloudFormation ~ 組み込み関数 ~
https://dk521123.hatenablog.com/entry/2021/12/04/202519
CloudFormation ~ 条件分岐 ~
https://dk521123.hatenablog.com/entry/2022/07/02/214543
CloudFormation ~ Mappings ~
https://dk521123.hatenablog.com/entry/2024/03/09/000428
CloudFormation ~ Parameters ~
https://dk521123.hatenablog.com/entry/2024/02/29/220042
CloudFormation ~ Outputs ~
https://dk521123.hatenablog.com/entry/2024/04/04/112146
CloudFormation ~ 疑似パラメータ ~
https://dk521123.hatenablog.com/entry/2021/12/05/134313
CloudFormation ~ DeletionPolicy 属性 ~
https://dk521123.hatenablog.com/entry/2021/12/27/211328
CloudFormation ~ 認証情報の扱い ~
https://dk521123.hatenablog.com/entry/2021/12/28/224501
CloudFormation ~ AWS CLI
https://dk521123.hatenablog.com/entry/2024/02/23/003010
CloudFormation ~ VPC
https://dk521123.hatenablog.com/entry/2024/03/03/011149
CloudFormation ~ S3 ~
https://dk521123.hatenablog.com/entry/2022/05/25/220037
CloudFormation ~ EC2 ~
https://dk521123.hatenablog.com/entry/2024/02/11/010935
CloudFormation ~ KMS ~
https://dk521123.hatenablog.com/entry/2022/05/26/112627
CloudFormation ~ IAM ~
https://dk521123.hatenablog.com/entry/2022/05/27/100820
CloudFormation で Github/CodePipeline/CodeBuild を構築する
https://dk521123.hatenablog.com/entry/2021/12/26/155956
CloudFormation でのトラブル
https://dk521123.hatenablog.com/entry/2022/05/30/191507
CloudFormationで変数を参照したら、エラー「Unresolved resource dependencies」が表示
https://dk521123.hatenablog.com/entry/2024/02/27/211050