【AWS】AWS CloudFormation ~ 基本編 ~

■ はじめに

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

の続き。

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

目次

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

【1】開発環境

* テキストエディタ さえ開発できるが、
 サポートしてくれるツールもあるらしいので、メモ。

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

の 17:50 以降で説明されている。

環境サンプル

1)Editor : VS Code
2)Lint tool:CloudFormation Linter (cfn-lint)
3)自動補完機能 : CloudFormation template schema

1)Editor : VS Code

* 以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2019/10/20/230323

2)Lint tool:CloudFormation Linter (cfn-lint)

 VS Code のプラグインにおいて
「cfn」で検索すると出てくるのでインストールする

https://aws.amazon.com/jp/blogs/news/git-pre-commit-validation-of-aws-cloudformation-templates-with-cfn-lint/

3)自動補完機能 : CloudFormation template schema

* 設定の仕方は、以下を参照。

https://github.com/aws-cloudformation/cloudformation-template-schema/blob/master/docs/vscode/instructions.md

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

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

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

【3】CloudFormation テンプレートの各要素

とりあえず、(個人的に)初学者は、
以下の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

04)Parameters - パラメータ

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

* スタック構築時にユーザに指定させる値を指定
 => データ型、デフォルト値、最大値、最小値などを設定可能

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

サンプル:入力させる場合

Parameters:
  GithubRepository:
    Type: String
    Default: https://github.com/dk521123/cicd-demo.git

サンプル:入力させる場合 (正規表現による文字種制限)

Parameters:
  SystemName:
    Type: String
    Default: hello-world-demo
    AllowedPattern: "[-_ a-zA-Z0-9]*"
    ConstraintDescription: "must only contain letters (-_ a-zA-Z0-9)"

# ConstraintDescription: 制約が違反された場合に、制約について説明する文字列

サンプル:選択させる項目

Parameters:
  EnvironmentType:
    Description: Enter environment type
    Type: String
    Default: dev
    AllowedValues:
      - dev
      - stage
      - prod

補足:値を参照するには

# 値をそのまま使いたい場合、Ref 組み込み関数(!Ref)を使用
Repo: !Ref GithubRepository

# 詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2021/12/04/202519

補足:疑似パラメータ (Pseudo parameters)

# CloudFormation には、事前定義されたパラメータがある
Outputs:
  MyStacksRegion:
    Value: !Ref "AWS::Region"

# 詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2021/12/05/134313

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

* キー・バリュー型の定数を定義できる

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

サンプル

  Mappings: 
    MapperForEnv:
      dev: 
        ConfFilePath: "conf/dev.yaml"
      stage: 
        ConfFilePath: "conf/stage.yaml"
      prod: 
        ConfFilePath: "conf/prod.yaml"

補足:値を参照するには

Value: !FindInMap [MapperForEnv, !Ref EnvironmentType, ConfFilePath]

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

# より抜粋

!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]

# MapName : Mappings セクションで宣言された、キーと値を含むマッピングの論理名。
# TopLevelKey : 最上位のキー名。この値は、キーと値のペアのリストです。
# SecondLevelKey : 2 番目のレベルのキー名で、TopLevelKey に割り当てられたリストのキーの 1 つに設定されます。

07)Conditions - 条件

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

* 条件によりリソースを作成する際に利用
 => 可読性が下がりやすいので、多用は厳禁。

https://qiita.com/yasuhiroki/items/8463eed1c78123313a6f

動画解説
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

* サーバーレスアプリケーション (Lambda ベースアプリケーション) の場合は、
 使用する AWS Serverless Application Model (AWS SAM) のバージョンを指定

動画解説
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バケットなどのリソースを宣言

動画解説
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

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

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

関連記事

AWS CloudFormation ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/10/26/224812
AWS CloudFormation ~ 組み込み関数 ~
https://dk521123.hatenablog.com/entry/2021/12/04/202519
AWS CloudFormation ~ 疑似パラメータ ~
https://dk521123.hatenablog.com/entry/2021/12/05/134313
AWS CloudFormation ~ DeletionPolicy 属性 ~
https://dk521123.hatenablog.com/entry/2021/12/27/211328
AWS CloudFormation ~ 認証情報の扱い ~
https://dk521123.hatenablog.com/entry/2021/12/28/224501
CloudFormation で Github/CodePipeline/CodeBuild を構築する
https://dk521123.hatenablog.com/entry/2021/12/26/155956