1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【入門編】CloudFormationとは?テンプレート構造と基本セクションを理解する

Posted at

AWSを業務で使っていると、「環境構築を自動化したい」「設定をコードで管理したい」
――そんな場面が必ず出てきます。

でもTerraformほどの自由度はいらない。
AWS公式の仕組みで、確実にAWSリソースを管理したい。

そこで登場するのが AWS CloudFormation(CFn) です。

この記事では、CloudFormationの基本的な考え方と、
最小構成のテンプレートを使って「どう動くか」を体感していきます。

1. CloudFormationとは?

CloudFormationは、AWSのリソース構成をYAMLまたはJSONで定義し、AWSに適用できる仕組みです。

手動操作では「誰が・いつ・どんな設定を変えたか」が不明になりがちですが、
CFnを使えば構成がコードとして残り、再現性のある環境構築が可能になります。

特徴をざっくりまとめると👇

特徴 説明
インフラをコード化(IaC) コンソール操作の代わりにYAMLファイルで定義
差分管理 テンプレート変更 → スタック更新で差分デプロイ可能
再現性 同じテンプレートを別環境にそのまま適用できる
一括管理 リソースを「スタック」という単位でまとめて操作

わかりにくいという方は、以下記事でたとえを用いて解説していますので、よろしければ参照してみてください!

2. CloudFormationの構成要素

CloudFormationのテンプレートは、基本的に以下のようなセクションで構成されています。

AWSTemplateFormatVersion: "2010-09-09"
Description: Sample template for understanding structure

Metadata:
  Version: 1.0
  Author: "shimizu"

Mappings:
  RegionMap:
    ap-northeast-1:
      AMI: ami-0123456789abcdef0
    ap-northeast-3:
      AMI: ami-0abcdef0123456789

Parameters:
  Environment:
    Type: String
    AllowedValues: [dev, stg, prod]
    Default: dev

Conditions:
  IsProd: !Equals [!Ref Environment, prod]

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Condition: IsProd
    Properties:
      BucketName: !Sub "${Environment}-app-bucket"

Outputs:
  BucketName:
    Value: !Ref S3Bucket

日本語は文字化けするので、Descriptionなどに説明文を入れる際はご注意ください。

3. 各セクションの役割一覧

セクション名 説明
AWSTemplateFormatVersion テンプレートフォーマットのバージョン(基本 "2010-09-09" 固定)
Description テンプレート全体の説明。コンソールにも表示される
Metadata カスタムメタデータ(テンプレートに関する補足情報)もしくは、入力パラメータの順序を定義可能
Mappings 環境・リージョンごとに定義値をマッピング。FindInMap関数で参照する
Parameters デプロイ時に外部から渡せる変数。環境名やCIDR、ブーリアンなどを指定する際に使用
Conditions 条件式を定義し、リソースを作成するかどうかを動的に制御する
Resources 実際に作成されるAWSリソースを定義するセクション。最重要。
Outputs スタック作成後に出力したい値を定義。別スタックでImportValueとして利用可能。

4. 各セクションの詳細

🧩 Metadata(メタデータ)

テンプレートの補足情報を記載するためのセクションです。
パラメータの順序指定でよく使います。

Metadata: 
  AWS::CloudFormation::Interface: 
    ParameterGroups: 
      - Label: 
          default: "Network Configuration"
        Parameters: 
          - VPCID
          - SubnetId
          - SecurityGroupID
      - Label: 
          default: "Amazon EC2 Configuration"
        Parameters: 
          - InstanceType
          - KeyName
    ParameterLabels: 
      VPCID: 
        default: "Which VPC should this be deployed to?"

🌏 Mappings(マッピング)

環境やリージョンごとに異なる設定値を定義しておくセクションです。
FindInMap 関数を使って参照します。

Mappings:
  RegionMap:
    ap-northeast-1:
      AMI: ami-0123456789abcdef0
    ap-northeast-3:
      AMI: ami-0abcdef0123456789

Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI]

⚙️ Conditions(条件)

テンプレート内でリソースを作成するかどうかを動的に制御できます。
!Equals!And, !Or, !Not などの論理関数を使用。

Parameters:
  Environment:
    Type: String
    AllowedValues: [dev, prod]

Conditions:
  IsProd: !Equals [!Ref Environment, prod]

Resources:
  ProdBucket:
    Type: AWS::S3::Bucket
    Condition: IsProd
    Properties:
      BucketName: prod-app-bucket

5. 実際に試す(S3バケット)

では、最小構成のテンプレートで試してみましょう。
以下をテキストなどで作成して、デスクトップなどわかりやすいところに保存しましょう。

s3-sample.yaml

AWSTemplateFormatVersion: "2010-09-09"
Description: Create a simple S3 bucket

Parameters:
  BucketName:
    Type: String
    Description: "The name of the S3 bucket"

Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName

6. デプロイ手順(手動)

マネジメントコンソールにアクセスし、CloudFormationを選択し「スタックの作成」を押下します。
image.png

「テンプレートファイルのアップロード」を選択し、保存したファイルを選択します。

image.png

スタック名とパラメータ(S3バケット名)を入力して、「次へ」を押下します。

バケット名は全世界で一意である必要があるので、日付などかぶりにくいものを入力しましょう。

image.png

設定はそのままで、「次へ」を押下します。

image.png

設定内容を確認し、「送信」を押下します。
image.png
image.png

スタックの作成が始まりますので、見届けます。
image.png

ステータスが「CREATE_COMPLETE」になり、マネジメントコンソールから、S3に行くと
指定したバケット名でバケットが作成されていました。

image.png

7. スタックの更新・削除

更新(差分適用)/削除

マネジメントコンソールでCloudFormationにもどり、作成したスタックを選択すると以下の画面が表示されます。

「スタックを更新」のプルダウンから、「変更セットを作成」もしくは「直接更新を実行」を選択すると、更新が可能です。
また、削除したい場合は、同画面の「削除」を押下することで削除することが可能です。
※削除することで作成したリソースも削除されます。

image.png


8. まとめ

  • CloudFormationテンプレートは、8つの主要セクションで構成される
  • Resources が中心だが、ParametersMappings を使うと汎用性が上がる
  • Conditions を使えば環境ごとの制御も可能
  • Metadata はチーム開発時のドキュメント化に役立つ

次回予告

次回は、

「ネステッドスタックでテンプレートを分割管理してみよう」

をテーマに、
親スタックと子スタックの関係、Outputs/ImportValueを使ったデータ連携を解説します。

📚参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?