はじめに
ITスクールでのハッカソン経験を通じて、限られた時間の中でコストを抑えつつ、迅速にデプロイする必要がありました。
その中で、AWSのCloudFormationを活用し、ALB、ACM、Route53などを駆使して、セキュアな通信環境をコード化する方法を実践しました。
本記事では、CloudFormationを用いて、効率的でセキュアなインフラをどのように構築したかを紹介します。
テンプレート概要
このCloudFormationテンプレートは簡易的な構成ではありますが、以下をコードで構築しています。
-
VPC (Virtual Private Cloud):
ネットワーク基盤 -
サブネット:
2つのパブリックサブネット -
インターネットゲートウェイとルートテーブル:
外部アクセスを可能にする -
EC2インスタンス:
Apacheサーバーをホスト -
ALB:
トラフィックの分散 -
ACM証明書:
HTTPS接続を実現
今回は、事前に取得しておいた独自ドメインでのRoute53登録は手動で実行します。
テンプレートのセクションごとの説明
1. VPCとサブネットの作成
テンプレートでは、1つのVPCと2つのパブリックサブネットを作成します。
HondaVpc:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: "10.0.0.0/16"
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: "Name"
Value: "honda-vpc"
サブネットは、それぞれ異なるアベイラビリティゾーン(ap-northeast-1a、ap-northeast-1c)に配置しています。
2. インターネットゲートウェイとルートテーブル
作成したVPCをインターネットに接続するため、インターネットゲートウェイとデフォルトルートを設定します。
HondaInternetGateway:
Type: "AWS::EC2::InternetGateway"
ここでは割愛しますが、サブネットをルートテーブルに関連付けも必要になります。
3. ApacheサーバーのEC2インスタンス
UserDataスクリプトを使用して、EC2インスタンスにApacheを自動インストールし、デフォルトのウェブページを設定します。
ApacheInstance:
Type: "AWS::EC2::Instance"
Properties:
InstanceType: "t2.micro"
SubnetId: !Ref HondaSubnetPublic1
UserData:
Fn::Base64: !Sub |
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
echo "<html><body><h1>CloudFormation面白い!!</h1></body></html>" > /var/www/html/index.html
4. ALBの構成
ALB(アプリケーションロードバランサ)を作成し、ターゲットグループとリスナーを構成します。
HTTPSリスナーは、ACM証明書を使用して安全な接続を提供します。
HondaALB:
Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
Properties:
Name: "honda-alb"
Subnets:
- Ref: HondaSubnetPublic1
- Ref: HondaSubnetPublic2
SecurityGroups:
- Ref: ALBSecurityGroup
ターゲットグループでは、Apacheサーバーのヘルスチェックも設定されています。
HondaALBTargetGroup:
Type: "AWS::ElasticLoadBalancingV2::TargetGroup"
Properties:
Port: 80
Protocol: "HTTP"
HealthCheckProtocol: "HTTP"
HealthCheckPath: "/"
5. ACM証明書の統合
HTTPSリスナーを作成し、ACM証明書を適用します。
HondaALBListener:
Type: "AWS::ElasticLoadBalancingV2::Listener"
Properties:
Port: 443
Protocol: "HTTPS"
Certificates:
- CertificateArn: !Ref ACMCertificate
完成したコード
ここまでの上記内容を踏まえて、最終的に完成したコードは以下になります。
AWSTemplateFormatVersion: '2010-09-09'
Description: "Honda VPC Setup, Apache Server Deployment, ALB and ACM Certificate Configuration"
Parameters:
ACMCertificate:
Type: String
Default: "arn:aws:acm:ap-northeast-1:340823193247:certificate/4c8e465b-6926-47c7-87e8-06ae27b895bd"
Description: "ARN of the ACM Certificate"
Resources:
# VPCの作成
HondaVpc:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: "10.0.0.0/16"
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: "Name"
Value: "honda-vpc"
# パブリックサブネット1の作成
HondaSubnetPublic1:
Type: "AWS::EC2::Subnet"
Properties:
VpcId: !Ref HondaVpc
CidrBlock: "10.0.0.0/20"
AvailabilityZone: "ap-northeast-1a"
MapPublicIpOnLaunch: true
Tags:
- Key: "Name"
Value: "honda-subnet-public1-ap-northeast-1a"
# パブリックサブネット2の作成
HondaSubnetPublic2:
Type: "AWS::EC2::Subnet"
Properties:
VpcId: !Ref HondaVpc
CidrBlock: "10.0.16.0/20"
AvailabilityZone: "ap-northeast-1c"
MapPublicIpOnLaunch: true
Tags:
- Key: "Name"
Value: "honda-subnet-public2-ap-northeast-1c"
# インターネットゲートウェイの作成
HondaInternetGateway:
Type: "AWS::EC2::InternetGateway"
Properties:
Tags:
- Key: "Name"
Value: "honda-igw"
# インターネットゲートウェイとVPCを接続
AttachInternetGateway:
Type: "AWS::EC2::VPCGatewayAttachment"
Properties:
VpcId: !Ref HondaVpc
InternetGatewayId: !Ref HondaInternetGateway
# パブリックルートテーブルの作成
HondaRouteTablePublic:
Type: "AWS::EC2::RouteTable"
Properties:
VpcId: !Ref HondaVpc
Tags:
- Key: "Name"
Value: "honda-rtb-public"
# デフォルトルートの設定(インターネットへの接続)
HondaRoute:
Type: "AWS::EC2::Route"
Properties:
RouteTableId: !Ref HondaRouteTablePublic
DestinationCidrBlock: "0.0.0.0/0"
GatewayId: !Ref HondaInternetGateway
# パブリックサブネット1にルートテーブルを関連付け
AssociateRouteTable1:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
RouteTableId: !Ref HondaRouteTablePublic
SubnetId: !Ref HondaSubnetPublic1
# パブリックサブネット2にルートテーブルを関連付け
AssociateRouteTable2:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
RouteTableId: !Ref HondaRouteTablePublic
SubnetId: !Ref HondaSubnetPublic2
# ALB用セキュリティグループ
ALBSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "Allow HTTPS traffic"
VpcId: !Ref HondaVpc
SecurityGroupIngress:
- IpProtocol: "tcp"
FromPort: 443
ToPort: 443
CidrIp: "0.0.0.0/0"
# EC2用セキュリティグループ
EC2SecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "Allow HTTP from ALB and SSH"
VpcId: !Ref HondaVpc
SecurityGroupIngress:
- IpProtocol: "tcp"
FromPort: 80
ToPort: 80
SourceSecurityGroupId: !Ref ALBSecurityGroup
- IpProtocol: "tcp"
FromPort: 22
ToPort: 22
CidrIp: "0.0.0.0/0"
# ApacheサーバーをセットアップするEC2インスタンス
ApacheInstance:
Type: "AWS::EC2::Instance"
Properties:
InstanceType: "t2.micro"
SubnetId: !Ref HondaSubnetPublic1
SecurityGroupIds:
- !Ref EC2SecurityGroup
ImageId: "ami-0b6fe957a0eb4c1b9" # Amazon Linux 2 (Tokyo)
KeyName: "honda"
Tags:
- Key: "Name"
Value: "cloudformation-apache-ec2"
UserData:
Fn::Base64: !Sub |
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<html><body><h1>CloudFormation面白い!</h1></body></html>" > /var/www/html/index.html
# ALB (Application Load Balancer)を作成
HondaALB:
Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
Properties:
Name: "honda-alb"
Subnets:
- Ref: HondaSubnetPublic1
- Ref: HondaSubnetPublic2
SecurityGroups:
- Ref: ALBSecurityGroup
LoadBalancerAttributes:
- Key: "idle_timeout.timeout_seconds"
Value: "60"
Scheme: "internet-facing"
Type: "application"
IpAddressType: "ipv4"
# ALBターゲットグループ
HondaALBTargetGroup:
Type: "AWS::ElasticLoadBalancingV2::TargetGroup"
Properties:
Name: "honda-alb-target-group"
Port: 80
Protocol: "HTTP"
VpcId: !Ref HondaVpc
HealthCheckProtocol: "HTTP"
HealthCheckPort: "80"
HealthCheckPath: "/"
Matcher:
HttpCode: "200"
Targets:
- Id: !Ref ApacheInstance
# ALBリスナーを作成(HTTPSを使用)
HondaALBListener:
Type: "AWS::ElasticLoadBalancingV2::Listener"
Properties:
DefaultActions:
- Type: "forward"
TargetGroupArn: !Ref HondaALBTargetGroup
LoadBalancerArn: !Ref HondaALB
Port: 443
Protocol: "HTTPS"
Certificates:
- CertificateArn: !Ref ACMCertificate
実際にやってみた
CloudFormationのサービス画面からスタックの作成に進み、作成したyamlファイル
をアップロードします。
スタック名は任意で設定できます。ここでは私の名前「honda
」としています。
画面遷移後のスタックオプション設定については、個々の設定に依存するため、私は設定せずに進めていきます。
最後に確認を行い、問題がなければ最下部までスクロールし、「送信
」をクリックして完了です。
スタックを実行後、イベントタブで成功したことが確認できました(しばらく時間がかかります)。
Route 53 のホストゾーンに A レコードを追加
ホストゾーンの画面からAレコードを登録します。まず、ホストゾーンを選択し、「レコードを追加」をクリックします。
その後、Aレコードとして作成したALBを登録します。ルーティング設定はシンプルに進めます。
ブラウザからアクセスしてみる
すべての手順が完了したら、ブラウザで取得したドメイン名(例: https://honda333.blog/
)にアクセスします。
また、ALBやACMも問題なくインフラのコード化が成功していることが確認できました。
まとめ
今回ご紹介したCloudFormationテンプレートでは、基本的なネットワーク構成の作成からウェブサーバーのデプロイ、HTTPS対応のALB設定までを一貫してコードで構築するプロセスを解説しました。
このテンプレートを活用すれば、再現性のある効率的なインフラ構築が可能です。
次回は、さらに難易度の高いコード化に挑戦し、スケーラブルで複雑なシステムの構築方法を探っていきたいと思います!
関連記事
CloudFormationによるインフラのコード化についても過去の記事で解説しているため、より深く知りたい方は読んでみてください!