AWSの知識を血肉にするための「AWS 100日チャレンジ」の64日目です。
家庭の事情でいろいろあり63日連続で途絶えてしまった。。。
今日から64日目から始めます。
AWS Certified SysOps Administrator - Associateは合格したので、つぎは、AWS ANS(AWS Certified Advanced Networking - Specialty)の勉強。
このチャレンジが100日目になったときに試験を受けたい。
AWS 100日チャレンジの記事を書く上でのルール
・100日連続アウトプット!
・継続が第一、クオリティは第二
・「社会人のリアル」を忘れない(持続可能な完走を目指す)
・コアな学習に全集中!
テーマとするサービス以外は、CloudFormationや構築済みの資産をフル活用。効率よく「核心」を突き詰めます。
課題
VPCAとVPCBをTransitGatewayで相互通信を行う
核VPCのCIDRはなんちゃってクラスフル
VPCX 10系
VPCY 172系
VPCZ 192系
実施
まずこの検証を行うに当たり、
VPCA(EC2あり)とVPCB(EC2あり)を構築する。
もちろんCloudFormationでVPCAとEC2をプライベートサブネットに作成。
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC-10
Parameters:
# ------------------------------------------------------------#
# Common
# ------------------------------------------------------------#
Prefix:
Type: String
Default: 'XXX-10'
Cider:
Type: String
Default: '10.1.0.0/16'
CiderPublicSubnet:
Type: String
Default: '10.1.1.0/24'
CiderPrivateSubnet:
Type: String
Default: '10.1.100.0/24'
InstanceImageIdLinux:
Description: 'The AMI ID for the EC2 instance(Linux)'
Type: 'AWS::EC2::Image::Id'
Default: 'ami-08f0737412a47a5ed' # 例: Amazon Linux 2 AMI (必要に応じて変更可能)
KeyName:
Description: 'Name of an existing EC2 KeyPair to enable SSH access'
Type: 'AWS::EC2::KeyPair::KeyName'
Default: 'ALLKEY20260110'
PrivateIpAddress:
Type: String
Description: 'EC2 IP'
Default: '10.1.100.10'
Resources:
# VPCの作成
VPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: !Sub '${Cider}'
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-vpc'
# インターネットゲートウェイの作成
MyInternetGateway:
Type: 'AWS::EC2::InternetGateway'
# VPCとインターネットゲートウェイを接続
AttachGateway:
Type: 'AWS::EC2::VPCGatewayAttachment'
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref MyInternetGateway
# パブリックサブネット
# ルートテーブル
RouteTablePublicMAIN:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${Prefix}-Routepublicsubnet'
# ルートテーブルへのルート登録 IGWへのルート
RoutePublicMAIN:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref RouteTablePublicMAIN
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyInternetGateway
# ルートとサブネット紐づけ
RouteTableAssocPublic01:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicMAINAZA
RouteTableId: !Ref RouteTablePublicMAIN
# パブリックサブネット1の作成
PublicMAINAZA:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: !Sub '${CiderPublicSubnet}'
AvailabilityZone: 'ap-northeast-1a'
MapPublicIpOnLaunch: false
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-PublicMAIN-AZA'
# プライベートサブネット
# ルートテーブル
RouteTablePrivateMAIN:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${Prefix}-RoutePrivatesubnet'
# ルートとサブネット紐づけ
RouteTableAssocPrivate01:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateMAINAZA
RouteTableId: !Ref RouteTablePrivateMAIN
# プライベートサブネットの作成
PrivateMAINAZA:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: !Sub '${CiderPrivateSubnet}'
AvailabilityZone: 'ap-northeast-1a'
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-PrivateMAIN-AZA'
LinuxSG:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: !Sub '${Prefix}-Private-SG'
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-Private-LinuxSG'
# EC2
LinuxSvA:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: 't2.micro'
ImageId: !Ref InstanceImageIdLinux
SubnetId: !Ref PrivateMAINAZA
PrivateIpAddress: !Ref PrivateIpAddress
SecurityGroupIds:
- !Ref LinuxSG
KeyName: !Ref KeyName
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-Private-LinuxSvA'
# ユーザーデータからWebサーバーをインストールする
UserData:
Fn::Base64: !Sub |
#!/bin/bash
# サーバーの設定変更
sudo sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=LinuxSrv/g' /etc/sysconfig/network
sudo hostname '${Prefix}-LinuxSvA'
sudo cp /usr/share/zoneinfo/Japan /etc/localtime
sudo timedatectl set-timezone Asia/Tokyo
sudo echo 'LANG=ja_JP.UTF-8' | sudo tee /etc/sysconfig/i18n
sudo yum install httpd -y
sudo systemctl enable httpd
sudo systemctl start httpd
echo "Hello World! Linux $HOSTNAME, IP:$PUBLIC_IP" | sudo tee /var/www/html/index.html
Outputs:
VPCId:
Description: 'VPC ID'
Value: !Ref VPC
Export:
Name: !Sub '${Prefix}-VPC'
PublicMAINAZAId:
Description: 'Public Subnet'
Value: !Ref PublicMAINAZA
Export:
Name: !Sub '${Prefix}-PublicMAIN-AZA'
PrivateMAINAZAId:
Description: 'Private Subnet'
Value: !Ref PrivateMAINAZA
Export:
Name: !Sub '${Prefix}-PrivateMAIN-AZA'
LinuxSvA:
Description: 'EC2 Instance ID'
Value: !Ref LinuxSvA
Export:
Name: !Sub '${Prefix}-LinuxSvA'
# MyEC2InstanceLinux2:
# Description: 'EC2 Instance ID'
# Value: !Ref MyEC2InstanceLinux2
# MyEC2InstanceWindows:
# Description: 'EC2 Instance ID'
# Value: !Ref MyEC2InstanceWindows
VPCYも同様に作成。
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC-172
Parameters:
# ------------------------------------------------------------#
# Common
# ------------------------------------------------------------#
Prefix:
Type: String
Default: 'YYY-172'
Cider:
Type: String
Default: '172.16.0.0/16'
CiderPublicSubnet:
Type: String
Default: '172.16.1.0/24'
CiderPrivateSubnet:
Type: String
Default: '172.16.100.0/24'
InstanceImageIdLinux:
Description: 'The AMI ID for the EC2 instance(Linux)'
Type: 'AWS::EC2::Image::Id'
Default: 'ami-08f0737412a47a5ed' # 例: Amazon Linux 2 AMI (必要に応じて変更可能)
KeyName:
Description: 'Name of an existing EC2 KeyPair to enable SSH access'
Type: 'AWS::EC2::KeyPair::KeyName'
Default: 'ALLKEY20260110'
PrivateIpAddress:
Type: String
Description: 'EC2 IP'
Default: '172.16.100.10'
Resources:
# VPCの作成
VPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: !Sub '${Cider}'
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-vpc'
# インターネットゲートウェイの作成
MyInternetGateway:
Type: 'AWS::EC2::InternetGateway'
# VPCとインターネットゲートウェイを接続
AttachGateway:
Type: 'AWS::EC2::VPCGatewayAttachment'
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref MyInternetGateway
# パブリックサブネット
# ルートテーブル
RouteTablePublicMAIN:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${Prefix}-Routepublicsubnet'
# ルートテーブルへのルート登録 IGWへのルート
RoutePublicMAIN:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref RouteTablePublicMAIN
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyInternetGateway
# ルートとサブネット紐づけ
RouteTableAssocPublic01:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicMAINAZA
RouteTableId: !Ref RouteTablePublicMAIN
# パブリックサブネット1の作成
PublicMAINAZA:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: !Sub '${CiderPublicSubnet}'
AvailabilityZone: 'ap-northeast-1a'
MapPublicIpOnLaunch: false
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-PublicMAIN-AZA'
# プライベートサブネット
# ルートテーブル
RouteTablePrivateMAIN:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${Prefix}-RoutePrivatesubnet'
# ルートとサブネット紐づけ
RouteTableAssocPrivate01:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateMAINAZA
RouteTableId: !Ref RouteTablePrivateMAIN
# プライベートサブネットの作成
PrivateMAINAZA:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: !Sub '${CiderPrivateSubnet}'
AvailabilityZone: 'ap-northeast-1a'
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-PrivateMAIN-AZA'
LinuxSG:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: !Sub '${Prefix}-Private-SG'
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-Private-LinuxSG'
# EC2
LinuxSvA:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: 't2.micro'
ImageId: !Ref InstanceImageIdLinux
SubnetId: !Ref PrivateMAINAZA
PrivateIpAddress: !Ref PrivateIpAddress
SecurityGroupIds:
- !Ref LinuxSG
KeyName: !Ref KeyName
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-Private-LinuxSvA'
# ユーザーデータからWebサーバーをインストールする
UserData:
Fn::Base64: !Sub |
#!/bin/bash
# サーバーの設定変更
sudo sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=LinuxSrv/g' /etc/sysconfig/network
sudo hostname '${Prefix}-LinuxSvA'
sudo cp /usr/share/zoneinfo/Japan /etc/localtime
sudo timedatectl set-timezone Asia/Tokyo
sudo echo 'LANG=ja_JP.UTF-8' | sudo tee /etc/sysconfig/i18n
sudo yum install httpd -y
sudo systemctl enable httpd
sudo systemctl start httpd
echo "Hello World! Linux $HOSTNAME, IP:$PUBLIC_IP" | sudo tee /var/www/html/index.html
Outputs:
VPCId:
Description: 'VPC ID'
Value: !Ref VPC
Export:
Name: !Sub '${Prefix}-VPC'
PublicMAINAZAId:
Description: 'Public Subnet'
Value: !Ref PublicMAINAZA
Export:
Name: !Sub '${Prefix}-PublicMAIN-AZA'
PrivateMAINAZAId:
Description: 'Private Subnet'
Value: !Ref PrivateMAINAZA
Export:
Name: !Sub '${Prefix}-PrivateMAIN-AZA'
LinuxSvA:
Description: 'EC2 Instance ID'
Value: !Ref LinuxSvA
Export:
Name: !Sub '${Prefix}-LinuxSvA'
# MyEC2InstanceLinux2:
# Description: 'EC2 Instance ID'
# Value: !Ref MyEC2InstanceLinux2
# MyEC2InstanceWindows:
# Description: 'EC2 Instance ID'
# Value: !Ref MyEC2InstanceWindows
さらにVPCZを作成。
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC-192
Parameters:
# ------------------------------------------------------------#
# Common
# ------------------------------------------------------------#
Prefix:
Type: String
Default: 'ZZZ-192'
Cider:
Type: String
Default: '192.168.0.0/16'
CiderPublicSubnet:
Type: String
Default: '192.168.1.0/24'
CiderPrivateSubnet:
Type: String
Default: '192.168.100.0/24'
InstanceImageIdLinux:
Description: 'The AMI ID for the EC2 instance(Linux)'
Type: 'AWS::EC2::Image::Id'
Default: 'ami-08f0737412a47a5ed' # 例: Amazon Linux 2 AMI (必要に応じて変更可能)
KeyName:
Description: 'Name of an existing EC2 KeyPair to enable SSH access'
Type: 'AWS::EC2::KeyPair::KeyName'
Default: 'ALLKEY20260110'
PrivateIpAddress:
Type: String
Description: 'EC2 IP'
Default: '192.168.100.10'
Resources:
# VPCの作成
VPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: !Sub '${Cider}'
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-vpc'
# インターネットゲートウェイの作成
MyInternetGateway:
Type: 'AWS::EC2::InternetGateway'
# VPCとインターネットゲートウェイを接続
AttachGateway:
Type: 'AWS::EC2::VPCGatewayAttachment'
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref MyInternetGateway
# パブリックサブネット
# ルートテーブル
RouteTablePublicMAIN:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${Prefix}-Routepublicsubnet'
# ルートテーブルへのルート登録 IGWへのルート
RoutePublicMAIN:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref RouteTablePublicMAIN
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyInternetGateway
# ルートとサブネット紐づけ
RouteTableAssocPublic01:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicMAINAZA
RouteTableId: !Ref RouteTablePublicMAIN
# パブリックサブネット1の作成
PublicMAINAZA:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: !Sub '${CiderPublicSubnet}'
AvailabilityZone: 'ap-northeast-1a'
MapPublicIpOnLaunch: false
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-PublicMAIN-AZA'
# プライベートサブネット
# ルートテーブル
RouteTablePrivateMAIN:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: !Sub '${Prefix}-RoutePrivatesubnet'
# ルートとサブネット紐づけ
RouteTableAssocPrivate01:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateMAINAZA
RouteTableId: !Ref RouteTablePrivateMAIN
# プライベートサブネットの作成
PrivateMAINAZA:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: !Sub '${CiderPrivateSubnet}'
AvailabilityZone: 'ap-northeast-1a'
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-PrivateMAIN-AZA'
LinuxSG:
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: !Sub '${Prefix}-Private-SG'
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-Private-LinuxSG'
# EC2
LinuxSvA:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: 't2.micro'
ImageId: !Ref InstanceImageIdLinux
SubnetId: !Ref PrivateMAINAZA
PrivateIpAddress: !Ref PrivateIpAddress
SecurityGroupIds:
- !Ref LinuxSG
KeyName: !Ref KeyName
Tags:
- Key: 'Name'
Value: !Sub '${Prefix}-Private-LinuxSvA'
# ユーザーデータからWebサーバーをインストールする
UserData:
Fn::Base64: !Sub |
#!/bin/bash
# サーバーの設定変更
sudo sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=LinuxSrv/g' /etc/sysconfig/network
sudo hostname '${Prefix}-LinuxSvA'
sudo cp /usr/share/zoneinfo/Japan /etc/localtime
sudo timedatectl set-timezone Asia/Tokyo
sudo echo 'LANG=ja_JP.UTF-8' | sudo tee /etc/sysconfig/i18n
sudo yum install httpd -y
sudo systemctl enable httpd
sudo systemctl start httpd
echo "Hello World! Linux $HOSTNAME, IP:$PUBLIC_IP" | sudo tee /var/www/html/index.html
Outputs:
VPCId:
Description: 'VPC ID'
Value: !Ref VPC
Export:
Name: !Sub '${Prefix}-VPC'
PublicMAINAZAId:
Description: 'Public Subnet'
Value: !Ref PublicMAINAZA
Export:
Name: !Sub '${Prefix}-PublicMAIN-AZA'
PrivateMAINAZAId:
Description: 'Private Subnet'
Value: !Ref PrivateMAINAZA
Export:
Name: !Sub '${Prefix}-PrivateMAIN-AZA'
LinuxSvA:
Description: 'EC2 Instance ID'
Value: !Ref LinuxSvA
Export:
Name: !Sub '${Prefix}-LinuxSvA'
# MyEC2InstanceLinux2:
# Description: 'EC2 Instance ID'
# Value: !Ref MyEC2InstanceLinux2
# MyEC2InstanceWindows:
# Description: 'EC2 Instance ID'
# Value: !Ref MyEC2InstanceWindows
最初からgeminiとかに作成してもらったら楽なのですが、
勉強にならんので自分で作成。
とりあえず今後AWSネットワークを検証するうえで使いまわせるCloudFormationのテンプレートが作成できた。