こんにちは、フルスタックエンジニアのryuです。
今回の記事は、AWSのCloudFormationでVPCを自動作成する方法を解説します。CloudFormationとは、インフラをコードから作成するサービスです。設定ファイルを作成しておけば、VPCが簡単に自動で構築することができます。
目次
【AWS】CloudFormationでVPCを自動作成する方法解説!
CloudFormationの使い方が分からない・・・
今回の記事は、AWSのCloudFormationでVPCを自動作成する方法を解説します。Cloudformationを使ってコードから自動でインフラを作成してみましょう!
作成するVPCはデフォルトで作成されているVPCと同じような構成です。2つのプライベートサブネットとパブリックサブネットを持ちます。もちろんgwやnatの設定も行い、インターネットへ通信できるようにします。
では、早速CloudFormationを使ってみましょう。
CloudFormationの使い方
ここからは、Cloudformationの使い方を説明します。
まず、AWSのコンソール画面から、CloudFormationと検索してクリックします。
画面左の「スタックの作成」から「新しいリソースを使用(標準)」を選択します。
CloudFromationでスタックを作成する
ここからは、CloudFromationのスタックを作成します。スタックとは、テンプレートからプロビジョニングされたリソースの集合です。
まず、テンプレートの準備です。テンプレートとは、AWSリソースを作成するための設定ファイルです。後ほど紹介します。
テンプレートの準備では、「テンプレートの準備完了」を選択します。
次にテンプレートの指定です。「テンプレートファイルのアップロード」を選択しましょう。
ここまで完了したら、次はテンプレートの作成です。VPCの設定を細かく指定します。
CloudFormation用VPCテンプレートを作成
ここからは、VPCのテンプレートを作成します。VPCを作成するための設定ファイルのことです。
メモ帳やVScodeでも何でもよいのでエディターを開きましょう。
VPCのテンプレートを作成
VPCのテンプレートを作成しましょう。
「vpc.yml」というファイル名で、下記の内容のファイルを作成してください。少し長いですが、コピペでOKです。
AWSTemplateFormatVersion: "2010-09-09"
Mappings:
SubnetConfig:
VPC:
CIDR: "10.0.0.0/16"
PublicOne:
CIDR: "10.0.0.0/24"
PublicTwo:
CIDR: "10.0.1.0/24"
PrivateOne:
CIDR: "10.0.2.0/24"
PrivateTwo:
CIDR: "10.0.3.0/24"
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
EnableDnsSupport: true
EnableDnsHostnames: true
CidrBlock: !FindInMap ["SubnetConfig", "VPC", "CIDR"]
Tags:
- Key: "Project"
Value: "seikatsu110"
- Key: "Environment"
Value: "dev"
PublicSubnetOne:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone:
Fn::Select:
- 0
- Fn::GetAZs: { Ref: "AWS::Region" }
VpcId: !Ref "VPC"
CidrBlock: !FindInMap ["SubnetConfig", "PublicOne", "CIDR"]
MapPublicIpOnLaunch: true
Tags:
- Key: "Project"
Value: "seikatsu110"
- Key: "Environment"
Value: "dev"
PublicSubnetTwo:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone:
Fn::Select:
- 1
- Fn::GetAZs: { Ref: "AWS::Region" }
VpcId: !Ref "VPC"
CidrBlock: !FindInMap ["SubnetConfig", "PublicTwo", "CIDR"]
MapPublicIpOnLaunch: true
Tags:
- Key: "Project"
Value: "seikatsu110"
- Key: "Environment"
Value: "dev"
PrivateSubnetOne:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone:
Fn::Select:
- 0
- Fn::GetAZs: { Ref: "AWS::Region" }
VpcId: !Ref "VPC"
CidrBlock: !FindInMap ["SubnetConfig", "PrivateOne", "CIDR"]
Tags:
- Key: "Project"
Value: "seikatsu110"
- Key: "Environment"
Value: "dev"
PrivateSubnetTwo:
Type: AWS::EC2::Subnet
Properties:
AvailabilityZone:
Fn::Select:
- 1
- Fn::GetAZs: { Ref: "AWS::Region" }
VpcId: !Ref "VPC"
CidrBlock: !FindInMap ["SubnetConfig", "PrivateTwo", "CIDR"]
Tags:
- Key: "Project"
Value: "seikatsu110"
- Key: "Environment"
Value: "dev"
InternetGateway:
Type: AWS::EC2::InternetGateway
GatewayAttachement:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref "VPC"
InternetGatewayId: !Ref "InternetGateway"
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref "VPC"
PublicRoute:
Type: AWS::EC2::Route
DependsOn: GatewayAttachement
Properties:
RouteTableId: !Ref "PublicRouteTable"
DestinationCidrBlock: "0.0.0.0/0"
GatewayId: !Ref "InternetGateway"
PublicSubnetOneRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnetOne
RouteTableId: !Ref PublicRouteTable
PublicSubnetTwoRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnetTwo
RouteTableId: !Ref PublicRouteTable
NatGatewayOneAttachment:
Type: AWS::EC2::EIP
DependsOn: GatewayAttachement
Properties:
Domain: vpc
Tags:
- Key: "Project"
Value: "seikatsu110"
- Key: "Environment"
Value: "dev"
NatGatewayTwoAttachment:
Type: AWS::EC2::EIP
DependsOn: GatewayAttachement
Properties:
Domain: vpc
Tags:
- Key: "Project"
Value: "seikatsu110"
- Key: "Environment"
Value: "dev"
NatGatewayOne:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt NatGatewayOneAttachment.AllocationId
SubnetId: !Ref PublicSubnetOne
Tags:
- Key: "Project"
Value: "seikatsu110"
- Key: "Environment"
Value: "dev"
NatGatewayTwo:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt NatGatewayTwoAttachment.AllocationId
SubnetId: !Ref PublicSubnetTwo
Tags:
- Key: "Project"
Value: "seikatsu110"
- Key: "Environment"
Value: "dev"
PrivateRouteTableOne:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref "VPC"
PrivateRouteOne:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PrivateRouteTableOne
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref NatGatewayOne
PrivateRouteTableOneAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref PrivateRouteTableOne
SubnetId: !Ref PrivateSubnetOne
PrivateRouteTableTwo:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref "VPC"
PrivateRouteTwo:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PrivateRouteTableTwo
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref NatGatewayTwo
PrivateRouteTableTwoAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref PrivateRouteTableTwo
SubnetId: !Ref PrivateSubnetTwo
CloudFormationにVPCテンプレートをアップロード
ファイルの作成が完了したら、CloudFormationの設定画面に戻り、ファイルをアップロードしましょう。
アップロードしたら、スタックの名前を付けましょう。スタックの名前は何でも良いです。
残りの設定はデフォルトのままで良いので、最後まで進めます。
ステータスが「CREATE_IN_PROGRESS」から「CREATE_COMPLETE」になれば完了です。
CloudFormationでVPCを自動作成する方法まとめ
今回の記事は、AWSのCloudFormationでVPCを自動作成する方法を解説しました。
Cloudformationを使うことで、リソースが自動で作成されるので楽ですね。また、設定をソース管理することで変更管理も楽になります。このようにコードからインフラを作成するのはIaCと呼ばれています。
インフラエンジニアならば、IaCは知っておきたい技術です。ぜひ覚えておきましょう!
また、AWSについてさらに勉強したい方は、こちらの講座と参考書がオススメです。
AWS認定ソリューションアーキテクト アソシエイト試験突破講座 – 初心者向け20時間完全コース-