AWSのリソースをコードで自動構築する「AWS CloudFormation」とは?実際に使用してみた

AWS CloudFormation(以下CloudFormationとします。)はAWSのリソース構築を自動で行うサービスです。
AWSのシステム構成をコード化されたテキストファイルを読み込み、記述されたリソースと同じ設定に構築できます。テキストファイルの内容変更により、システム構成の管理、修正が容易になります。
当コラムではCloudFormationの簡単な概要説明と、スタックの作成や更新を実践し、紹介します。

こちらのコラム「AWS CloudFormationを活用して効率的にAWSを使おう」では概要やメリット・デメリットなどについて解説しています。是非ご確認ください。

CloudFormationの概要

構築するAWSのリソースをコードとしてJSONまたはYAML形式でテンプレートに記述し、それを元にリソースを自動的に構築するサービスです。コードベースでAWSのリソースを扱うため、Infrastructure as Codeに分類されます。
同じテンプレートを利用することにより、どのアカウントでも同じリソースが構築できるため、設定ミスが減少し、作業時間の短縮が期待できます。
テンプレートに記載されているAWSのリソースが複数ある場合、スタックで管理しているため、一括で構築と削除が行われます。
テンプレートの内容変更でリソースの変更など管理が容易となります。
CloudFormationの詳細は以下を参照してください。

リンク:AWS CloudFormation別ウィンドウで開きます

スタックとは?

テンプレートから構築されるリソースがスタックとなります。
スタック単位でリソースを管理しており、スタックの作成や削除を行うとスタックで構築されたリソースも同時に作成、削除が行われます。

料金

CloudFormationの利用料金は無料です。
※構成するAWSのリソース(EC2、ELB、S3など)の料金は必要となります。

実践例

CloudFormationでスタックの作成、更新を行っていきます。
以下は作業手順です。

---

1. スタックの作成

2. スタックの更新

---

1. スタックの作成

1-1 テンプレートの構成

テンプレートを作成するための基本的な内容を説明します。
テンプレートは以下9つのセクションで構成されています。

  • Format Version (任意)
  • Description (任意)
  • Metadata (任意)
  • Parameters (任意)
  • Mappings (任意)
  • Conditions(任意)
  • Transform (任意)
  • Resources (必須)
  • Outputs (任意)

このうち、今回作成するテンプレートで使用するFormat VersionとResourcesについて解説します。
他セクションの使用方法はAWSドキュメントでご確認ください。

リンク:AWS CloudFormationテンプレートの分析別ウィンドウで開きます

1-2 セクションの解説
Format Version

テンプレートのバージョンを指定します。
2020/1時点では2010-09-09が最新バージョンとなります。
テンプレートのバージョン指定方法は以下の通りです。

"AWSTemplateFormatVersion" : "2010-09-09"
Resources

Resourcesセクションは、唯一の必須セクションです。
スタックに含める AWS リソース (EC2インスタンスやS3バケットなど)を宣言します。

"Resources" : {
    "Logical ID" : {
        "Type" : "Resource type",
        "Properties" : {
            Set of properties
        }
    }
}
「論理 ID」

構文中ではLogical IDに該当します。
論理IDは英数字(A-Z、a-z、0-9)を用い、テンプレート内で重複しない値にする必要があります。
論理IDはテンプレートの他の部分のリソースからの参照に使用されます。

「リソースタイプ」

構文中ではResource typeに該当します。
リソースタイプは作成するリソースのタイプを識別するために宣言します。すべてのリソースタイプの一覧については、「AWS リソースおよびプロパティタイプのリファレンス別ウィンドウで開きます」を参照してください。

「リソースプロパティ」

構文中ではSet of propertiesに該当します。
リソースプロパティは、リソースに対して指定できる追加オプションです。リソースタイプにより指定する追加オプションは異なります。

テンプレートを作成するための基本的な説明は以上です。

1-3 Cloudformationの実践

それでは実際に構築してみます。
VPCのテンプレートを作成します。作成するVPCは以下の図の通りです。

※以下の図はCloudFormationのデザイナーで表示されます。

事前に、CloudFormationのコンソール画面を操作する端末上で、以下のjsonを「vpc.json」として作成します。

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16	

CloudFormationにアクセスし、「スタックの作成」から「新しいリソースを使用(標準)」をクリックします。

ステップ1では「テンプレートソース」に「テンプレートファイルのアップロード」を選択し、「ファイルの選択」から「vpc.json」を選択し、「次へ」をクリックします。

ステップ2では「スタックの名前」に「vpc」を入力し、「次へ」をクリックします。

ステップ3では設定はデフォルトのまま、「次へ」をクリックします。

ステップ4では作成前の設定確認を行います。

「スタックの作成」をクリックします。

画面が自動的に切り替わり、「CREATE_COMPLETE」と表示され、スタックの作成完了です。

作成したリソースの確認方法を説明します。

「CREATE COMPLETE」後に自動で次の画面が表示されるので、「リソース」タブをクリックし、VPCの「物理ID」をクリックします。

VPCコンソールへ遷移され、リソースができていることを確認できました。

2. スタックの更新

作成済のスタックを更新する方法として既存テンプレートを置き換える方法やAWS Cloud Formationデザイナーでテンプレートを編集する方法があります。今回は既存テンプレートを置き換える方法で前項で作成したテンプレートに対してVPC内からインターネットに接続するためのリソースを追加します。
以下のjsonをCloudFormationのコンソール画面を操作する端末上で「vpc2.json」として作成します。

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
      - Key: Name
        Value: VPC
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Name
        Value: InternetGateway
  VPCGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway
  RouteTable:
    Type: AWS::EC2::RouteTable
    DependsOn: VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      Tags:
      - Key: Name
        Value: RouteTable
  Route:
    Type: AWS::EC2::Route
    DependsOn: VPCGatewayAttachment
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  Subnet:
    Type: AWS::EC2::Subnet
    DependsOn: VPCGatewayAttachment
    Properties:
      CidrBlock: 10.0.0.0/24
      MapPublicIpOnLaunch: 'true'
      VpcId: !Ref VPC
      Tags:
      - Key: Name
        Value: Subnet
  SubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref Subnet
      RouteTableId: !Ref RouteTable

リソース追加後のVPCは以下の図のようになります。

※以下の図はCloudFormationのデザイナーで表示されます。

「vpc2.json」のテンプレートでは、「組み込み関数」と「リソース依存関係の定義」を使用していますので、補足説明します。

「組み込み関数」では「!Ref」を使用しています。「!Ref」を使用することで、テンプレート内で指定したリソースの値を参照することができます。

今回のテンプレートの「VPCGatewayAttachment」の「!Ref InternetGateWay」では、アタッチ対象のインターネットゲートウェイのIDを参照しています。
組み込み関数は多数用意されており、詳細は以下を参照してください。

リンク:組み込み関数リファレンス別ウィンドウで開きます

「リソース依存関係の定義」は「DependsOn」を使用し、特定のリソースが他のリソースに続けて作成されるように依存関係を定義することができます。「!Ref」を使用すると、暗黙的な依存関係により、参照先のリソースが事前に作成されますが、「!Ref」での参照がないリソースを先に作成したい場合は「DependsOn」を使用します。

なお、CloudFormationは暗黙的な依存関係に基づき、リソースの構築順を自動的に判断し作成していますが、スタックの作成中で依存関係のエラーにより、失敗する場合があります。このエラーを回避するため、CloudFormationではVPCのあるリソースに対するゲートウェイアタッチメントの依存関係を明示的に宣言する必要があります。今回のテンプレートでは「RouteTable」、「Route」、「Subnet」の箇所で「DependsOn」を使用し、「VPCGatewayAttachment」に対して、依存関係を設定しています。
公式ドキュメントにDependsOn属性が必要となるケースや設定例が掲載されています。
以下を参照してください。

リンク:DependsOn属性別ウィンドウで開きます

補足説明は以上です。実践を引き続き行います。

VPCの構成を変更するため、「更新する」をクリックします。

下図のステップ1において、「テンプレートの準備」の項目では、「既存のテンプレートを置き換える」を選択し、「テンプレートソース」は「テンプレートファイルのアップロード」、「ファイルの選択」は「vpc2.json」を選択し、「次へ」をクリックします。

ステップ2では今回のテンプレートに定義されているパラメータがないため、「次へ」をクリックします。

ステップ3では設定はデフォルトのまま、「次へ」をクリックします。

ステップ4では更新内容を確認し、「スタックの更新」をクリックします。

ボタン押下後、画面が遷移し、「CREATE_COMPLETE」と表示されれば、更新完了です。

「CREATE COMPLETE」後に自動で次の画面が表示されるため、「リソース」タブをクリックします。

追記したリソースが確認でき、スタックの更新に成功しました。

おわりに

CloudFormationはAWSの構成を自動化でき、システム構築の時間短縮に繋がります。
無料で利用できるため、システム構築する際にCloudFormationを利用してみてはいかがでしょうか。

Amazon Web Services(AWS)、Microsoft Azureの
導入支援サービスのご相談、お問い合わせをお待ちしております。

ページ上部へ戻る