North Detail / ノースディテール

BLOG ブログ

ブログ
CATEGORY
TECH

AWS CloudFormationでインフラを構築してみた

※本記事は、NorthDetail Advent Calendar 2019の一環として投稿しています

最近AWSに触ることが増えていろいろと学ぶことがありました。
学んだことの中でもAWS CloudFormationが今後色々役に立ちそうなので、
備忘録的な感じで残したいと思います。

AWS CloudFormationとは

AWSのリソースをモデル化およびセットアップするのに役立つサービスです。
詳しくは公式を参照ください。

AWS公式:CloudFormation

AWS上で構築したインフラストラクチャをコードとして残して置くことができるだけでなく、そのコードを元に再度環境を構築することができるため複製することや管理することが簡単になります。

AWS CloudFormationを使用してインフラを構築する

インフラの環境をコードとして落とし込むにはJSONもしくはYAML形式のファイルを用意します。
今回はインターネットに接続することを想定した仮想サーバーの環境をYAML形式で構築してみたいと思います。 ※今回は設定を複数に分けることはせずに1つのファイルに全て記載します。

使用するリソースはEC2インスタンスになります。
はじめにVPC周りの設定を行い、最後にEC2の設定を行います。
VPC等の用語についての説明は公式を参照してください。

AWS公式:VPCとは

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  EC2KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Description: SSH public key
    Default: MyKey

Resources:
  # -------------------------
  # VPC
  # -------------------------
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.100.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: VPC

  GatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
        InternetGatewayId: !Ref InternetGW
        VpcId: !Ref VPC

  # -------------------------
  # Route
  # -------------------------
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: RouteTable

  Route: 
    Type: AWS::EC2::Route
    Properties: 
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGW

  # ---------------------------
  # RouteTable Associate
  # ---------------------------
  PubSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PubSubnet
      RouteTableId: !Ref RouteTable

  # ---------------------------
  # Security Group
  # ---------------------------
  SecGrpEC2:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Web Server Rule
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: EC2-Sec
      SecurityGroupIngress:
        - { IpProtocol: tcp, FromPort: 80, ToPort: 80, CidrIp: 0.0.0.0/0 }
        - { IpProtocol: tcp, FromPort: 22, ToPort: 22, CidrIp: 255.255.255.254/32, Description: MyIP}

  # ---------------------------
  # Subnet
  # ---------------------------
  PubSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.100.1.0/24
      VpcId: !Ref VPC
      MapPublicIpOnLaunch: True
      AvailabilityZone: ap-northeast-1a
      Tags:
        - Key: Name
          Value: PubSubnet

  # ---------------------------
  # InternetGW
  # ---------------------------
  InternetGW:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: InternetGW

  # ---------------------------
  # EC2 instance
  # ---------------------------
  EC2Instance:
    Type: AWS::EC2::Instance
    DeletionPolicy: Delete
    Properties:
      AvailabilityZone: ap-northeast-1a
      ImageId: ami-068a6cefc24c301d2
      InstanceType: t2.micro
      KeyName: !Ref EC2KeyName
      SubnetId: !Ref PubSubnet
      BlockDeviceMappings:
        - DeviceName: /dev/sdb
          Ebs:
            VolumeSize: 20
            VolumeType: gp2
      SecurityGroupIds: 
        - !Ref SecGrpEC2
      UserData:
        Fn::Base64: |-
          #!/bin/bash
          yum -y update
          yum install -y httpd
          systemctl start httpd.service
          yum install -y docker
          service docker start
          usermod -a -G docker ec2-user
          curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
          chmod +x /usr/local/bin/docker-compose
      Tags:
        - Key: Name
          Value: EC2Instance

※AMIについてはAWS側で用意されているものになります。
以上の設定でインターネットに接続可能なEC2インスタンスを構築することができました。
実際にURLから遷移するとApacheの画面が表示されています。
またCloudFormationのデザイナー機能で今回構築した環境を確認することもできます。

EC2.png
aws_qiita.png

CloudFormationではEC2インスタンスを立てたときに実行させたいコマンドを
ユーザーデータとして設定することできます。
今回はEC2インスタンスを立てた時にDockerを入れるように設定しています。
また、``````DeletionPolicy: Deleteをつけることによって
構築したファイルを削除した時に使用したリソース全てを削除することができるためリソースの消し忘れによる無駄な支出を防ぐことができるという点でも便利だと感じています。

Hassy
WRITER:Hassy
日々勉強中のエンジニア。
カレー粉からカレーを作るのにハマってます
主な記事 一覧へ

一覧へ

IS 501383 / ISO 27001