aws

【AWS】CloudFormationでVPCを自動作成する方法解説!

こんにちは、フルスタックエンジニアのryuです。

今回の記事は、AWSのCloudFormationでVPCを自動作成する方法を解説します。CloudFormationとは、インフラをコードから作成するサービスです。設定ファイルを作成しておけば、VPCが簡単に自動で構築することができます。

サーバー構築を実践で身につけるInfraAcademy

※本ページには、プロモーション・アフィリエイトリンクが含まれています

【AWS】CloudFormationでVPCを自動作成する方法解説!

CloudFormationの使い方が分からない・・・

今回の記事は、AWSのCloudFormationでVPCを自動作成する方法を解説します。Cloudformationを使ってコードから自動でインフラを作成してみましょう!

作成するVPCはデフォルトで作成されているVPCと同じような構成です。2つのプライベートサブネットとパブリックサブネットを持ちます。もちろんgwやnatの設定も行い、インターネットへ通信できるようにします。

では、早速CloudFormationを使ってみましょう。

CloudFormationの使い方

ここからは、Cloudformationの使い方を説明します。

まず、AWSのコンソール画面から、CloudFormationと検索してクリックします。

Cloudformationと検索

画面左の「スタックの作成」から「新しいリソースを使用(標準)」を選択します。

CloudFormationスタックの作成

CloudFromationでスタックを作成する

ここからは、CloudFromationのスタックを作成します。スタックとは、テンプレートからプロビジョニングされたリソースの集合です。

まず、テンプレートの準備です。テンプレートとは、AWSリソースを作成するための設定ファイルです。後ほど紹介します。

テンプレートの準備では、「テンプレートの準備完了」を選択します。

CloudFormationのテンプレート準備

次にテンプレートの指定です。「テンプレートファイルのアップロード」を選択しましょう。

テンプレートのアップロード

ここまで完了したら、次はテンプレートの作成です。VPCの設定を細かく指定します。

CloudFormation用VPCテンプレートを作成

ここからは、VPCのテンプレートを作成します。VPCを作成するための設定ファイルのことです。

メモ帳やVScodeでも何でもよいのでエディターを開きましょう。

VPCのテンプレートを作成

VPCのテンプレートを作成しましょう。

「vpc.yml」というファイル名で、下記の内容のファイルを作成してください。少し長いですが、コピペでOKです。

AWSTemplateFormatVersion: "2010-09-09"

Mappings:
  SubnetConfig:
    VPC:
      CIDR: "10.0.0.0/16"
    PublicOne:
      CIDR: "10.0.0.0/24"
    PublicTwo:
      CIDR: "10.0.1.0/24"
    PrivateOne:
      CIDR: "10.0.2.0/24"
    PrivateTwo:
      CIDR: "10.0.3.0/24"
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      EnableDnsSupport: true
      EnableDnsHostnames: true
      CidrBlock: !FindInMap ["SubnetConfig", "VPC", "CIDR"]
      Tags:
        - Key: "Project"
          Value: "seikatsu110"
        - Key: "Environment"
          Value: "dev"

  PublicSubnetOne:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone:
        Fn::Select:
          - 0
          - Fn::GetAZs: { Ref: "AWS::Region" }
      VpcId: !Ref "VPC"
      CidrBlock: !FindInMap ["SubnetConfig", "PublicOne", "CIDR"]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: "Project"
          Value: "seikatsu110"
        - Key: "Environment"
          Value: "dev"

  PublicSubnetTwo:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone:
        Fn::Select:
          - 1
          - Fn::GetAZs: { Ref: "AWS::Region" }
      VpcId: !Ref "VPC"
      CidrBlock: !FindInMap ["SubnetConfig", "PublicTwo", "CIDR"]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: "Project"
          Value: "seikatsu110"
        - Key: "Environment"
          Value: "dev"

  PrivateSubnetOne:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone:
        Fn::Select:
          - 0
          - Fn::GetAZs: { Ref: "AWS::Region" }
      VpcId: !Ref "VPC"
      CidrBlock: !FindInMap ["SubnetConfig", "PrivateOne", "CIDR"]
      Tags:
        - Key: "Project"
          Value: "seikatsu110"
        - Key: "Environment"
          Value: "dev"

  PrivateSubnetTwo:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone:
        Fn::Select:
          - 1
          - Fn::GetAZs: { Ref: "AWS::Region" }
      VpcId: !Ref "VPC"
      CidrBlock: !FindInMap ["SubnetConfig", "PrivateTwo", "CIDR"]
      Tags:
        - Key: "Project"
          Value: "seikatsu110"
        - Key: "Environment"
          Value: "dev"

  InternetGateway:
    Type: AWS::EC2::InternetGateway
  GatewayAttachement:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref "VPC"
      InternetGatewayId: !Ref "InternetGateway"
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref "VPC"
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: GatewayAttachement
    Properties:
      RouteTableId: !Ref "PublicRouteTable"
      DestinationCidrBlock: "0.0.0.0/0"
      GatewayId: !Ref "InternetGateway"
  PublicSubnetOneRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnetOne
      RouteTableId: !Ref PublicRouteTable
  PublicSubnetTwoRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnetTwo
      RouteTableId: !Ref PublicRouteTable

  NatGatewayOneAttachment:
    Type: AWS::EC2::EIP
    DependsOn: GatewayAttachement
    Properties:
      Domain: vpc
      Tags:
        - Key: "Project"
          Value: "seikatsu110"
        - Key: "Environment"
          Value: "dev"
  NatGatewayTwoAttachment:
    Type: AWS::EC2::EIP
    DependsOn: GatewayAttachement
    Properties:
      Domain: vpc
      Tags:
        - Key: "Project"
          Value: "seikatsu110"
        - Key: "Environment"
          Value: "dev"

  NatGatewayOne:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt NatGatewayOneAttachment.AllocationId
      SubnetId: !Ref PublicSubnetOne
      Tags:
        - Key: "Project"
          Value: "seikatsu110"
        - Key: "Environment"
          Value: "dev"

  NatGatewayTwo:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt NatGatewayTwoAttachment.AllocationId
      SubnetId: !Ref PublicSubnetTwo
      Tags:
        - Key: "Project"
          Value: "seikatsu110"
        - Key: "Environment"
          Value: "dev"

  PrivateRouteTableOne:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref "VPC"

  PrivateRouteOne:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTableOne
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NatGatewayOne

  PrivateRouteTableOneAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTableOne
      SubnetId: !Ref PrivateSubnetOne

  PrivateRouteTableTwo:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref "VPC"

  PrivateRouteTwo:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTableTwo
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NatGatewayTwo

  PrivateRouteTableTwoAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref PrivateRouteTableTwo
      SubnetId: !Ref PrivateSubnetTwo

CloudFormationにVPCテンプレートをアップロード

ファイルの作成が完了したら、CloudFormationの設定画面に戻り、ファイルをアップロードしましょう。

VPCテンプレートのアップロード

アップロードしたら、スタックの名前を付けましょう。スタックの名前は何でも良いです。

Cloudformationのスタックの名前

残りの設定はデフォルトのままで良いので、最後まで進めます。

ステータスが「CREATE_IN_PROGRESS」から「CREATE_COMPLETE」になれば完了です。

CloudFormationでVPCを自動作成する方法まとめ

今回の記事は、AWSのCloudFormationでVPCを自動作成する方法を解説しました。

Cloudformationを使うことで、リソースが自動で作成されるので楽ですね。また、設定をソース管理することで変更管理も楽になります。このようにコードからインフラを作成するのはIaCと呼ばれています。

インフラエンジニアならば、IaCは知っておきたい技術です。ぜひ覚えておきましょう!

また、AWSについてさらに勉強したい方は、こちらの講座と参考書がオススメです。

AWS認定ソリューションアーキテクト アソシエイト試験突破講座 – 初心者向け20時間完全コース-

ABOUT ME
ryu@InfraAcademyというインフラ学習サービス運営
大手企業→上場ベンチャー→スタートアップでエンジニアをしていました。 インフラエンジニア歴10年以上。 Linuxやネットワークの学習ができるサービスInfraAcademyを運営中。
RELATED POST