■ はじめに
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 - テンプレートの説明
* このテンプレートの説明書き => オプションだけど、目的くらい書いといた方が親切かなっと
サンプル
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 コンソールで パラメータをグループ化およびソートする方法を定義
サンプル
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 - パラメータ
* 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 - 条件
* 条件によりリソースを作成する際に利用 => ただし、可読性が下がりやすいので、多用は厳禁。 * 指定した値は、「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 - 変換
* CloudFormationからLambda関数を呼び出す場合や、 他のテンプレートをインクルードする場合に使用
動画解説
https://youtu.be/HU47ZAM3mtw?t=1175
09)Resources - リソース宣言
* 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}
【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