【初心者向け】CloudFormationを使用してVPC内に簡単にEC2構築してみる

May
2024-04-19
2024-04-19

CloudFormationとは

CloudFormationは、AWSのサービスの一つで、インフラストラクチャをコードとして扱うことができるサービスです。

CloudFormationを使用することで、VPCやサブネット、EC2インスタンスなどのAWSリソースを簡単に作成・管理することができます。

また、CloudFormationでは、作成したリソースをテンプレートとして保存し、再利用することも可能です。

CloudFormationのテンプレートの作成方法

テンプレートの作成方法は3つあります。下記の通りです。

その中今回は3番目の作り方(YAML形式)を使用して作成します。

  1. クイックスタート
  2. サンプルテンプレート&テンプレートスニペット
  3. 自らテンプレートを作成 (JSON/YAML形式でテンプレートをゼロから作成)

事前に準備すること

EC2を作成する前に、EC2インスタンスにSSH接続できるようにするためキーペアファイルを下記の手順通り作成して置く必要です。

■簡単なキーペア作成の方法

AWS自アカウントにログインしてください。

Amazon EC2 コンソール行って、ナビゲーションペインの [ネットワークとセキュリティ] で、[キーペア] を選択します。そのあと、[キーペアを作成]ボタンをクリックする。

③以下の図にキーペアの名前を記入後、[キーペアを作成]ボタンをクリックすると作成したキーペアファイルは自動的にダウンロードされます。

※キーペアファイルをローカル環境のSSHディレクトリに保存してください。

VPC内にEC2を作成する時、必要な機能

VPC内にEC2を構築するために、必要な機能は下記となります。

テンプレートの書き方

ファイル名:ec2_template.yaml

AWSTemplateFormatVersion:
  "2010-09-09"
Description: Provision EC2
# ------------------------------------------------------------#
# Input Parameters (Key Pair)
# ------------------------------------------------------------#
Parameters:
  KeyName:
    Type: "AWS::EC2::KeyPair::KeyName"
 
  VPCCIDR:
    Description: Please enter the IP range (CIDR notation) for this VPC
    Type: String
    Default: 172.32.10.0/24 ←CIDR IPは自分の環境と合わせて設定してください。
 
  PublicSubnetCIDR:
    Description: Please enter the IP range (CIDR notation) for the public subnet in the VPC
    Type: String
    Default: 172.32.10.0/24 ←CIDR IPは自分の環境と合わせて設定してください
Resources:
# ------------------------------------------------------------#
#  VPC作成
# ------------------------------------------------------------#
  VPC:
    Type: "AWS::EC2::VPC"
    Properties:
      # VPCのCidrblockはパラメータで指定する
      CidrBlock: !Ref VPCCIDR
      # VPC に対して DNS 解決がサポートされているか
      EnableDnsSupport: "true"
      # VPC 内に起動されるインスタンスが DNS ホスト名を取得するか
      EnableDnsHostnames: "true"
      # VPC 内に起動されるインスタンスの許可されているテナンシー
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: "test-vpc"

# InternetGateway Create
  InternetGateway:
    Type: "AWS::EC2::InternetGateway"
    Properties:
      Tags:
        - Key: Name
          Value: "test-igw"

# IGW Attach
  InternetGatewayAttachment:
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC
# ------------------------------------------------------------#
#  Public Subnet
# ------------------------------------------------------------#          
# Public Subnet Create
  PublicSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      AvailabilityZone: "ap-northeast-1a"
      # VPCのPublic SubnetのCidrblockはパラメータで指定する
      CidrBlock: !Ref PublicSubnetCIDR
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: "test-public-subnet"
# ------------------------------------------------------------#
#  RouteTable 
# ------------------------------------------------------------#          
# Public RouteTable Create
  PublicRouteTable:
    Type: "AWS::EC2::RouteTable"
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: "test-public-route"
# ------------------------------------------------------------#
# Routing (ルーティング)
# ------------------------------------------------------------#
  PublicRoute:
    Type: "AWS::EC2::Route"
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: "0.0.0.0/0"
      GatewayId: !Ref InternetGateway
# ------------------------------------------------------------#
# RouteTable Associate
# ------------------------------------------------------------#
  PublicSubnetRouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable
# ------------------------------------------------------------#
# WebServerセキュリティグループ作成
# ------------------------------------------------------------#
  WebServerSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: test-sg-group
      GroupDescription: web server test
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          #指定のIPから接続できるように設定する
          CidrIp: 0.0.0.0/0  ←CIDR IPは自分の環境と合わせて設定してください
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          #指定のIPから接続できるように設定する
          CidrIp:0.0.0.0/0  ←CIDR IPは自分の環境と合わせて設定してください
      Tags:
        - Key: Name
          Value: "test-sg-group"
# ------------------------------------------------------------#
# EC2インスタンス作成
# ------------------------------------------------------------#
# EC2インスタンス
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: ap-northeast-1a
      ImageId: ami-0329eac6c5240c99d
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      UserData:
          Fn::Base64: |
               #!/bin/bash
               sudo yum -y update
               sudo yum -y install httpd
               sudo systemctl start httpd.service
               sudo systemctl enable httpd.service
      NetworkInterfaces:
        # IPv4 アドレスを割り当てるか
        - AssociatePublicIpAddress: "true"
          # ------------------------------------------------------
          # アタッチの順序におけるネットワークインターフェイスの位置。
          # ネットワークインターフェイスを指定する場合必須
          # ------------------------------------------------------
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnet
          GroupSet:
            - !Ref WebServerSG
      Tags:
        - Key: Name
          Value: "test-server-spd"

※CidrIp:0.0.0.0/0 の場合、EC2にどこからでもアクセスできるようになりますので、セキュリティ的によろしくないです。実際に構築する時、接続したい環境のIPアドレスを指定してください。

テンプレートを使用する手順

1.AWS自アカウントにログインしてください。

2.検索枠に「cloudformation」を記入すると、下記のように表示されます。CloudFormationをクリックすると、CloudFormationパンネルに遷移されます。

  検索

3.スタック作成をクリックする。

4.今回は「テンプレートファイルのアップロード」を選択する。作成したec2_template.yamlをアプロードして、「次へ」をクリックする。

ec2_template設定

5.スタック名記入画面が表示されます。スタック名を記入してください。

※Key Nameのところに、事前に準備したキーペアファイル名を記入してください。後「次へ」       をクリックする。

スタック名記入

6.「次へ」をクリックすると、最後に確認画面が表示されて「送信」ボタンが表示されます。

「送信」をクリックすると下記のスタックを作成している画面が表示されます。ステータスのところに CREATE_IN_PROGRESSと表示されることが確認できます。スタック作成完了したら、CREATE_COMPLETEに変わります。それで完成です。

crate_in_process

EC2にSSHから接続確認

1.スタック作成完了後に、EC2パンネルに移行してインスタンスのところに作成したEC2インスタンスが表示されることが確認できます。

create success

2.EC2を選択し「接続」をクリックすると、インスタンスにSSHから接続する方法を確認できます。

ssh接続方法-2

3.SSH接続するため、ローカル環境のターミナルからsshディレクトリに行って、上記のSSHクライアントの手順通りコメント実行してください。

4.下記ようにターミナルからEC2に接続できることが確認できます。

ssh

これではVPC内に簡単にEC2構築作業が以上となります。

初心者向けなので、簡単に構築できるようになれば嬉しいです。

作成した環境を削除したい場合、「CloudFromation」パンネルに行ってスタックを削除すれば全部削除されます。

テスト実施後、不要な場合は、必ず削除してくださいね。
そのままにしてしまうと、EC2の利用およびそれにアタッチするIPv4アドレスやネットワークの流量が課金対象となりますのでご注意下さい。