はじめに
この記事では、AWSのCloudFormationテンプレートを使用して、80番ポートで通信するアプリケーションロードバランサー (ALB) の構成を作成します。
また、本番サーバー (ProductionInstance) の起動時に、httpd パッケージのインストールと httpd サービスの起動を自動化するためのコマンドも設定していきます。
インフラのコード化に興味のある方や、CloudFormationの活用を検討している方は、ぜひお読みください!
前回の記事の続きになります。
この記事は過去の記事の続きです。詳しく知りたい方は以下の記事も参考にしてください。
今回は、CloudFormationでの ALB 設定などを追加で行います。
具体的には、以下のリソースを定義し、各構成要素について詳しく解説します。
- ALBとターゲットグループの設定
- サブネットの関連付け
- 本番サーバー (ProductionInstance) のセキュリティグループ設定
ALB周りの追加設定&Apacheの自動インストール
ここでは、AWSのCloudFormationテンプレートを使用して、80番ポートで通信するアプリケーションロードバランサー (ALB) 構成を作成し、本番サーバー (ProductionInstance) にHTTPリクエストを転送する設定を追加しています。
# ALBのセキュリティグループの作成
ALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: "Allow HTTP access to ALB"
VpcId: !Ref HondaVpc
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: ホンダ-sg-alb
# 本番サーバー用セキュリティグループの作成
ProductionSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: "Allow HTTP access from ALB and SSH access from anywhere"
VpcId: !Ref HondaVpc
SecurityGroupIngress:
# ALBからのHTTPアクセスを許可
- IpProtocol: tcp
FromPort: 80
ToPort: 80
SourceSecurityGroupId: !Ref ALBSecurityGroup
# SSHアクセスを任意の場所から許可
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: ホンダ-sg-production
# 本番サーバー用のEC2インスタンスの作成(PrivateSubnet1に配置)
ProductionInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
SubnetId: !Ref PrivateSubnet1
ImageId: ami-0b6fe957a0eb4c1b9
KeyName: "honda"
SecurityGroupIds:
- !Ref ProductionSecurityGroup
Tags:
- Key: Name
Value: "本番サーバー"
UserData:
Fn::Base64: !Sub |
#!/bin/bash
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
# ALBの作成
ApplicationLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: Honda-ALB
Scheme: internet-facing
Subnets:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
SecurityGroups:
- !Ref ALBSecurityGroup
Type: application
Tags:
- Key: Name
Value: ホンダ-alb
# ALBのリスナーの作成
ALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: forward
TargetGroupArn: !Ref ALBTargetGroup
LoadBalancerArn: !Ref ApplicationLoadBalancer
Port: 80
Protocol: HTTP
# ターゲットグループの作成(80番ポート用)
ALBTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: Honda-TargetGroup
Port: 80
Protocol: HTTP
VpcId: !Ref HondaVpc
TargetType: instance
HealthCheckProtocol: HTTP
HealthCheckPort: "80"
HealthCheckPath: /
HealthCheckIntervalSeconds: 30
HealthCheckTimeoutSeconds: 5
HealthyThresholdCount: 5
UnhealthyThresholdCount: 2
Tags:
- Key: Name
Value: ホンダ-target-group
Targets:
- Id: !Ref ProductionInstance
また、インスタンス起動時に httpd パッケージのインストールと httpd サービスの起動を自動化する設定も追加しています。
完成したコード
前回のコードと新たに追加した部分を組み合わせた最終的なコードは、以下の通りです。
複雑なアーキテクチャとなっているため、コードが長くなっていますが、流れをつかむ感じで見ていただければと思います(笑)。
Resources:
# VPCの作成
HondaVpc:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
InstanceTenancy: default
Tags:
- Key: Name
Value: ホンダ-vpc
# パブリックサブネットの作成
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref HondaVpc
CidrBlock: 10.0.0.0/20
AvailabilityZone: ap-northeast-1a
Tags:
- Key: Name
Value: ホンダ-subnet-public1-ap-northeast-1a
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref HondaVpc
CidrBlock: 10.0.16.0/20
AvailabilityZone: ap-northeast-1c
Tags:
- Key: Name
Value: ホンダ-subnet-public2-ap-northeast-1c
# プライベートサブネットの作成
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref HondaVpc
CidrBlock: 10.0.128.0/20
AvailabilityZone: ap-northeast-1a
Tags:
- Key: Name
Value: ホンダ-subnet-private1-ap-northeast-1a
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref HondaVpc
CidrBlock: 10.0.144.0/20
AvailabilityZone: ap-northeast-1c
Tags:
- Key: Name
Value: ホンダ-subnet-private2-ap-northeast-1c
PrivateSubnet3:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref HondaVpc
CidrBlock: 10.0.160.0/20
AvailabilityZone: ap-northeast-1a
Tags:
- Key: Name
Value: ホンダ-subnet-private3-ap-northeast-1a
PrivateSubnet4:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref HondaVpc
CidrBlock: 10.0.176.0/20
AvailabilityZone: ap-northeast-1c
Tags:
- Key: Name
Value: ホンダ-subnet-private4-ap-northeast-1c
# インターネットゲートウェイの作成
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: ホンダ-igw
# インターネットゲートウェイをVPCにアタッチ
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref HondaVpc
InternetGatewayId: !Ref InternetGateway
# パブリックルートテーブルの作成とパブリックサブネットとの関連付け
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref HondaVpc
Tags:
- Key: Name
Value: ホンダ-rtb-public
PublicRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1
RouteTableId: !Ref PublicRouteTable
PublicSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet2
RouteTableId: !Ref PublicRouteTable
# Elastic IP の作成
ElasticIP1:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
Tags:
- Key: Name
Value: ホンダ-eip-ap-northeast-1a
# NATゲートウェイの作成
NatGateway:
Type: AWS::EC2::NatGateway
Properties:
SubnetId: !Ref PublicSubnet1
AllocationId: !GetAtt ElasticIP1.AllocationId
Tags:
- Key: Name
Value: ホンダ-nat-public1-ap-northeast-1a
# プライベートルートテーブルの作成と各サブネットとの関連付け
PrivateRouteTable1:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref HondaVpc
Tags:
- Key: Name
Value: ホンダ-rtb-private1-ap-northeast-1a
PrivateRoute1:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PrivateRouteTable1
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref NatGateway
PrivateSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnet1
RouteTableId: !Ref PrivateRouteTable1
# 踏み台サーバー(Bastion)用のセキュリティグループの作成
BastionSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: "Allow SSH access"
VpcId: !Ref HondaVpc
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: ホンダ-sg-bastion
# Elastic IP の作成(別のElastic IP)
ElasticIP2:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
Tags:
- Key: Name
Value: ホンダ-eip-ap-northeast-1c
# 踏み台サーバーのEC2インスタンスの作成
BastionInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
SubnetId: !Ref PublicSubnet1
ImageId: ami-0b6fe957a0eb4c1b9
KeyName: "honda"
SecurityGroupIds:
- !Ref BastionSecurityGroup
Tags:
- Key: Name
Value: "踏み台サーバー"
# ALBのセキュリティグループの作成
ALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: "Allow HTTP access to ALB"
VpcId: !Ref HondaVpc
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: ホンダ-sg-alb
# 本番サーバー用セキュリティグループの作成
ProductionSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: "Allow HTTP access from ALB and SSH access from anywhere"
VpcId: !Ref HondaVpc
SecurityGroupIngress:
# ALBからのHTTPアクセスを許可
- IpProtocol: tcp
FromPort: 80
ToPort: 80
SourceSecurityGroupId: !Ref ALBSecurityGroup
# SSHアクセスを任意の場所から許可
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: ホンダ-sg-production
# 本番サーバー用のEC2インスタンスの作成(PrivateSubnet1に配置)
ProductionInstance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
SubnetId: !Ref PrivateSubnet1
ImageId: ami-0b6fe957a0eb4c1b9
KeyName: "honda"
SecurityGroupIds:
- !Ref ProductionSecurityGroup
Tags:
- Key: Name
Value: "本番サーバー"
UserData:
Fn::Base64: !Sub |
#!/bin/bash
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
# ALBの作成
ApplicationLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: Honda-ALB
Scheme: internet-facing
Subnets:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
SecurityGroups:
- !Ref ALBSecurityGroup
Type: application
Tags:
- Key: Name
Value: ホンダ-alb
# ALBのリスナーの作成
ALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: forward
TargetGroupArn: !Ref ALBTargetGroup
LoadBalancerArn: !Ref ApplicationLoadBalancer
Port: 80
Protocol: HTTP
# ターゲットグループの作成(80番ポート用)
ALBTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: Honda-TargetGroup
Port: 80
Protocol: HTTP
VpcId: !Ref HondaVpc
TargetType: instance
HealthCheckProtocol: HTTP
HealthCheckPort: "80"
HealthCheckPath: /
HealthCheckIntervalSeconds: 30
HealthCheckTimeoutSeconds: 5
HealthyThresholdCount: 5
UnhealthyThresholdCount: 2
Tags:
- Key: Name
Value: ホンダ-target-group
Targets:
- Id: !Ref ProductionInstance
非常に長くなっていますが、基本的にはシンプルで簡単なコードで書いています(そこまで、難しくありません!)。
実際にスタックを実行してみた
CloudFormationのサービス画面からスタックの作成に進み、作成したyamlファイル
をアップロードします。
スタック名は任意で設定できます。ここでは私の名前「honda
」としています。
画面遷移後のスタックオプション設定については、個々の設定に依存するため、私は設定せずに進めていきます。
最後に確認を行い、問題がなければ最下部までスクロールし、「送信
」をクリックして完了です。
スタックを実行後、イベントタブで成功したことが確認できました(しばらく時間がかかります)。
ブラウザからALBのDNS名にアクセスしてみた
CloudFormationでスタックを実行した後、EC2サービス画面で踏み台サーバーと本番サーバーが作成されたことを確認しました。
踏み台サーバーへのアクセス方法については、前回の記事で詳細に紹介しているので、参考にしてください。
次に、ALBのDNS名からブラウザにアクセスしてみます。
私の場合、Chromeブラウザで通常アクセスした際にはhttpsで接続されましたので、不要な「s」を削除してアクセスしてみてください。
http://honda-alb-1423201187.ap-northeast-1.elb.amazonaws.com/
これにより、設定したALBが正しく機能し、Apacheが動作していることを確認できたため、検証は大成功です!
まとめ
本記事では、CloudFormationを使ってALBの構成と本番サーバーのセットアップを行い、ブラウザからALBを経由してApacheのデフォルトテストサイトにアクセスできることを確認しました。
これにより、インフラのコード化の一環としてALBとEC2インスタンスの設定が自動化され、簡単に確認できる環境が整いました。
次回は、さらなるカスタマイズや、実際のアプリケーションをALBに接続する方法について触れていきます。
関連記事
今回と似た記事として、インフラのコード化に関する記事も参考にしてみてください。