本記事の内容
- AWSが提供するCloudFormationサービスを利用し、データベース(RDS)の一つであるAuroraをシングルインスタンスで建てる方法を記載した記事です。
- 検証目的のため等、インスタンスを冗長化せずシングル構成で作成したいこともあるかと思います。たくさん建てますとお金もかかりますし。ネットにはシングルインスタンス構成で構築した情報があまりなく、冗長構成前提の情報が多かったため、試行錯誤して完成したCloudFormationテンプレートを本記事にまとめました。参考情報になれば幸いです。
本記事の手順で以下のような構成のクラウド環境を作成します。
※AWSの操作画面はサービスリリースと共に更新されていくため、本記事をご覧いただくタイミングによっては、現在の画面と異なる場合があります。ご了承ください。本記事内の画面キャプチャーは2022年9月時点,
まずAuroraをシングルインスタンス構成で建てる時の試行錯誤で気づいたことを以下に記載しておきます。
- 気づき
- 1.CloudFormationテンプレートにDBインスタンスの設定(Type: AWS::RDS::DBInstance)だけでなく、クラスター設定(Type: AWS::RDS::DBCluster)も必要である
- 2.シングルインスタンスとはいえど、Auroraの仕様でVPC内にアベイラビリティーゾーン(AZ)は最低二つ必要となり、それらをDBサブネットグループとして定義する必要がある
これらは有識者にとっては当たり前かもしれませんが、
私は知らなかったので、CloudFormationテンプレートを作成する中で躓きました。
AWS公式ドキュメントを読むとこのあたりが必要な理由が分かったので、以下に私の理解を書きます。
- なぜこのような設定が必要なのか?
-
1は、Auroraの仕様を読むことで私の理解が足りていなかったのだと分かりました。Aurora自体が「DBインスタンス層」とデータを管理する「クラスターボリューム層」からなる構成されていて、これらをまとめた物がAurora DB Clusterとして定義されています。そのためインスタンスの設定(Type: AWS::RDS::DBInstance)だけでなく、クラスター(Type: AWS::RDS::DBCluster)の設定も必要なのだと理解しました。クラスターボリューム層の定義は不要なのか?という点が気になりましたが、ここはCluster設定に内包されており、本サービスがマネージドサービスであるため良い感じに管理してくれていると割り切って解釈しました。間違っていたら申し訳ないです。
-
2は、AWSの公式ドキュメントの赤で囲った仕様に基づくもので、DBクラスターにはサブネットグループが必要であり、サブネットグループには少なくとも二つのAZに紐づくようにサブネットを定義しておく必要があると記載がありました。
-
ここから実際のテンプレートを説明していきます。
実施環境
- Windows 10
- Chrome
- AWS
説明の流れ
- CloudFormationスタックの作成
- CloudFormationテンプレートの説明
1. CloudFormationスタックの作成
AWSマネジメントコンソールにアクセスし、「CloudFormationサービス」を選択する。
「ファイルの選択」をクリックし、アップロードするテンプレートファイルを選択する。※ファイルは、2.CloudFormationテンプレートの説明に記載の「aurora_template_for_Qita_Single_Instance.txt」
デフォルトのまま下へスクロールし、「スタックの作成」をクリックする。
CloudFormationによるサービスの作成が始まった。「CREATE_IN_PROGRESS」が「CREATE_COMPLETE」に代わるまで待つ。
CloudFormationが完了したらRDSのサービスを開き、Auroraがシングルインスタンスで構築されていることを確認できた。
2. CloudFormationテンプレートの説明
以下が実際に投入したファイルです。
AWSTemplateFormatVersion: 2010-09-09
#####################################################
# Parameters
#####################################################
Parameters:
DBMasterUserName:
Description: Please enter the name of the master user on an RDS.
Type: String
Default: master
DBMasterUserPassword:
Description: Please enter the RDS password.
Type: String
Default: s8Ekv42Iq
NoEcho: true
VpcSubnet:
Description: VPC subnet
Type: String
Default: 10.0.0.0/16
#####################################################
# Mappings
#####################################################
Mappings:
Constant:
RDS:
ClusterName: test-aurora-cluster
DatabaseName: auroradb
InstanceName: test-aurora-instance1
InstanceType: db.t3.small
#####################################################
# Resource
#####################################################
#####################################################
# VPC section
#####################################################
Description: Create VPC
Resources:
TestVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcSubnet
Tags:
- Key: Name
Value: TestVPC
#####################################################
# Subnet section
#####################################################
TestPrivateSub1a:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: !Select [0, !Cidr [!GetAtt TestVPC.CidrBlock, 2, 8]] #10.0.0.0/24
MapPublicIpOnLaunch: false
VpcId: !Ref TestVPC
AvailabilityZone: ap-northeast-1a
Tags:
- Key: Name
Value: TestPrivateSub1a
TestPrivateSub1c:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: !Select [1, !Cidr [!GetAtt TestVPC.CidrBlock, 2, 8]] #10.0.1.0/24
MapPublicIpOnLaunch: false
VpcId: !Ref TestVPC
AvailabilityZone: ap-northeast-1c
Tags:
- Key: Name
Value: TestPrivateSub1c
#####################################################
# SecurityGroup section
#####################################################
TestSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref "TestVPC"
GroupDescription: Allow RDS Connection From TCP 3306 Port
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
CidrIp: !GetAtt "TestVPC.CidrBlock"
Tags:
- Key: Name
Value: TestSecurityGroup
#####################################################
# DBSubnetGroup section
#####################################################
DBSubnetGroup:
Type: AWS::RDS::DBSubnetGroup
Properties:
DBSubnetGroupDescription: RDS subnet group.
SubnetIds:
- !Ref "TestPrivateSub1a"
- !Ref "TestPrivateSub1c"
#####################################################
# Aurora section
#####################################################
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbparametergroup.html
DBParameterGroup:
Type: "AWS::RDS::DBParameterGroup"
Properties:
Description: "RDS DB parameter group"
Family: "aurora-mysql5.7"
Parameters:
max_connections: "10"
Tags:
- Key: Name
Value: TestClusterParamaterGroup
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbclusterparametergroup.html
DBClusterParameterGroup:
Type: "AWS::RDS::DBClusterParameterGroup"
Properties:
Description: "RDS DB cluster parameter group"
Family: "aurora-mysql5.7"
Parameters:
character_set_client: "utf8mb4"
character_set_connection: "utf8mb4"
character_set_database: "utf8mb4"
character_set_filesystem: "utf8mb4"
character_set_results: "utf8mb4"
character_set_server: "utf8mb4"
collation_connection: "utf8mb4_bin"
collation_server: "utf8mb4_bin"
time_zone: "UTC"
Tags:
- Key: Name
Value: TestClusterParamaterGroup
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora-mysql
EngineVersion: 5.7.mysql_aurora.2.10.2
DatabaseName: !FindInMap [Constant, RDS, DatabaseName]
DBClusterIdentifier: !FindInMap [Constant, RDS, ClusterName]
MasterUsername: !Ref "DBMasterUserName"
MasterUserPassword: !Ref "DBMasterUserPassword"
DBSubnetGroupName: !Ref "DBSubnetGroup"
DBClusterParameterGroupName: !Ref "DBClusterParameterGroup"
VpcSecurityGroupIds:
- !Ref "TestSecurityGroup"
DBInstance:
Type: AWS::RDS::DBInstance
Properties:
Engine: aurora-mysql
EngineVersion: 5.7.mysql_aurora.2.10.2
DBInstanceClass: !FindInMap [Constant, RDS, InstanceType]
DBSubnetGroupName: !Ref "DBSubnetGroup"
DBParameterGroupName: !Ref "DBParameterGroup"
DBClusterIdentifier: !Ref "DBCluster"
AvailabilityZone: ap-northeast-1a
以下が説明です。
AWSTemplateFormatVersion: 2010-09-09
#####################################################
# Parameters
#####################################################
Parameters:
DBMasterUserName:
Description: Please enter the name of the master user on an RDS.
Type: String
Default: master
DBMasterUserPassword:
Description: Please enter the RDS password.
Type: String
Default: s8Ekv42Iq
NoEcho: true
VpcSubnet:
Description: VPC subnet
Type: String
Default: 10.0.0.0/16
-
AWSTemplateFormatVersion: 2010-09-09
- 上記はテンプレートフォーマットのバージョン宣言で、年月日は固定です。CloudFormationテンプレートの先頭に記載するおまじない。
-
Parametersセクションはユーザからの入力を変数として、テンプレートの中で利用する物です。
- それぞれDBのユーザ名「DBMasterUserName」、DBのパスワード「DBMasterUserPassword」、VPCを配置するサブネット「VpcSubnet」であり、テンプレート内で参照しています。
#####################################################
# Mappings
#####################################################
Mappings:
Constant:
RDS:
ClusterName: test-aurora-cluster
DatabaseName: auroradb
InstanceName: test-aurora-instance1
InstanceType: db.t3.small
- Mappings:
- ここでMap型の固定値変数を設定しています。
#####################################################
# Resource
#####################################################
#####################################################
# VPC section
#####################################################
Description: Create VPC
Resources:
TestVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcSubnet
Tags:
- Key: Name
Value: TestVPC
- ここでAuroraを配置するためのVPCを作成します。「VpcSubnet」変数でユーザから入力された値を元にVPCのCidrを設定しています。
#####################################################
# Subnet section
#####################################################
TestPrivateSub1a:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: !Select [0, !Cidr [!GetAtt TestVPC.CidrBlock, 2, 8]] #10.0.0.0/24
MapPublicIpOnLaunch: false
VpcId: !Ref TestVPC
AvailabilityZone: ap-northeast-1a
Tags:
- Key: Name
Value: TestPrivateSub1a
TestPrivateSub1c:
Type: AWS::EC2::Subnet
Properties:
CidrBlock: !Select [1, !Cidr [!GetAtt TestVPC.CidrBlock, 2, 8]] #10.0.1.0/24
MapPublicIpOnLaunch: false
VpcId: !Ref TestVPC
AvailabilityZone: ap-northeast-1c
Tags:
- Key: Name
Value: TestPrivateSub1c
- ここの記載で、VPC内に配置する二つのプライベートサブネットを定義しています。
#####################################################
# SecurityGroup section
#####################################################
TestSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref "TestVPC"
GroupDescription: Allow RDS Connection From TCP 3306 Port
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
CidrIp: !GetAtt "TestVPC.CidrBlock"
Tags:
- Key: Name
Value: TestSecurityGroup
- Auroraに設定するセキュリティーグループを定義しています。送信元と、ポートにより通信路を制限しています。
#####################################################
# DBSubnetGroup section
#####################################################
DBSubnetGroup:
Type: AWS::RDS::DBSubnetGroup
Properties:
DBSubnetGroupDescription: RDS subnet group.
SubnetIds:
- !Ref "TestPrivateSub1a"
- !Ref "TestPrivateSub1c"
- Auroraを設定する際に必要なDBサブネットグループの定義です。VPC内に作成した二つのプライベートサブネットから構成されています。
#####################################################
# Aurora section
#####################################################
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbparametergroup.html
DBParameterGroup:
Type: "AWS::RDS::DBParameterGroup"
Properties:
Description: "RDS DB parameter group"
Family: "aurora-mysql5.7"
Parameters:
max_connections: "10"
Tags:
- Key: Name
Value: TestClusterParamaterGroup
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbclusterparametergroup.html
DBClusterParameterGroup:
Type: "AWS::RDS::DBClusterParameterGroup"
Properties:
Description: "RDS DB cluster parameter group"
Family: "aurora-mysql5.7"
Parameters:
character_set_client: "utf8mb4"
character_set_connection: "utf8mb4"
character_set_database: "utf8mb4"
character_set_filesystem: "utf8mb4"
character_set_results: "utf8mb4"
character_set_server: "utf8mb4"
collation_connection: "utf8mb4_bin"
collation_server: "utf8mb4_bin"
time_zone: "UTC"
Tags:
- Key: Name
Value: TestClusterParamaterGroup
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora-mysql
EngineVersion: 5.7.mysql_aurora.2.10.2
DatabaseName: !FindInMap [Constant, RDS, DatabaseName]
DBClusterIdentifier: !FindInMap [Constant, RDS, ClusterName]
MasterUsername: !Ref "DBMasterUserName"
MasterUserPassword: !Ref "DBMasterUserPassword"
DBSubnetGroupName: !Ref "DBSubnetGroup"
DBClusterParameterGroupName: !Ref "DBClusterParameterGroup"
VpcSecurityGroupIds:
- !Ref "TestSecurityGroup"
DBInstance:
Type: AWS::RDS::DBInstance
Properties:
Engine: aurora-mysql
EngineVersion: 5.7.mysql_aurora.2.10.2
DBInstanceClass: !FindInMap [Constant, RDS, InstanceType]
DBSubnetGroupName: !Ref "DBSubnetGroup"
DBParameterGroupName: !Ref "DBParameterGroup"
DBClusterIdentifier: !Ref "DBCluster"
AvailabilityZone: ap-northeast-1a
- Auroraの定義です。
- パラメータの設定として「DBParameterGroup」と「DBClusterParameterGroup」があります。
- DBインスタンス本体とクラスターの設定として「DBInstance」と「DBCluster」があります。
本記事は以上です。
クラウド環境の作成の手助けになれば嬉しいです。
参考文献
本記事の作成に当たり、以下の情報も参考にさせて頂きました。ありがとうございました。