This post is part of a series
- Part 1 - VPC
- Part 2 - Aurora cluster
- Part 3 - Lambda function
In the previous part, we've set up the base layer to deploy our resources. At this point we can create the database cluster.
Aurora DB Cluster
Assuming we have our VPC ready with at least two subnets to comply with high availability best practices, let's create our cluster, I've put together a CloudFormation template that includes:
- AWS::EC2::SecurityGroup contains inbound traffic rule to allow port 3306
- AWS::RDS::DBSubnetGroup contains a group of subnets to deploy the cluster
- AWS::EC2::DBCluster contains all the parameters to create the database cluster
Here is the full template, the only required parameters are VpcId and SubnetIds, but feel free to override any of the database cluster parameters such as database name, user name, password, etc. The template outputs the IDs corresponding to newly created resources such as the database cluster DNS endpoint, port and the security group.
Description: Template to create a serverless aurora mysql cluster
Parameters:
DbClusterDatabaseName:
Type: String
Default: dbtest
DbClusterIdentifier:
Type: String
Default: serverless-mysql-aurora
DbClusterParameterGroup:
Type: String
Default: default.aurora5.6
DbClusterMasterUsername:
Type: String
Default: master
DbClusterMasterPassword:
Type: String
Default: Aurora.2019
DbClusterPort:
Type: Number
Default: 3306
VpcId:
Type: String
SubnetIds:
Type: CommaDelimitedList
Resources:
DbClusterSg:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow MySQL port to client host
VpcId:
Ref: VpcId
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: !Ref DbClusterPort
ToPort: !Ref DbClusterPort
CidrIp: 0.0.0.0/0
DbSubnetGroup:
Type: "AWS::RDS::DBSubnetGroup"
Properties:
DBSubnetGroupDescription: "aurora subnets"
SubnetIds: !Ref SubnetIds
AuroraMysqlCluster:
Type: AWS::RDS::DBCluster
Properties:
DatabaseName:
Ref: DbClusterDatabaseName
DBClusterParameterGroupName:
Ref: DbClusterParameterGroup
DBSubnetGroupName:
Ref: DbSubnetGroup
Engine: aurora
EngineMode: serverless
MasterUsername:
Ref: DbClusterMasterUsername
MasterUserPassword:
Ref: DbClusterMasterPassword
ScalingConfiguration:
AutoPause: true
MinCapacity: 2
MaxCapacity: 4
SecondsUntilAutoPause: 1800
VpcSecurityGroupIds:
- !Ref DbClusterSg
Outputs:
DbClusterEndpointAddress:
Value: !GetAtt AuroraMysqlCluster.Endpoint.Address
DbClusterEndpointPort:
Value: !GetAtt AuroraMysqlCluster.Endpoint.Port
DbClusterSgId:
Value: !Ref DbClusterSg
To deploy this stack we use the following command where we pass the parameters specific to our VPC (VpcId and SubnetIds).
$ aws cloudformation deploy --stack-name db-stack \ --template-file aurora_cluster_template.yml \ --parameter-overrides VpcId=vpc-0b442e5d98841996c SubnetIds=subnet-013d0bbb3eca284a2,subnet-00c67cfed3ab0a791 Waiting for changeset to be created.. Waiting for stack create/update to complete Successfully created/updated stack - db-stack
Let's get the outputs as we'll need this information later. We have the cluster endpoint DNS name and the port as per our definition.
$ aws cloudformation describe-stacks --stack-name db-stack --query Stacks[*].Outputs
[
[
{
"OutputKey": "DbClusterEndpointAddress",
"OutputValue": "db-stack-auroramysqlcluster-1d1udg4ringe4.cluster-cnfxlauucwwi.eu-west-1.rds.amazonaws.com"
},
{
"OutputKey": "DbClusterSgId",
"OutputValue": "sg-072bbf2078caa0f46"
},
{
"OutputKey": "DbClusterEndpointPort",
"OutputValue": "3306"
}
]
]
In the next part, we'll create the Lambda function to query this database remotely.
No comments:
Post a Comment