前回のブログでは、AWS Cloudformationやってみた では、EC2に1台Webサーバー構築とS3に静的サイト構築をやりました。
今回のブログでは、VPC.yamlとEC2.yamlを分割して実行してみることにした。
また、円滑に実行できるようにAWS CLIを導入した。
AWS CLIのインストール方法
brewコマンドを使ってAWS CLIをインストールする。
$ brew install awscli
AWS CLIのバージョンが確認できれば、インストール完了です。
$ aws --version
aws-cli/2.1.30 Python/3.9.2 Darwin/20.3.0 source/x86_64 prompt/off
AWS CLIの初期設定
続いて初期設定を行います。
AWSのセキュリティ認証情報ページにアクセスし、アクセスキーを作成しておきます。
以下コマンドでAWS CLIの初期設定を行います。
$ aws configure
AWS Access Key ID [None]: アクセスキー ID
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]:
※ 補足
・ Default region name
国内で使用するのであればap-northeast-1(アジアパシフィック (東京))で問題ありませんが、他のリージョンを指定可能です。
リージョン一覧
・ Default output format
指定しない場合デフォルトでjson形式となりますが、その他にもtextやtableが指定できます。
出力形式一覧
ここでは、AWS CLIの導入内容について省略する。
VPC.yamlについて
AWSTemplateFormatVersion: 2010-09-09
Description: Hands-on template for VPC
Resources:
#------------------------------------------------------
# VPC
#------------------------------------------------------
CFnVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
InstanceTenancy: default
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: handson-cfn
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.0.0/24
VpcId: !Ref CFnVPC
AvailabilityZone: !Select [ 0, !GetAZs ]
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: PublicSubnet1
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.1.0/24
VpcId: !Ref CFnVPC
AvailabilityZone: !Select [ 1, !GetAZs ]
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: PublicSubnet2
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.2.0/24
VpcId: !Ref CFnVPC
AvailabilityZone: !Select [ 0, !GetAZs ]
Tags:
- Key: Name
Value: PrivateSubnet1
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.3.0/24
VpcId: !Ref CFnVPC
AvailabilityZone: !Select [ 1, !GetAZs ]
Tags:
- Key: Name
Value: PrivateSubnet2
#------------------------------------------------------
# インターネットゲートウェイ
#------------------------------------------------------
CFnVPCIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: handson-cfn
CFnVPCIGWAttach:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref CFnVPCIGW
VpcId: !Ref CFnVPC
#------------------------------------------------------
# ルートテーブルをパブリックサブネットにアタッチ
#------------------------------------------------------
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref CFnVPC
Tags:
- Key: Name
Value: Public Route
PublicRoute:
Type: AWS::EC2::Route
DependsOn: CFnVPCIGW
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref CFnVPCIGW
PublicSubnet1Association:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1
RouteTableId: !Ref PublicRouteTable
PublicSubnet2Association:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet2
RouteTableId: !Ref PublicRouteTable
#------------------------------------------------------
# Outputsセクション
#------------------------------------------------------
Outputs:
VPCID:
Description: VPC ID
Value: !Ref CFnVPC
Export:
Name: !Sub ${AWS::StackName}-VPCID
PublicSubnet1:
Description: PublicSubnet1
Value: !Ref PublicSubnet1
Export:
Name: !Sub ${AWS::StackName}-PublicSubnet1
PublicSubnet2:
Description: PublicSubnet2
Value: !Ref PublicSubnet2
Export:
Name: !Sub ${AWS::StackName}-PublicSubnet2
PrivateSubnet1:
Description: PrivateSubnet1
Value: !Ref PrivateSubnet1
Export:
Name: !Sub ${AWS::StackName}-PrivateSubnet1
PrivateSubnet2:
Description: PrivateSubnet2
Value: !Ref PrivateSubnet2
Export:
Name: !Sub ${AWS::StackName}-PrivateSubnet2
つぎに、AWS CLIで以下のコマンドを叩く。
aws cloudformation create-stack --stack-name handson-cfn --template-body file://vpc.yaml
EC2.yamlについて
AWSTemplateFormatVersion: 2010-09-09
Description: Hands-on template for EC2
#------------------------------------------------------
# パラメーター(VPC)
#------------------------------------------------------
Parameters:
VPCStack:
Type: String
Default: handson-cfn
Resources:
#------------------------------------------------------
# EC2Instance
#------------------------------------------------------
EC2WebServer01:
Type: AWS::EC2::Instance
Properties:
# 利用したいAMIによって変更する
ImageId: ami-088da9557aae42f39
# インスタンスタイプ
InstanceType: t3.micro
# セキュリティインポート
SubnetId:
Fn::ImportValue: !Sub ${VPCStack}-PublicSubnet1
# EBS設定
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
VolumeType: gp3
DeleteOnTermination: true
VolumeSize: 10
# EC2の名前
Tags:
- Key: Name
Value: EC2WebServer01
# インストールコマンド
UserData: !Base64 |
#! /bin/bash
# セキュリティーグループ使用
SecurityGroupIds:
- !Ref EC2SG
#------------------------------------------------------
# セキュリティーグループ(EC2Instance)
#------------------------------------------------------
EC2SG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: sg for web server
VpcId:
Fn::ImportValue: !Sub ${VPCStack}-VPCID
SecurityGroupIngress:
# HTTP接続
- IpProtocol: tcp
CidrIp: 0.0.0.0/0
FromPort: 80
ToPort: 80
# SSH接続
- IpProtocol: tcp
CidrIp: 0.0.0.0/0
FromPort: 22
ToPort: 22
# HTTPS接続
- IpProtocol: tcp
CidrIp: 0.0.0.0/0
FromPort: 443
ToPort: 443
#------------------------------------------------------
# Outputsセクション
#------------------------------------------------------
Outputs:
EC2WebServer01:
Value: !Ref EC2WebServer01
Export:
Name: !Sub ${AWS::StackName}-EC2WebServer01
次にAWS CLIでEC2を構築する
aws cloudformation create-stack --stack-name handson-cfn-ec2 --template-body file://ec2.yaml
これで、VPC-EC2の基本構成は自動構築できる。
AWS VPC EC2を構築自動化する理由
AWS VPCを構築自動化しようと思ったきっかけは、EC2で検証環境が欲しいと思った時に円滑に準備がしたいと思ったからだ。
サーバーの検証環境を安くできるのがAWSの良いところだと言える。
最後に、AWS Hands-on for Beginners AWS 環境のコード管理 AWS CloudFormationで Web システムを構築する でCloudfomationの勉強すると良いだろう。