【CFn】公式SampleテンプレートからRoute53 A/CNAME/加重CNAME レコード登録を学ぶ。
今回はRoute53のレコード登録を勉強していきます。
Route53とは
AmazonRoute53は、可用性と拡張性に優れたドメインネームシステム(DNS)ウェブサービスです。
Route53を使用すると、ドメイン登録、DNSルーティング、ヘルスチェックの3つの主要な機能を任意の組み合わせで実行できます。
作成するレコードタイプ
A レコードタイプ
IPv4アドレスを使用して、ウェブサーバーなどのリソースにトラフィックをルーティングします。
CNAME レコードタイプ
CNAME レコードは現在のレコードの名前に対するDNSクエリを、別のドメインまたはサブドメインにマッピングします。
AWS::Route53::RecordSet内のTypeプロパティの説明欄には
基本的なリソース レコード セットの有効な値: A| AAAA| | CAA| | CNAME| | DS| | MX| | NAPTR| | NS| | PTR| | SOA| | SPF| | SRV| |TXT
加重、レイテンシ、地理位置情報、およびフェイルオーバー リソース レコード セットの値: A| AAAA| | CAA| | CNAME| | MX| | NAPTR| | PTR| | SPF| | SRV| | TXT. 加重、レイテンシ、位置情報、またはフェイルオーバー リソース レコード セットのグループを作成する場合は、グループ内のすべてのリソース レコード セットに同じ値を指定します。
とあります。
上記のように種類は様々ありますが、今回はAとCNAME・加重のCNAMEレコードの例です。
Aレコード
今回のAレコードのテンプレについての説明欄の記載です。
AmazonEC2インスタンスのパブリックIPアドレスにマップするRoute 53Aレコードを作成します。
加えてテンプレ内のDiscriptionにも「 It assumes that you already have a Hosted Zone registered with Amazon Route 53( すでにAmazon Route53にHosted Zoneが登録されていることを想定しています。)」とあります。
ドメインとホストゾーンの登録がない場合適宜ご用意お願いします。
a_record
AWSTemplateFormatVersion: 2010-09-09
Description: >-
AWS CloudFormation Sample Template Route53_A: Sample template showing how to
create an Amazon Route 53 A record that maps to the public IP address of an
EC2 instance. It assumes that you already have a Hosted Zone registered with
Amazon Route 53. **WARNING** This template creates an Amazon EC2 instance. You
will be billed for the AWS resources used if you create a stack from this
template.
Parameters:
InstanceType:
Description: WebServer EC2 instance type
Type: String
Default: t2.small
AllowedValues:
- t1.micro
- t2.nano
- t2.micro
- t2.small
- t2.medium
- t2.large
- m1.small
- m1.medium
- m1.large
- m1.xlarge
- m2.xlarge
- m2.2xlarge
- m2.4xlarge
- m3.medium
- m3.large
- m3.xlarge
- m3.2xlarge
- m4.large
- m4.xlarge
- m4.2xlarge
- m4.4xlarge
- m4.10xlarge
- c1.medium
- c1.xlarge
- c3.large
- c3.xlarge
- c3.2xlarge
- c3.4xlarge
- c3.8xlarge
- c4.large
- c4.xlarge
- c4.2xlarge
- c4.4xlarge
- c4.8xlarge
- g2.2xlarge
- g2.8xlarge
- r3.large
- r3.xlarge
- r3.2xlarge
- r3.4xlarge
- r3.8xlarge
- i2.xlarge
- i2.2xlarge
- i2.4xlarge
- i2.8xlarge
- d2.xlarge
- d2.2xlarge
- d2.4xlarge
- d2.8xlarge
- hi1.4xlarge
- hs1.8xlarge
- cr1.8xlarge
- cc2.8xlarge
- cg1.4xlarge
ConstraintDescription: must be a valid EC2 instance type.
HostedZone:
Type: String
Description: The DNS name of an existing Amazon Route 53 hosted zone
AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
ConstraintDescription: must be a valid DNS zone name.
Mappings:
AWSInstanceType2Arch:
t1.micro:
Arch: HVM64
t2.nano:
Arch: HVM64
t2.micro:
Arch: HVM64
t2.small:
Arch: HVM64
t2.medium:
Arch: HVM64
t2.large:
Arch: HVM64
m1.small:
Arch: HVM64
m1.medium:
Arch: HVM64
m1.large:
Arch: HVM64
m1.xlarge:
Arch: HVM64
m2.xlarge:
Arch: HVM64
m2.2xlarge:
Arch: HVM64
m2.4xlarge:
Arch: HVM64
m3.medium:
Arch: HVM64
m3.large:
Arch: HVM64
m3.xlarge:
Arch: HVM64
m3.2xlarge:
Arch: HVM64
m4.large:
Arch: HVM64
m4.xlarge:
Arch: HVM64
m4.2xlarge:
Arch: HVM64
m4.4xlarge:
Arch: HVM64
m4.10xlarge:
Arch: HVM64
c1.medium:
Arch: HVM64
c1.xlarge:
Arch: HVM64
c3.large:
Arch: HVM64
c3.xlarge:
Arch: HVM64
c3.2xlarge:
Arch: HVM64
c3.4xlarge:
Arch: HVM64
c3.8xlarge:
Arch: HVM64
c4.large:
Arch: HVM64
c4.xlarge:
Arch: HVM64
c4.2xlarge:
Arch: HVM64
c4.4xlarge:
Arch: HVM64
c4.8xlarge:
Arch: HVM64
g2.2xlarge:
Arch: HVMG2
g2.8xlarge:
Arch: HVMG2
r3.large:
Arch: HVM64
r3.xlarge:
Arch: HVM64
r3.2xlarge:
Arch: HVM64
r3.4xlarge:
Arch: HVM64
r3.8xlarge:
Arch: HVM64
i2.xlarge:
Arch: HVM64
i2.2xlarge:
Arch: HVM64
i2.4xlarge:
Arch: HVM64
i2.8xlarge:
Arch: HVM64
d2.xlarge:
Arch: HVM64
d2.2xlarge:
Arch: HVM64
d2.4xlarge:
Arch: HVM64
d2.8xlarge:
Arch: HVM64
hi1.4xlarge:
Arch: HVM64
hs1.8xlarge:
Arch: HVM64
cr1.8xlarge:
Arch: HVM64
cc2.8xlarge:
Arch: HVM64
AWSInstanceType2NATArch:
t1.micro:
Arch: NATHVM64
t2.nano:
Arch: NATHVM64
t2.micro:
Arch: NATHVM64
t2.small:
Arch: NATHVM64
t2.medium:
Arch: NATHVM64
t2.large:
Arch: NATHVM64
m1.small:
Arch: NATHVM64
m1.medium:
Arch: NATHVM64
m1.large:
Arch: NATHVM64
m1.xlarge:
Arch: NATHVM64
m2.xlarge:
Arch: NATHVM64
m2.2xlarge:
Arch: NATHVM64
m2.4xlarge:
Arch: NATHVM64
m3.medium:
Arch: NATHVM64
m3.large:
Arch: NATHVM64
m3.xlarge:
Arch: NATHVM64
m3.2xlarge:
Arch: NATHVM64
m4.large:
Arch: NATHVM64
m4.xlarge:
Arch: NATHVM64
m4.2xlarge:
Arch: NATHVM64
m4.4xlarge:
Arch: NATHVM64
m4.10xlarge:
Arch: NATHVM64
c1.medium:
Arch: NATHVM64
c1.xlarge:
Arch: NATHVM64
c3.large:
Arch: NATHVM64
c3.xlarge:
Arch: NATHVM64
c3.2xlarge:
Arch: NATHVM64
c3.4xlarge:
Arch: NATHVM64
c3.8xlarge:
Arch: NATHVM64
c4.large:
Arch: NATHVM64
c4.xlarge:
Arch: NATHVM64
c4.2xlarge:
Arch: NATHVM64
c4.4xlarge:
Arch: NATHVM64
c4.8xlarge:
Arch: NATHVM64
g2.2xlarge:
Arch: NATHVMG2
g2.8xlarge:
Arch: NATHVMG2
r3.large:
Arch: NATHVM64
r3.xlarge:
Arch: NATHVM64
r3.2xlarge:
Arch: NATHVM64
r3.4xlarge:
Arch: NATHVM64
r3.8xlarge:
Arch: NATHVM64
i2.xlarge:
Arch: NATHVM64
i2.2xlarge:
Arch: NATHVM64
i2.4xlarge:
Arch: NATHVM64
i2.8xlarge:
Arch: NATHVM64
d2.xlarge:
Arch: NATHVM64
d2.2xlarge:
Arch: NATHVM64
d2.4xlarge:
Arch: NATHVM64
d2.8xlarge:
Arch: NATHVM64
hi1.4xlarge:
Arch: NATHVM64
hs1.8xlarge:
Arch: NATHVM64
cr1.8xlarge:
Arch: NATHVM64
cc2.8xlarge:
Arch: NATHVM64
AWSRegionArch2AMI:
af-south-1:
HVM64: ami-064cc455f8a1ef504
HVMG2: NOT_SUPPORTED
ap-east-1:
HVM64: ami-f85b1989
HVMG2: NOT_SUPPORTED
ap-northeast-1:
HVM64: ami-0b2c2a754d5b4da22
HVMG2: ami-09d0e0e099ecabba2
ap-northeast-2:
HVM64: ami-0493ab99920f410fc
HVMG2: NOT_SUPPORTED
ap-northeast-3:
HVM64: ami-01344f6f63a4decc1
HVMG2: NOT_SUPPORTED
ap-south-1:
HVM64: ami-03cfb5e1fb4fac428
HVMG2: ami-0244c1d42815af84a
ap-southeast-1:
HVM64: ami-0ba35dc9caf73d1c7
HVMG2: ami-0e46ce0d6a87dc979
ap-southeast-2:
HVM64: ami-0ae99b503e8694028
HVMG2: ami-0c0ab057a101d8ff2
ca-central-1:
HVM64: ami-0803e21a2ec22f953
HVMG2: NOT_SUPPORTED
cn-north-1:
HVM64: ami-07a3f215cc90c889c
HVMG2: NOT_SUPPORTED
cn-northwest-1:
HVM64: ami-0a3b3b10f714a0ff4
HVMG2: NOT_SUPPORTED
eu-central-1:
HVM64: ami-0474863011a7d1541
HVMG2: ami-0aa1822e3eb913a11
eu-north-1:
HVM64: ami-0de4b8910494dba0f
HVMG2: ami-32d55b4c
eu-south-1:
HVM64: ami-08427144fe9ebdef6
HVMG2: NOT_SUPPORTED
eu-west-1:
HVM64: ami-015232c01a82b847b
HVMG2: ami-0d5299b1c6112c3c7
eu-west-2:
HVM64: ami-0765d48d7e15beb93
HVMG2: NOT_SUPPORTED
eu-west-3:
HVM64: ami-0caf07637eda19d9c
HVMG2: NOT_SUPPORTED
me-south-1:
HVM64: ami-0744743d80915b497
HVMG2: NOT_SUPPORTED
sa-east-1:
HVM64: ami-0a52e8a6018e92bb0
HVMG2: NOT_SUPPORTED
us-east-1:
HVM64: ami-032930428bf1abbff
HVMG2: ami-0aeb704d503081ea6
us-east-2:
HVM64: ami-027cab9a7bf0155df
HVMG2: NOT_SUPPORTED
us-west-1:
HVM64: ami-088c153f74339f34c
HVMG2: ami-0a7fc72dc0e51aa77
us-west-2:
HVM64: ami-01fee56b22f308154
HVMG2: ami-0fe84a5b4563d8f27
Resources:
EC2Instance:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: !FindInMap # ↑のパラメータで選択したインスタンスタイプとスタック作成リージョンから、↑のMappingsされたAMIを参照。
- AWSRegionArch2AMI
- !Ref 'AWS::Region'
- !FindInMap
- AWSInstanceType2Arch
- !Ref InstanceType
- Arch
InstanceType: !Ref InstanceType # ↑のパラメータで選択したインスタンスタイプ
MyDNSRecord:
Type: 'AWS::Route53::RecordSet' # 「作成するレコードに関する情報。」との事。
Properties:
HostedZoneName: !Join # [必須: いいえ] HostedZoneNameまたはHostedZoneIdのいずれかをの指定は必須。レコードを作成するホストゾーンの名前。「一致するホストゾーンを見つけられない場合CFnはスタックを作成しません。」との事。
- ''
- - !Ref HostedZone # パラメータで指定したホストゾーンを参照。
- .
Comment: DNS name for my instance. #[必須: いいえ] 「オプション:変更バッチリクエストに関して含めたい任意のコメント。」との事。
Name: !Join #[必須: はい] ChangeResourceRecordSetsリクエストの場合、作成、更新、または削除するレコードの名前。応答の場合ListResourceRecordSets、指定されたホストゾーン内のレコードの名前。
- ''
- - !Ref EC2Instance
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: A #[必須: はい] DNS レコードの種類。許容値:A | AAAA | CAA | CNAME | DS | MX | NAPTR | NS | PTR | SOA | SPF | SRV | TXT
TTL: '900' #[必須: いいえ] リソース レコード キャッシュの存続時間 (TTL) (秒単位)。
ResourceRecords: #[必須: いいえ] Typeプロパティに指定した値に対応する 1 つ以上の値。TypeにAを指定した場合IPv4 形式で1 つ以上のIP アドレスを指定します。
- !GetAtt
- EC2Instance # ↑で作成したEC2に紐づいた
- PublicIp # パブリックIPを参照 ※↑のEC2作成時にはNetworkInterfacesプロパティのAssociatePublicIpAddressを指定していないが当該項目のデフォルト値はtrueの為、参照可能。
Outputs:
DomainName:
Description: Fully qualified domain name # 直訳:完全修飾ドメイン名
Value: !Ref MyDNSRecord # AWS::Route53::RecordSetの!Ref 戻り値「レコードセットのドメイン名の値(など)を返します」
スタック名とパラメータを入力して「スタック作成」ボタンを押下します。
CREATE_COMPLETEしました。
出力タブにドメイン名が値として表示されています。
このスタックでは他の設定を何もしていないのでアクセスしても接続拒否されますが、
コンソールでホストゾーンを確認するとレコードが追加されていました。
EC2のパブリックIPと一致しています。
スタックを削除するとAレコードも削除されました。
CNAMEレコード
テンプレ説明欄の記載。
Route 53 CNAME レコードを作成します。
こちらも先ほどと同じくホストゾーン設定済の前提になります。
前章のAレコードのコードブロック内でプロパティについては殆ど触れたのでコメントも一箇所だけです。
cname_record
AWSTemplateFormatVersion: 2010-09-09
Description: >-
AWS CloudFormation Sample Template Route53_CNAME: Sample template showing how
to create an Amazon Route 53 CNAME record. It assumes that you already have a
Hosted Zone registered with Amazon Route 53. **WARNING** This template creates
one or more AWS resources. You will be billed for the AWS resources used if
you create a stack from this template.
Parameters:
HostedZone:
Type: String
Description: The DNS name of an existing Amazon Route 53 hosted zone
AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
ConstraintDescription: must be a valid DNS zone name.
Resources:
MyDNSRecord:
Type: 'AWS::Route53::RecordSet'
Properties:
HostedZoneName: !Join
- ''
- - !Ref HostedZone
- .
Comment: CNAME redirect to aws.amazon.com.
Name: !Join
- ''
- - !Ref 'AWS::StackName'
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: CNAME
TTL: '900'
ResourceRecords: # 先程のAレコードのテンプレでは作成したEC2のパブリックIPを指定していましたが、↑のCommentにもあるようにamazon.comにリダイレクトするように指定しています。
- aws.amazon.com
Outputs:
CNAME:
Description: Fully qualified domain name
Value: !Ref MyDNSRecord
入力してスタック作成ボタンをクリックします。
CREATE_COMPLETEしました。
ホストゾーン内にCNAMEレコードが出来ています。
値も指定通り"aws.amazon.com"になっています。
出力されているドメイン名にアクセスしても実際はamazon.comが管理しているサイトですから不正なアクセスとして拒否されますが
本筋とは違いますが、「Generated by cloudfront (CloudFront)」の表示についてもいずれ自分で調べてみたいと思います。
加重CNAMEレコード
weighted_cname_record
AWSTemplateFormatVersion: 2010-09-09
Description: >-
AWS CloudFormation Sample Template Route53_RoundRobin: Sample template showing
how to use weighted round robin (WRR) DNS entried via Amazon Route 53. This
contrived sample uses weighted CNAME records to illustrate that the weighting
influences the return records. It assumes that you already have a Hosted Zone
registered with Amazon Route 53. **WARNING** This template creates one or more
AWS resources. You will be billed for the AWS resources used if you create a
stack from this template.
Parameters:
HostedZone:
Type: String
Description: The DNS name of an existing Amazon Route 53 hosted zone
AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
ConstraintDescription: must be a valid DNS zone name.
Resources:
MyDNSRecord:
Type: 'AWS::Route53::RecordSetGroup' # 「オプションのコメント、変更するホストゾーンの名前とID、および作成するレコードの値を含む複合型。」との事。
Properties:
HostedZoneName: !Join #[必須: いいえ] HostedZoneNameまたはHostedZoneIdのいずれかの指定は必須。
- ''
- - !Ref HostedZone
- .
Comment: >- #[必須: いいえ] 「75%の確率でaws.amazon.comにリダイレクトされ、25%の確率でwww.amazon.comにリダイレクトされるように工夫された例
Contrived example to redirect to aws.amazon.com 75% of the time and
www.amazon.com 25% of the time.
RecordSets: #[必須: いいえ] 「RecordSet作成するレコードごとに1つの要素を含む複合型。」
- SetIdentifier: !Join #[必須: いいえ] シンプル以外のルーティングポリシーを持つリソースレコードセット。
- ' '
- - !Ref 'AWS::StackName'
- AWS
Name: !Join
- ''
- - !Ref 'AWS::StackName'
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: CNAME
TTL: '900'
ResourceRecords:
- aws.amazon.com
Weight: '3' #[必須: いいえ] 加重リソースレコードセットのみ指定する必要有。DNSクエリの割合を決定する値。全てに0を設定すると均等にルーティングされるが、それ以外で0を指定した場合応答しない。
- SetIdentifier: !Join
- ' '
- - !Ref 'AWS::StackName'
- Amazon
Name: !Join
- ''
- - !Ref 'AWS::StackName'
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: CNAME
TTL: '900'
ResourceRecords:
- www.amazon.com
Weight: '1' # 同上
Outputs:
DomainName:
Description: Fully qualified domain name
Value: !Ref MyDNSRecord
スタックの作成をクリック
CREATE_COMPLETE
今度は先程のCNAMEの時と違ってクリック出来るような値の参照ではないようです。
【参考:「AWS::Route53::RecordSet」の戻り値】
【参考:「AWS::Route53::RecordSetGroup」の戻り値】
ホストゾーンから作成されたCNAMEの"レコード名"をコピーしてアクセスすると、
こちらも先程同様、重みづけされたどちらのリダイレクト先も403を返すので判別出来ません。
それぞれアクセスした先の挙動も見たいので応用したものを作成。
a_record_2
AWSTemplateFormatVersion: 2010-09-09
Description: This is a test template.
# ============== パラメータ ==============
# メタデータ
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
-
Label:
default: Parameters
Parameters:
- MyIP
# パラメータ
Parameters:
MyIP:
Type: String
Description: enter your global IP(xxx.xxx.xxx.xxx/32).This is used for SecurityGroupIngress of EC2.
AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
ConstraintDescription: must be a valid IP CIDR range of the form.
HostedZone:
Type: String
Description: The DNS name of an existing Amazon Route 53 hosted zone
AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
ConstraintDescription: must be a valid DNS zone name.
# ============== リソース ==============
Resources:
# -------------- IAM --------------
# ロール
MySSMMICRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Principal:
Service:
- 'ec2.amazonaws.com'
Action:
- 'sts:AssumeRole'
Path: '/'
RoleName: MySSMMICRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
# インスタンスプロファイル
MyInstanceProfile:
DependsOn: MySSMMICRole
Type: AWS::IAM::InstanceProfile
Properties:
Path: '/'
Roles:
- !Ref MySSMMICRole
# -------------- Route53 --------------
MyDNSRecord:
Type: 'AWS::Route53::RecordSet'
Properties:
HostedZoneName: !Join
- ''
- - !Ref HostedZone
- .
Comment: DNS name for my instance.
Name: !Join
- ''
- - !Ref MyEC2
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: A
TTL: '900'
ResourceRecords:
- !GetAtt
- MyEC2
- PublicIp
# -------------- VPC --------------
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
InstanceTenancy: default
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: MyVPC
#-------------- インターネットゲートウェイ --------------
# IGW
MyIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: MyIGW
# アタッチメント
MyIGWAttach:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref MyIGW
VpcId: !Ref MyVPC
# -------------- サブネット --------------
# パブリック
MyPubSN1:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.0.0/24
VpcId: !Ref MyVPC
AvailabilityZone: !Select [ 0, !GetAZs ]
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: MyPubSN1
# -------------- ルートテーブル --------------
# ルートテーブル
MyPubRT:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: MyPubRT
# ルート
MyPubRoute:
Type: AWS::EC2::Route
DependsOn: MyIGW
Properties:
RouteTableId: !Ref MyPubRT
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyIGW
# アソシエーション
MyPubSN1Assoc:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref MyPubSN1
RouteTableId: !Ref MyPubRT
# -------------- EC2インスタンス --------------
MyEC2:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-078296f82eb463377
InstanceType: t2.micro
IamInstanceProfile: !Ref MyInstanceProfile
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: "0"
SubnetId: !Ref MyPubSN1
GroupSet:
- !Ref MyEC2SG
UserData: !Base64 |
#!/bin/bash
sudo yum -y update
sudo yum -y install httpd
sudo systemctl start httpd
sudo systemctl enable httpd
sudo echo "a-record test was successful." > /var/www/html/index.html
Tags:
- Key: Name
Value: MyEC2
# -------------- セキュリティグループ --------------
MyEC2SG:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref MyVPC
GroupDescription: Allow HTTP access only MYALBSG
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: !Ref MyIP
Tags:
- Key: Name
Value: MyEC2SG
# ============== 出力 ==============
Outputs:
DomainName:
Description: Fully qualified domain name
Value: !Ref MyDNSRecord
無事表示されました。
cname_record_2
AWSTemplateFormatVersion: 2010-09-09
Description: This is a test template.
# ============== パラメータ ==============
# メタデータ
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
-
Label:
default: Parameters
Parameters:
- MyIP
# パラメータ
Parameters:
MyIP:
Type: String
Description: enter your global IP(xxx.xxx.xxx.xxx/32).This is used for SecurityGroupIngress of EC2.
AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
ConstraintDescription: must be a valid IP CIDR range of the form.
HostedZone:
Type: String
Description: The DNS name of an existing Amazon Route 53 hosted zone
AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
ConstraintDescription: must be a valid DNS zone name.
# ============== リソース ==============
Resources:
# -------------- IAM --------------
# ロール
MySSMMICRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Principal:
Service:
- 'ec2.amazonaws.com'
Action:
- 'sts:AssumeRole'
Path: '/'
RoleName: MySSMMICRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
# インスタンスプロファイル
MyInstanceProfile:
DependsOn: MySSMMICRole
Type: AWS::IAM::InstanceProfile
Properties:
Path: '/'
Roles:
- !Ref MySSMMICRole
# -------------- Route53 --------------
MyDNSRecordA:
Type: 'AWS::Route53::RecordSet'
Properties:
HostedZoneName: !Join
- ''
- - !Ref HostedZone
- .
Comment: DNS name for my instance.
Name: !Join
- ''
- - !Ref MyEC2
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: A
TTL: '900'
ResourceRecords:
- !GetAtt
- MyEC2
- PublicIp
MyDNSRecordC:
Type: 'AWS::Route53::RecordSet'
Properties:
HostedZoneName: !Join
- ''
- - !Ref HostedZone
- .
Comment: CNAME redirect to MyEC2 A-Record Domain.
Name: !Join
- ''
- - !Ref 'AWS::StackName'
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: CNAME
TTL: '900'
ResourceRecords:
- !Ref MyDNSRecordA
# -------------- VPC --------------
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
InstanceTenancy: default
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: MyVPC
#-------------- インターネットゲートウェイ --------------
# IGW
MyIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: MyIGW
# アタッチメント
MyIGWAttach:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref MyIGW
VpcId: !Ref MyVPC
# -------------- サブネット --------------
# パブリック
MyPubSN1:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.0.0/24
VpcId: !Ref MyVPC
AvailabilityZone: !Select [ 0, !GetAZs ]
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: MyPubSN1
# -------------- ルートテーブル --------------
# ルートテーブル
MyPubRT:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: MyPubRT
# ルート
MyPubRoute:
Type: AWS::EC2::Route
DependsOn: MyIGW
Properties:
RouteTableId: !Ref MyPubRT
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyIGW
# アソシエーション
MyPubSN1Assoc:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref MyPubSN1
RouteTableId: !Ref MyPubRT
# -------------- EC2インスタンス --------------
MyEC2:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-078296f82eb463377
InstanceType: t2.micro
IamInstanceProfile: !Ref MyInstanceProfile
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: "0"
SubnetId: !Ref MyPubSN1
GroupSet:
- !Ref MyEC2SG
UserData: !Base64 |
#!/bin/bash
sudo yum -y update
sudo yum -y install httpd
sudo systemctl start httpd
sudo systemctl enable httpd
sudo echo "cname-record test was successful." > /var/www/html/index.html
Tags:
- Key: Name
Value: MyEC2
# -------------- セキュリティグループ --------------
MyEC2SG:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref MyVPC
GroupDescription: Allow HTTP access only MYALBSG
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: !Ref MyIP
Tags:
- Key: Name
Value: MyEC2SG
# ============== 出力 ==============
Outputs:
CNAME:
Description: Fully qualified domain name
Value: !Ref MyDNSRecordC
こちらも無事表示されています。
注:Aレコードに紐づいたEC2内のindex.htmlが上記テキストを表示させ、それをCNAMEでリダイレクトしているのでAレコードのDomainNameからのアクセスでも表示は同じです。
weighted_cname_record_2
AWSTemplateFormatVersion: 2010-09-09
Description: This is a test template.
# ============== パラメータ ==============
# メタデータ
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
-
Label:
default: Parameters
Parameters:
- MyIP
# パラメータ
Parameters:
MyIP:
Type: String
Description: enter your global IP(xxx.xxx.xxx.xxx/32).This is used for SecurityGroupIngress of EC2.
AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
ConstraintDescription: must be a valid IP CIDR range of the form.
HostedZone:
Type: String
Description: The DNS name of an existing Amazon Route 53 hosted zone
AllowedPattern: '(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)'
ConstraintDescription: must be a valid DNS zone name.
# ============== リソース ==============
Resources:
# -------------- IAM --------------
# ロール
MySSMMICRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Principal:
Service:
- 'ec2.amazonaws.com'
Action:
- 'sts:AssumeRole'
Path: '/'
RoleName: MySSMMICRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
# インスタンスプロファイル
MyInstanceProfile:
DependsOn: MySSMMICRole
Type: AWS::IAM::InstanceProfile
Properties:
Path: '/'
Roles:
- !Ref MySSMMICRole
# -------------- Route53 --------------
MyDNSRecordA1:
Type: 'AWS::Route53::RecordSet'
Properties:
HostedZoneName: !Join
- ''
- - !Ref HostedZone
- .
Comment: DNS name for my instance.
Name: !Join
- ''
- - !Ref MyEC2no1
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: A
TTL: '900'
ResourceRecords:
- !GetAtt
- MyEC2no1
- PublicIp
MyDNSRecordA2:
Type: 'AWS::Route53::RecordSet'
Properties:
HostedZoneName: !Join
- ''
- - !Ref HostedZone
- .
Comment: DNS name for my instance.
Name: !Join
- ''
- - !Ref MyEC2no2
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: A
TTL: '900'
ResourceRecords:
- !GetAtt
- MyEC2no2
- PublicIp
MyDNSRecordW:
Type: 'AWS::Route53::RecordSetGroup'
Properties:
HostedZoneName: !Join
- ''
- - !Ref HostedZone
- .
Comment: >-
Contrived example to redirect to MyEC2no1 A-Record Domain 75% of the time and
MyEC2no2 A-Record Domain 25% of the time.
RecordSets:
- SetIdentifier: !Join
- ' '
- - !Ref 'AWS::StackName'
- AWS
Name: !Join
- ''
- - !Ref 'AWS::StackName'
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: CNAME
TTL: '900'
ResourceRecords:
- !Ref MyDNSRecordA1
Weight: '3'
- SetIdentifier: !Join
- ' '
- - !Ref 'AWS::StackName'
- Amazon
Name: !Join
- ''
- - !Ref 'AWS::StackName'
- .
- !Ref 'AWS::Region'
- .
- !Ref HostedZone
- .
Type: CNAME
TTL: '900'
ResourceRecords:
- !Ref MyDNSRecordA2
Weight: '1'
# -------------- VPC --------------
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
InstanceTenancy: default
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: MyVPC
#-------------- インターネットゲートウェイ --------------
# IGW
MyIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: MyIGW
# アタッチメント
MyIGWAttach:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref MyIGW
VpcId: !Ref MyVPC
# -------------- サブネット --------------
# パブリック
MyPubSN1:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: 10.0.0.0/24
VpcId: !Ref MyVPC
AvailabilityZone: !Select [ 0, !GetAZs ]
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: MyPubSN1
# -------------- ルートテーブル --------------
# ルートテーブル
MyPubRT:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: MyPubRT
# ルート
MyPubRoute:
Type: AWS::EC2::Route
DependsOn: MyIGW
Properties:
RouteTableId: !Ref MyPubRT
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyIGW
# アソシエーション
MyPubSN1Assoc:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref MyPubSN1
RouteTableId: !Ref MyPubRT
# -------------- EC2インスタンス --------------
MyEC2no1:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-078296f82eb463377
InstanceType: t2.micro
IamInstanceProfile: !Ref MyInstanceProfile
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: "0"
SubnetId: !Ref MyPubSN1
GroupSet:
- !Ref MyEC2SG
UserData: !Base64 |
#!/bin/bash
sudo yum -y update
sudo yum -y install httpd
sudo systemctl start httpd
sudo systemctl enable httpd
sudo echo "this is instance1." > /var/www/html/index.html
Tags:
- Key: Name
Value: MyEC2no1
MyEC2no2:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-078296f82eb463377
InstanceType: t2.micro
IamInstanceProfile: !Ref MyInstanceProfile
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeviceIndex: "0"
SubnetId: !Ref MyPubSN1
GroupSet:
- !Ref MyEC2SG
UserData: !Base64 |
#!/bin/bash
sudo yum -y update
sudo yum -y install httpd
sudo systemctl start httpd
sudo systemctl enable httpd
sudo echo "this is instance2." > /var/www/html/index.html
Tags:
- Key: Name
Value: MyEC2no2
# -------------- セキュリティグループ --------------
MyEC2SG:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref MyVPC
GroupDescription: Allow HTTP access only MYALBSG
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: !Ref MyIP
Tags:
- Key: Name
Value: MyEC2SG
# ============== 出力 ==============
Outputs:
DomainNameA1:
Description: Fully qualified domain name
Value: !Ref MyDNSRecordA1
DomainNameA2:
Description: Fully qualified domain name
Value: !Ref MyDNSRecordA2
DomainNameW:
Description: Fully qualified domain name
Value: !Ref MyDNSRecordW
出力タブに
Aレコード1(論理ID:MyDNSRecordA1)と
Aレコード2(論理ID:MyDNSRecordA2)
そして値はクリック出来ないですが、それらを重みづけする設定の「AWS::Route53::RecordSetGroup」である
論理ID:MyDNSRecordA2のDomainも出力されています。
それぞれアクセスすると
DomainNameA1
DomainNameA2
そしてRoute53コンソールのホストゾーン内のルーティングポリシー列が”加重”と表示のあるレコード名をコピーしてブラウザでアクセス→根気強く再読み込みしていると、上記2つの表示が一定の割合で交互しているのがわかるかと思います。
以上でした。
どなたかのお役に立てる情報があれば幸いです。
Discussion