はじめに
今回は、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テンプレートは以下にございます。
ダウンロードしてデスクトップなど任意のフォルダに保存します。
※その他のファイルも後述の手順で使用するためダウンロードしておきます
CloudFormation:YAMLテンプレートのポイント
YAMLテンプレートのポイントを記述します。
wp-vpc-sbnt-igw-rttbl.yml
- VPC(MyVPC):これは仮想ネットワーク環境で、AWSリソースを起動するための論理的な分離領域です。このVPCは
10.0.0.0/16
のCIDRブロックを持ち、DNSサポートとDNSホスト名が有効化されています。 - インターネットゲートウェイ(InternetGateway):これはVPCとインターネットとの間のゲートウェイです。
- VPCゲートウェイアタッチメント(AttachGateway):これはインターネットゲートウェイをVPCに関連付けるためのものです。
- パブリックサブネット(PublicSubnet1a, PublicSubnet1c):これらはVPC内のサブネットで、外部との通信が可能です。それぞれ異なるアベイラビリティーゾーン(AZ)に配置されています。
- プライベートサブネット(PrivateSubnet1a, PrivateSubnet1c):これらもVPC内のサブネットですが、外部と直接通信することはできません。それぞれ異なるAZに配置されています。
- ルートテーブル(PublicRouteTable):これはパブリックサブネットに関連付けられ、トラフィックのルーティングを制御します。
- ルート(PublicRoute):これはルートテーブル内のルートで、すべてのトラフィック(0.0.0.0/0)をインターネットゲートウェイに向けます。
- サブネットルートテーブル関連付け(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
- AlbSecurityGroup: Application Load Balancer (ALB)用のEC2セキュリティグループを作成します。このセキュリティグループは、全ての宛先へのhttp,httpsトラフィックを許可します.
- EC2SecurityGroup: EC2インスタンス用のセキュリティグループを作成します。このセキュリティグループは、ALBからのHTTPおよびHTTPSトラフィックと、すべてのIPからのSSHトラフィックを許可します.
- 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を使用してリソースを作成していきます。
手順は、以下の通りで、リンクにも詳細がございます。
- CloudFormation画面を開きスタックの作成>新しいソースを使用(標準)を選択
- テンプレートの準備完了>テンプレートファイルのアップロードを選択して、保存したymlを選択
- スタックに任意の名称を入力して、パラメータは環境に合わせて変更>次へを選択。※後述の手順に従う場合、デフォルト値でOK
- スタックオプションは特に変更せず、次へを選択
- レビュー画面を確認して送信を選択
スタックが以下の通り作成されました。
また、リソースタブから各リソースのコンソールにアクセスでき、実際に作成されていることが確認できました。
まとめ
今回は、基本的なネットワーク環境の構築を進めました。
実際のアプリケーション環境(例えばWordPress)を構築するためには、追加のリソース(例えばEC2インスタンスやRDSデータベースなど)と設定が必要となります。また、セキュリティグループやACLなど、適切なセキュリティ対策も重要です。これらは、次回以降に作成したいと思います!
最後までご覧いただきありがとうございました。
コメント