LoginSignup
0
0

More than 3 years have passed since last update.

Amazon Web Services 基礎からのネットワーク&サーバー構築をCloudFormationで構築

Last updated at Posted at 2020-12-18

概要

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版で作成するネットワーク&サーバー構成をAWSのCloudFormationを使って、構築するためのテンプレートファイル

対象者

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版を読み、CloudFormationを使い、構築しようと思っている方

構築されるもの

  • VPC
  • InternetGateway
  • Subnet
  • RouteTable
  • NATGateway
  • EC2
  • SecurityGroup

構成図

aws.png

セクション説明

セクション 意味 備考
AWSTemplateFormatVersion テンプレートバージョン 2010-09-09 であり、現時点で唯一の有効な値
Description テンプレートを説明するテキスト ----
Metadata テンプレートバージョン ----
Parameters パラメーターの定義 ----
Resources スタックに含める AWS リソースの宣言 ----
Outputs 出力値を宣言 他のスタックでインポートできる

組み込み関数説明

組み込み関数 意味 備考
Ref 指定したパラメータまたはリソースの値 ---
Sub 特定した値の入力文字列にある変数の代わりになる 文字列内に変数を挿入する
GetAtt テンプレートのリソースから属性の値を返す ---
Base64 入力文字列の Base64 表現を返す 通常、UserData プロパティを介して Amazon EC2 インスタンスにエンコードされたデータを渡すために使用される

テンプレートファイル

下記においてあります。ご自由にお使いください
https://github.com/toyoyuto/cloudformation

テンプレートファイル(解説付き)

vpc.yml
AWSTemplateFormatVersion: 
  "2010-09-09"
Description:
  Amazon Web Services Network & server construction from the basics

Metadata:
  # コンソールでパラメータをグループ化およびソートする方法を定義するメタデータキー
  "AWS::CloudFormation::Interface":
    # パラメーターグループとそのグループに含めるパラメーターの定義
    ParameterGroups: 
      # Project名に関するグループ
      - Label: 
          default: "Project Name Prefix"
        Parameters: 
          - PJPrefix
      # ネットワーク設定に関するグループ
      - Label: 
          default: "Network Configuration"
        # 記述された順番に表示される
        Parameters: 
          - VPCCIDR
          - PublicSubnetCIDR
          - PrivateSubnetCIDR
          - PublicIP
          - PrivateIP
          - KeyName
    # パラメーターのラベル
    ParameterLabels: 
      VPCCIDR: 
        default: "VPC CIDR"
      PublicSubnetCIDR: 
        default: "PublicSubnet CIDR"
      PrivateSubnetCIDR: 
        default: "PrivateSubnet CIDR"
      PublicIP: 
        default: "Public IP"
      PrivateIP: 
        default: "Private IP"


# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------# 
Parameters:
  PJPrefix:
    Type: String

  VPCCIDR:
    Type: String
    Default: "10.0.0.0/16"

  PublicSubnetCIDR:
    Type: String
    Default: "10.0.1.0/24"

  PrivateSubnetCIDR:
    Type: String
    Default: "10.0.2.0/24"

  PublicIP:
    Type: String
    Default: "10.0.1.10"

  PrivateIP:
    Type: String
    Default: "10.0.2.10"

  KeyName:
    Type: "AWS::EC2::KeyPair::KeyName"

Resources: 
# ------------------------------------------------------------#
#  VPC
# ------------------------------------------------------------#
# VPC Create
  VPC: 
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: !Ref VPCCIDR
      # VPC に対して DNS 解決がサポートされているか
      EnableDnsSupport: "true"
      # VPC 内に起動されるインスタンスが DNS ホスト名を取得するか
      EnableDnsHostnames: "true"
      # VPC 内に起動されるインスタンスの許可されているテナンシー
      InstanceTenancy: default
      Tags: 
        - Key: Name
          Value: !Sub "${PJPrefix}-vpc"

# InternetGateway Create
  InternetGateway: 
    Type: "AWS::EC2::InternetGateway"
    Properties: 
      Tags: 
        - Key: Name
          Value: !Sub "${PJPrefix}-igw"

# IGW Attach
  InternetGatewayAttachment: 
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties: 
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC 

# ------------------------------------------------------------#
#  Subnet
# ------------------------------------------------------------#          
# Public Subnet Create
  PublicSubnet: 
    Type: "AWS::EC2::Subnet"
    Properties: 
      AvailabilityZone: "ap-northeast-1a"
      CidrBlock: !Ref PublicSubnetCIDR
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "${PJPrefix}-public-subnet"

# Private Subnet Create
  PrivateSubnet: 
    Type: "AWS::EC2::Subnet"
    Properties: 
      AvailabilityZone: "ap-northeast-1a"
      CidrBlock: !Ref PrivateSubnetCIDR
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "${PJPrefix}-private-subnet"

# ------------------------------------------------------------#
#  RouteTable
# ------------------------------------------------------------#          
# Public RouteTable Create
  PublicRouteTable: 
    Type: "AWS::EC2::RouteTable"
    Properties: 
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "${PJPrefix}-public-route"

# Private RouteTable Create
  PrivateRouteTable: 
    Type: "AWS::EC2::RouteTable"
    Properties: 
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: !Sub "${PJPrefix}-private-route"

# ------------------------------------------------------------#
#  NAT Gateway
# ------------------------------------------------------------#
  NATGateway: 
    Type: "AWS::EC2::NatGateway"
    Properties:
      # NAT ゲートウェイに関連付ける Elastic IPアドレスの割り当て ID
      # 下記で構築する Elastic IPのIDを指定
      AllocationId: !GetAtt NATGatewayAEIP.AllocationId 
      SubnetId: !Ref PublicSubnet
      Tags: 
        - Key: Name
          Value: !Sub "${PJPrefix}-natgw"
  # NATGateway For Elastic IP Create
  NATGatewayAEIP: 
    Type: "AWS::EC2::EIP"
    Properties:
      # ------------------------------------------------------
      # Elastic IP アドレスが VPC のインスタンスで使用するか、
      # EC2-Classic のインスタンスで使用するか
      # ------------------------------------------------------
      Domain: vpc

# ------------------------------------------------------------#
# Routing
# ------------------------------------------------------------# 
# PublicRoute Create
  PublicRoute: 
    Type: "AWS::EC2::Route"
    Properties: 
      RouteTableId: !Ref PublicRouteTable 
      DestinationCidrBlock: "0.0.0.0/0"
      GatewayId: !Ref InternetGateway 
# PrivateRoute Create
  PrivateRoute: 
    Type: "AWS::EC2::Route"
    Properties: 
      RouteTableId: !Ref PrivateRouteTable 
      DestinationCidrBlock: "0.0.0.0/0"
      NatGatewayId: !Ref NATGateway 

# ------------------------------------------------------------#
# RouteTable Associate
# ------------------------------------------------------------# 
# PublicRouteTable Associate PublicSubnet
  PublicSubnetRouteTableAssociation: 
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties: 
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable
# PrivateRouteTable Associate PrivateSubnet
  PrivateSubnetRouteTableAssociation: 
      Type: "AWS::EC2::SubnetRouteTableAssociation"
      Properties: 
        SubnetId: !Ref PrivateSubnet
        RouteTableId: !Ref PrivateRouteTable

# ------------------------------------------------------------#
# EC2
# ------------------------------------------------------------# 
  # WebServerインスタンス
  WebServer: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: ami-00f045aed21a55240
      KeyName: !Ref KeyName
      InstanceType: t2.micro
      NetworkInterfaces: 
        # IPv4 アドレスを割り当てるか
        - AssociatePublicIpAddress: "true"
          # ------------------------------------------------------
          # アタッチの順序におけるネットワークインターフェイスの位置。
          # ネットワークインターフェイスを指定する場合必須
          # ------------------------------------------------------
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnet
          PrivateIpAddress: !Ref PublicIP
          GroupSet:
            - !Ref WebServerSG

      # インスタンスの作成時に実行するコマンドなどを記述
      UserData: !Base64 |
        #!/bin/bash
        sudo yum -y update
        sudo yum -y install httpd
        sudo systemctl start httpd.service
        sudo systemctl enable httpd.service

        sudo amazon-linux-extras install php7.3
        sudo yum -y install php php-mbstring
        sudo yum -y install mariadb-server

        cd ~
        wget https://ja.wordpress.org/latest-ja.tar.gz
        tar xzvf latest-ja.tar.gz 
        cd wordpress
        sudo cp -r * /var/www/html
        sudo chown apache:apache /var/www/html -R

        sudo systemctl restart httpd.service

      Tags:
          - Key: Name
            Value: !Sub "${PJPrefix}-web-server"

  # WebServerセキュリティグループ
  WebServerSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: web-sg-cf
      GroupDescription: web server sg
      VpcId: !Ref VPC
      SecurityGroupIngress:
        # ssh
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        # pingコマンドで疎通確認を行うため
        # IPv4ですべてのプロトコルとすべてのポートを許可
        - IpProtocol: icmp
          FromPort : -1
          ToPort : -1
          CidrIp: 0.0.0.0/0
        # IPv6ですべてのプロトコルとすべてのポートを許可
        - IpProtocol: icmp
          FromPort : -1
          ToPort : -1
          CidrIpv6: ::/0
      Tags:
        - Key: Name
          Value: !Sub "${PJPrefix}-web-server-sg"

  # DBServerインスタンス
  DbServer: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: ami-00f045aed21a55240
      KeyName: !Ref KeyName
      InstanceType: t2.micro
      NetworkInterfaces: 
        - AssociatePublicIpAddress: "false"
          DeviceIndex: "0"
          SubnetId: !Ref PrivateSubnet
          PrivateIpAddress: !Ref PrivateIP
          GroupSet:
            - !Ref DbServerSG

      UserData: !Base64 |
        #!/bin/bash
        sudo yum -y update
        sudo yum -y install mariadb-server
        sudo systemctl start mariadb
        sudo systemctl enable mariadb

      Tags:
          - Key: Name
            Value: !Sub "${PJPrefix}-db-server"

  # DBServerセキュリティグループ
  DbServerSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: db-sg-cf
      GroupDescription: db server sg
      VpcId: !Ref VPC
      SecurityGroupIngress:
        # ssh
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          CidrIpv6: ::/0
        - IpProtocol: icmp
          FromPort : -1
          ToPort : -1
          CidrIp: 0.0.0.0/0
        - IpProtocol: icmp
          FromPort : -1
          ToPort : -1
          CidrIpv6: ::/0
      Tags:
        - Key: Name
          Value: !Sub "${PJPrefix}-db-server-sg"

# ------------------------------------------------------------#
# Output Parameters
# ------------------------------------------------------------#                
Outputs:
# VPC
  VPC:
    Value: !Ref VPC
    Export:
      Name: !Sub "${PJPrefix}-vpc"

  VPCCIDR:
    Value: !Ref VPCCIDR
    Export:
      Name: !Sub "${PJPrefix}-vpc-cidr"

# Subnet
  PublicSubnet:
    Value: !Ref PublicSubnet
    Export:
      Name: !Sub "${PJPrefix}-public-subnet"

  PublicSubnetCIDR:
    Value: !Ref PublicSubnetCIDR
    Export:
      Name: !Sub "${PJPrefix}-public-subnet-cidr"

  PrivateSubnet:
    Value: !Ref PrivateSubnet
    Export:
      Name: !Sub "${PJPrefix}-private-subnet"

  PrivateSubnetCIDR:
    Value: !Ref PrivateSubnetCIDR
    Export:
      Name: !Sub "${PJPrefix}-private-subnet--cidr"

# Route
  PublicRouteTable:
    Value: !Ref PublicRouteTable
    Export:
      Name: !Sub "${PJPrefix}-public-route"

  PrivateRouteTable:
    Value: !Ref PrivateRouteTable
    Export:
      Name: !Sub "${PJPrefix}-private-route"

# EC2
  WebServer:
    Value: !Ref WebServer
    Export:
      Name: !Sub "${PJPrefix}-web-server"
  DbServer:
    Value: !Ref DbServer
    Export:
      Name: !Sub "${PJPrefix}-db-server"

備考

DBとWordPressの設定は各自行う

その他用語説明

テナンシー

インスタンスを立てるサーバを他のユーザと共有するか、自分だけで専有するかの選択。

AllocationId

Amazon VPC で使用するアドレスの割り当てを表すために AWS によって割り当てられた ID。

参考

CloudFormationを使ってVPCを構築する
セキュリティグループのすべてのポートを指定する方法-CloudFormation

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0