1. ホーム
  2. 記事一覧
  3. AWS CloudFormationでインフラをコード化する!初心者向けテンプレート作成ガイド

2024.10.28

AWS CloudFormationでインフラをコード化する!初心者向けテンプレート作成ガイド

CloudFormationテンプレートの基本

CloudFormationテンプレートの基本概念について説明します。ここからは、CloudFormationとは何か、どのようなメリットがあるのかを理解することができます。

CloudFormationとは?

CloudFormationは、AWSのインフラリソースをコード化(IaC: Infrastructure as Code)するためのツールです。CloudFormationを使うことで、インフラのプロビジョニングや設定を自動化し、一貫性を持って管理できます。その結果、手動設定によるエラーを減らし、時間を節約しながら、インフラの変更を簡単に追跡することができます。

IaCについてはこちらの記事で解説しています。

IaCとは?IaCのメリットやデメリット、Terraformなどの構成管理ツールの特徴を紹介

CloudFormationを利用するメリットには、インフラのスケーラビリティを向上させること、プロジェクトの展開速度を上げること、そしてリソースの再利用を容易にすることが含まれます。結果として、運用の効率化が図れます。

テンプレートの基本構成

CloudFormationテンプレートは、複数のセクションで構成されており、各セクションが異なるリソースの定義や設定を管理しています。この構成は非常に重要であり、テンプレート全体がわかりやすく構造化されることで、インフラ管理が効率的に行えるようになります。これらのセクションの理解を深めておくことは、AWSの試験対策としても大いに役立ちますので、ぜひ覚えておきましょう。以下は、代表的なセクションの説明です。

Resources

CloudFormationテンプレートの中心であり、AWSリソースを定義します。EC2インスタンス、S3バケット、VPCなど、具体的に作成したいリソースをここに記述します。覚えやすくするためには、よく使うリソースをカテゴリごとに分けて理解することや、簡単なテンプレートを書いて実際に手を動かしてみると良いでしょう。

Parameters

テンプレートを動的にするためのセクションで、ユーザーがテンプレートのデプロイ時に指定する値を定義します。そのおかげで、テンプレートの柔軟性が向上します。

Outputs

作成したリソースの情報を出力するためのセクションです。例えば、EC2インスタンスのパブリックIPアドレスを他のスタックやユーザーに提供することができます。

Mappings

固定の値をテンプレート内で管理するためのセクションです。リージョンごとの設定やAMI IDの管理などに使われます。

Conditions

リソースの作成条件を設定するためのセクションです。特定のパラメーターによって、リソースを作成するかどうかを制御できます。

Metadata

テンプレートに関する追加情報を含めるためのセクションで、説明やドキュメント化に利用します。

YAMLとJSONの違い

CloudFormationテンプレートは、YAMLまたはJSON形式で記述できます。YAMLは可読性が高く、記述が簡潔であることから、多くの開発者に好まれています。例えば、以下のYAML形式とJSON形式の比較を見るとその違いがわかります。

YAML例:

Resources:
  MyEC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: "t2.micro"
      ImageId: "ami-0abcdef1234567890"

JSON例:

{
  "Resources": {
    "MyEC2Instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "InstanceType": "t2.micro",
        "ImageId": "ami-0abcdef1234567890"
      }
    }
  }
}

YAMLはインデントによる階層構造で簡潔に記述できるため、視覚的にも分かりやすいのが特徴です。一方、JSONは構文が厳格であり、マシン読み取りが容易ですが、冗長になりがちです。それぞれの形式には一長一短があるため、プロジェクトの要件に応じて使い分けると良いでしょう。

よく使うリソースの設定方法

このセクションでは、CloudFormationを使ってよく利用するAWSリソースの設定方法について説明します。具体的な例を用いて、各リソースの設定のポイントを詳しく見ていきます。

EC2インスタンスの定義

EC2インスタンスは、クラウド上での仮想サーバーを提供します。例えば、ウェブアプリケーションをホスティングする際に、EC2インスタンスを利用してアプリケーションサーバーを稼働させることができます。CloudFormationテンプレートでEC2インスタンスを定義する際、以下のような設定が必要です。

AMI(Amazon Machine Image)

インスタンスのOSやアプリケーションの設定を含むイメージです。ImageIdパラメーターで指定します。

インスタンスタイプ

CPUやメモリのスペックを選択するための設定です。例えば、t2.microのように定義します。

セキュリティグループ

インスタンスに対するアクセス制御を行うための設定です。SecurityGroupsで必要なルールを指定します。

サンプルテンプレート

type: "AWS::EC2::Instance"
Properties:
  ImageId: "ami-0abcdef1234567890"
  InstanceType: "t2.micro"
  SecurityGroupIds:
    - "sg-0123456789abcdef0"

さらに、パラメーターを使用することで、インスタンスの種類やキー名を動的に設定し、異なる環境に柔軟に対応できます。

S3バケットの設定

S3バケットは、オブジェクトストレージを提供します。CloudFormationでバケットを作成する際のポイントは以下です。

バケットの作成とポリシーの設定

BucketNameを指定してバケットを作成し、アクセス制御のポリシーを設定します。

バージョニングと暗号化の有効化

バケットに対してバージョニングを有効にすることで、変更履歴を保持できます。さらに、暗号化を有効にすることでデータのセキュリティを確保します。

サンプルテンプレート

type: "AWS::S3::Bucket"
Properties:
  BucketName: "example-bucket"
  VersioningConfiguration:
    Status: "Enabled"
  BucketEncryption:
    ServerSideEncryptionConfiguration:
      - ServerSideEncryptionByDefault:
          SSEAlgorithm: "AES256"

RDSデータベースの設定

RDS(リレーショナルデータベースサービス)は、管理が簡単なデータベースを提供します。

インスタンスタイプとストレージオプション

データベースの計算能力やストレージ容量を指定します。DBInstanceClassAllocatedStorageを使って設定します。

自動バックアップの設定

データの保護を強化するために、RDSでは自動バックアップを設定することができます。BackupRetentionPeriodを使って保持期間を指定します。

サンプルテンプレート

type: "AWS::RDS::DBInstance"
Properties:
  DBInstanceClass: "db.t2.micro"
  AllocatedStorage: "20"
  Engine: "mysql"
  MasterUsername: "admin"
  MasterUserPassword: "password"
  BackupRetentionPeriod: 7

VPCとネットワーク関連リソース

ネットワーク環境を管理するためには、VPC(Virtual Private Cloud)やサブネットの設定が必要です。

VPC, サブネット, セキュリティグループの基本設定

VpcIdSubnetIdを指定し、リソースが配置されるネットワークを決定します。

ネットワークACLとルートテーブルの指定

ネットワークのトラフィックを制御するための設定を行います。

サンプルテンプレート

type: "AWS::EC2::VPC"
Properties:
  CidrBlock: "10.0.0.0/16"
  EnableDnsSupport: true
  EnableDnsHostnames: true

パラメーターの設定と使い方のコツ

CloudFormationのテンプレートで使用するパラメーターについて、その定義方法と使い方のコツを解説します。これにより、テンプレートを柔軟に操作できるスキルが身につきます。

パラメーターの定義方法

CloudFormationのパラメーターは、テンプレートに柔軟性を与えます。

String, Number, List などのタイプとその使い方

パラメーターはTypeでデータの種類を指定し、ユーザーに求める入力を制御します。例えば、AllowedValuesを設定すると、ユーザーが指定できる値を限定することができます。

Defaultの設定

パラメーターにデフォルト値を設定することで、ユーザーが値を入力しなかった場合でも適切な設定が適用されるようにします。

サンプルパラメーター定義

Parameters:
  InstanceType:
    Type: String
    Default: "t2.micro"
    AllowedValues:
      - "t2.micro"
      - "t2.small"
      - "t2.medium"

組み込み関数の活用

CloudFormationのテンプレートでは、組み込み関数を活用することで、より柔軟なテンプレートを作成できます。

RefやFn::GetAttの使い方

Ref関数はパラメーターやリソースの参照に使用し、Fn::GetAttはリソースの属性を取得します。

条件付きリソースの定義(Conditions)

条件を用いて、特定の状況下でのみリソースを作成するように制御します。

サンプル条件付きリソース

Conditions:
  CreateProdResources: !Equals [ !Ref "Environment", "prod" ]
Resources:
  ProdInstance:
    Type: "AWS::EC2::Instance"
    Condition: "CreateProdResources"
    Properties:
      InstanceType: "t2.large"
      ImageId: "ami-0abcdef1234567890"

MappingsとConditionsの実例

環境ごとに異なる設定を自動化する

開発環境と本番環境で異なる設定を持たせる場合、Mappingsを使用してリージョンやAMI IDを動的に割り当てます。

テンプレートの柔軟性を高める設定

Conditionsを使用して、特定のパラメーターに応じてリソースを作成するかどうかを決定します。

サンプルMappings

Mappings:
  RegionMap:
    us-east-1:
      HVM64: "ami-0abcdef1234567890"
    us-west-1:
      HVM64: "ami-1abcdef1234567890"

おすすめのテンプレート作成方法とヒント

CloudFormationテンプレートをより効率的に作成するための方法とヒントを紹介します。テンプレートの再利用性を高め、保守性を向上させるためのベストプラクティスについて学びましょう。

DRY原則を意識したテンプレートの書き方

DRY原則とは、"Don't Repeat Yourself" の略で、同じコードを繰り返さないように設計することを意味します。この原則を守ることで、コードの冗長性を減らし、メンテナンス性を向上させることができます。CloudFormationでは、ネストされたスタックや共通リソースの定義を使用して、同様の設定を一箇所にまとめ、他のテンプレートから再利用できるようにすることでDRY原則を実現できます。

リソースの共通化とスタックのネスト

同じリソース定義が複数必要な場合は、スタックのネストを使って再利用可能なテンプレートを作成します。

例えば、アプリケーション環境ごとに共通するネットワークリソースをネストされたスタックとして分け、メインスタックから参照することで、設定の重複を避けることができます。これを使うことで、コードの重複を減らし、メンテナンス性を向上させます。

この手法はAWS DVAやDOPの試験でもよく取り上げられますので、理解しておくことが重要です。

テンプレートのバリデーションとデバッグ

lintツールやCloudFormation Designerの使い方

CloudFormationテンプレートの構文をチェックするために、lintツールを活用します。また、CloudFormation Designerを使用してテンプレートを視覚的に確認できます。

テンプレートの更新とスタックの管理

スタックのアップデート戦略

リソースの変更を効率的に管理するために、変更セット(Change Sets)を利用します。変更セットにより、スタックの変更内容を事前に確認することが可能です。

まとめ

CloudFormationテンプレートの基本構成から、よく使うリソースやパラメーターの設定まで、幅広く紹介しました。これでテンプレートの全体像をしっかりと理解し、実際の利用シーンで活用できるスキルを身につけることが期待できます。AWS試験対策としても重要な内容なので、ぜひ理解を深めておくことをおすすめします。

テンプレートを作成する際には、冗長なコードを避け、パラメーターや条件を活用して柔軟性を持たせることが重要です。

また、組み込み関数やMappingsの活用により、さらに効率的で再利用可能なテンプレートを設計することが可能です。特に、AWS DVAやDOP試験においては、こうしたテクニックの理解が求められます。

関連リンク

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事