CloudFormationを使用したWeb3層構成のWordPress環境を作成してみた!【NW編:VPC,Subnet,IntestnetGateway,RouteTable,SecurityGroup】

AWS

はじめに

今回は、CloudFormationを使用してWeb3層構成のWordPress環境を作成していきます。
この記事では、VPC、サブネット、インターネットゲートウェイ、ルートテーブルなどの基本的なネットワークリソースを作成し、それらを組み合わせてWordPress環境を構築します。

まずはじめに、CloudFormationとは何かについて簡単に説明します。CloudFormationは、AWSリソースのプロビジョニングと管理を自動化するためのサービスです。
テキストベースのテンプレートを使用して、ネットワーク、データベース、アプリケーションサービスなどのAWSリソーススタックをモデル化し、それらを一貫した方法でプロビジョニングと管理できます。

構成図

関連記事

CloudFormationで構築

今回作成するWordPress環境は、以下の前提条件に基づいています。
ですが、後述の通り、Parametersで代入されている値は、任意入力可能です。

  • VPCのネットワークに4つのサブネット
  • リージョンは、ap-northeast-1
  • AZは、ap-northeast-1aとap-northeast-1c
  • パブリックサブネットにALB
  • パブリックサブネットにWebAPサーバとしてのEC2
  • EC2には、ワードプレスに必要なものをインストールします
  • igwを作成してvpcに紐付け
  • パブリックサブネット1aは10.0.0.0/24
  • パブリックサブネット1cは10.0.2.0/24
  • プライベートサブネット1aは10.0.1.0/24
  • プライベートサブネット1cは10.0.3.0/24

CloudFormationテンプレートは以下にございます。
ダウンロードしてデスクトップなど任意のフォルダに保存します。
※その他のファイルも後述の手順で使用するためダウンロードしておきます

GitHub - kosments/wp-project
Contribute to kosments/wp-project development by creating an account on GitHub.

CloudFormation:YAMLテンプレートのポイント

YAMLテンプレートのポイントを記述します。

wp-vpc-sbnt-igw-rttbl.yml

  1. VPC(MyVPC):これは仮想ネットワーク環境で、AWSリソースを起動するための論理的な分離領域です。このVPCは10.0.0.0/16のCIDRブロックを持ち、DNSサポートとDNSホスト名が有効化されています。
  2. インターネットゲートウェイ(InternetGateway):これはVPCとインターネットとの間のゲートウェイです。
  3. VPCゲートウェイアタッチメント(AttachGateway):これはインターネットゲートウェイをVPCに関連付けるためのものです。
  4. パブリックサブネット(PublicSubnet1a, PublicSubnet1c):これらはVPC内のサブネットで、外部との通信が可能です。それぞれ異なるアベイラビリティーゾーン(AZ)に配置されています。
  5. プライベートサブネット(PrivateSubnet1a, PrivateSubnet1c):これらもVPC内のサブネットですが、外部と直接通信することはできません。それぞれ異なるAZに配置されています。
  6. ルートテーブル(PublicRouteTable):これはパブリックサブネットに関連付けられ、トラフィックのルーティングを制御します。
  7. ルート(PublicRoute):これはルートテーブル内のルートで、すべてのトラフィック(0.0.0.0/0)をインターネットゲートウェイに向けます。
  8. サブネットルートテーブル関連付け(SubnetRouteTableAssociation1a, SubnetRouteTableAssociation1c):これらはパブリックサブネットをパブリックルートテーブルに関連付けるためのものです。
 Resources:
  MyVPC:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Join ['-', [!Ref Env, !Ref ResourceName, 'vpc']]

  InternetGateway:
    Type: 'AWS::EC2::InternetGateway'
    Properties:
      Tags:
        - Key: Name
          Value: !Join ['-', [!Ref Env, !Ref ResourceName, 'igw']]

  AttachGateway:
    Type: 'AWS::EC2::VPCGatewayAttachment'
    Properties:
      VpcId: !Ref MyVPC
      InternetGatewayId: !Ref InternetGateway

  PublicSubnet1a:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: !Ref PublicSubnet1aCidr
      AvailabilityZone: ap-northeast-1a
      Tags:
        - Key: Name
          Value: !Join ['-', [!Ref Env, !Ref ResourceName, 'pblcsbnt1a']]

  PublicSubnet1c:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: !Ref PublicSubnet1cCidr
      AvailabilityZone: ap-northeast-1c
      Tags:
        - Key: Name
          Value: !Join ['-', [!Ref Env, !Ref ResourceName, 'pblcsbnt1c']]

  PrivateSubnet1a:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: !Ref PrivateSubnet1aCidr
      AvailabilityZone: ap-northeast-1a
      Tags:
        - Key: Name
          Value: !Join ['-', [!Ref Env, !Ref ResourceName, 'prvtsbnt1a']]

  PrivateSubnet1c:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: !Ref PrivateSubnet1cCidr
      AvailabilityZone: ap-northeast-1c
      Tags:
        - Key: Name
          Value: !Join ['-', [!Ref Env, !Ref ResourceName, 'prvtsbnt1c']]

  PublicRouteTable:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Ref MyVPC
      Tags:
        - Key: Name
          Value: !Join ['-', [!Ref Env, !Ref ResourceName, 'pblcrttbl']]

  PublicRoute:
    Type: 'AWS::EC2::Route'
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  SubnetRouteTableAssociation1a:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref PublicSubnet1a
      RouteTableId: !Ref PublicRouteTable

  SubnetRouteTableAssociation1c:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref PublicSubnet1c
      RouteTableId: !Ref PublicRouteTable

wp-sg.yml

  1. AlbSecurityGroup: Application Load Balancer (ALB)用のEC2セキュリティグループを作成します。このセキュリティグループは、全ての宛先へのhttp,httpsトラフィックを許可します.
  2. EC2SecurityGroup: EC2インスタンス用のセキュリティグループを作成します。このセキュリティグループは、ALBからのHTTPおよびHTTPSトラフィックと、すべてのIPからのSSHトラフィックを許可します.
  3. DBSecurityGroup: RDSデータベースインスタンス用のセキュリティグループを作成します。このセキュリティグループは、EC2セキュリティグループからのMySQLトラフィックを許可します.
Resources:
  # ------------------------------ #
  # Alb SecurityGroup
  # ------------------------------ #
  AlbSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupName: !Join ['-', [!Ref Env, !Ref ResourceName, 'sg-for-alb']]
      GroupDescription: Security group for ALB
      VpcId: !ImportValue WpVpc
      SecurityGroupIngress:
        - IpProtocol: '-1'
          CidrIp: 0.0.0.0/0
          Description: Allow all traffic
      Tags:
        - Key: Name
          Value: !Join ['-', [!Ref Env, !Ref ResourceName, 'sg-for-alb']]
  # ------------------------------ #
  # EC2 SecurityGroup
  # ------------------------------ #
  EC2SecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupName: !Join ['-', [!Ref Env, !Ref ResourceName, 'sg-for-ec2']]
      GroupDescription: Security group for WebApServerEC2
      VpcId: !ImportValue WpVpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupId: !Ref AlbSecurityGroup
          Description: Allow all http traffic
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          SourceSecurityGroupId: !Ref AlbSecurityGroup
          Description: Allow all https traffic
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
          Description: Allow all ssh traffic
      Tags:
        - Key: Name
          Value: !Join ['-', [!Ref Env, !Ref ResourceName, 'sg-for-ec2']]
  # ------------------------------ #
  # DBSecurityGroup
  # ------------------------------ #
  DBSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties: 
      GroupName: !Join ['-', [!Ref 'Env', !Ref 'ResourceName', 'sg-for-rds']]
      VpcId: !ImportValue WpVpc
      GroupDescription: Security group for RDSInstance
      SecurityGroupIngress: 
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          SourceSecurityGroupId: !Ref EC2SecurityGroup
          Description: Allow MySQL traffic from WpEC2SecurityGroup
      Tags: 
        - Key: Name
          Value: !Join ['-', [!Ref 'Env', !Ref 'ResourceName', 'sg-for-rds']]

スタックの作成

早速、CloudFormationを使用してリソースを作成していきます。
手順は、以下の通りで、リンクにも詳細がございます。

  1. CloudFormation画面を開きスタックの作成>新しいソースを使用(標準)を選択
  2. テンプレートの準備完了>テンプレートファイルのアップロードを選択して、保存したymlを選択
  3. スタックに任意の名称を入力して、パラメータは環境に合わせて変更>次へを選択。※後述の手順に従う場合、デフォルト値でOK
  4. スタックオプションは特に変更せず、次へを選択
  5. レビュー画面を確認して送信を選択

スタックが以下の通り作成されました。
また、リソースタブから各リソースのコンソールにアクセスでき、実際に作成されていることが確認できました。

まとめ

今回は、基本的なネットワーク環境の構築を進めました。
実際のアプリケーション環境(例えばWordPress)を構築するためには、追加のリソース(例えばEC2インスタンスやRDSデータベースなど)と設定が必要となります。また、セキュリティグループやACLなど、適切なセキュリティ対策も重要です。これらは、次回以降に作成したいと思います!
最後までご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました