@@ -34,23 +34,29 @@ Metadata:
3434 Label :
3535 default : " Source PostgreSQL parameters"
3636 Parameters :
37+ - SourceDatabaseSize
3738 - SourcePostgresHost
3839 - SourcePostgresPort
3940 - SourcePostgresUsername
4041 - SourcePostgresPassword
4142 - SourcePostgresDBName
42- - SourcePostgresVersion
4343 - PostgresConfigSharedPreloadLibraries
4444 - SourcePostgresDBList
45+ -
46+ Label :
47+ default : " Advanced DLE configuration"
48+ Parameters :
49+ - PostgresDockerImage
50+ - DLEZFSDataSetsNumber
4551 ParameterLabels :
4652 KeyName :
4753 default : " Key pair"
4854 InstanceType :
4955 default : " Instance type"
5056 SSHLocation :
5157 default : " Connection source IP range"
52- ZFSVolumeSize :
53- default : " EBS volume size in GB for ZFS "
58+ SourceDatabaseSize :
59+ default : " Total source database size in GiB "
5460 CertificateSubdomain :
5561 default : " Certificate subdomain"
5662 CertificateHostedZone :
@@ -63,6 +69,10 @@ Metadata:
6369 default : " DLE verification token"
6470 DLERetrievalRefreshTimetable :
6571 default : " DLE retrieval refresh timetable"
72+ PostgresDockerImage :
73+ default : " Postgres docker image"
74+ DLEZFSDataSetsNumber :
75+ default : " Number of supported snapshots."
6676 PostgresDumpParallelJobs :
6777 default : " Number of pg_dump jobs"
6878 SourcePostgresDBName :
@@ -71,8 +81,6 @@ Metadata:
7181 default : " VPC security group"
7282 Subnet :
7383 default : " Subnet"
74- SourcePostgresVersion :
75- default : " Postgres version"
7684 SourcePostgresHost :
7785 default : " Host name or IP"
7886 SourcePostgresPort :
@@ -85,7 +93,6 @@ Metadata:
8593 default : " shared_preload_libraries parameter"
8694 SourcePostgresDBList :
8795 default : " Comma separated list of databases to copy"
88-
8996Parameters :
9097 Subnet :
9198 Description : Subnet to attach EC2 machine.
@@ -134,8 +141,8 @@ Parameters:
134141 MaxLength : ' 18'
135142 AllowedPattern : ' (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
136143 ConstraintDescription : Must be a valid IP CIDR range of the form x.x.x.x/x
137- ZFSVolumeSize :
138- Description : The size of the EBS volumes used for DLE ZFS pool
144+ SourceDatabaseSize :
145+ Description : The size of the source databases used to calculate the size of EBS volume, in GiB
139146 Type : Number
140147 Default : 40
141148 CertificateSubdomain :
@@ -167,21 +174,20 @@ Parameters:
167174 Description : DLE refresh schedule on cron format
168175 Type : String
169176 Default : ' 0 0 * * *'
177+ DLEZFSDataSetsNumber :
178+ Description : Number of database copies needed
179+ Type : Number
180+ Default : 2
181+ MinValue : 2
182+ MaxValue : 100
183+ PostgresDockerImage :
184+ Description : Docker image to run PostgreSQL
185+ Type : String
186+ Default : ' postgresai/extended-postgres:14'
170187 SourcePostgresDBName :
171188 Description : Source database name. This parameter is used to connect to the database
172189 Type : String
173190 Default : ' postgres'
174- SourcePostgresVersion :
175- Description : Source database Postgres version
176- Type : String
177- Default : 14
178- AllowedValues :
179- - 9.6
180- - 10
181- - 11
182- - 12
183- - 13
184- - 14
185191 SourcePostgresHost :
186192 Description : Source Postgres cluster host name or IP
187193 Type : String
@@ -301,13 +307,45 @@ Conditions:
301307 !Not [!Equals [!Ref CertificateHostedZone, '']]
302308
303309Resources :
310+ LambdaExecutionRole :
311+ Type : AWS::IAM::Role
312+ Properties :
313+ AssumeRolePolicyDocument :
314+ Version : ' 2012-10-17'
315+ Statement :
316+ - Effect : Allow
317+ Principal : {Service: [lambda.amazonaws.com]}
318+ Action : ['sts:AssumeRole']
319+ Path : " /"
320+ ManagedPolicyArns :
321+ - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
322+ PowerFunction :
323+ Type : AWS::Lambda::Function
324+ Properties :
325+ Handler : index.handler
326+ Role : !GetAtt LambdaExecutionRole.Arn
327+ Code :
328+ ZipFile : !Sub |
329+ var response = require('cfn-response');
330+ exports.handler = function(event, context) {
331+ var result = parseInt(event.ResourceProperties.Op1)*(parseInt(event.ResourceProperties.Op2)+2);
332+ response.send(event, context, response.SUCCESS, {Value: result});
333+ };
334+ Runtime : nodejs14.x
335+ SizeCalculate :
336+ Type : Custom::Power
337+ Properties :
338+ ServiceToken : !GetAtt PowerFunction.Arn
339+ Op1 : !Ref SourceDatabaseSize
340+ Op2 : !Ref DLEZFSDataSetsNumber
341+
304342 ZFSVolume :
305343 Type : AWS::EC2::Volume
306344 DeletionPolicy : Snapshot
307345 Properties :
308346 Encrypted : True
309347 AvailabilityZone : !GetAtt DLEInstance.AvailabilityZone
310- Size : !Ref ZFSVolumeSize
348+ Size : !GetAtt SizeCalculate.Value
311349 Tags :
312350 -
313351 Key : Name
@@ -342,7 +380,6 @@ Resources:
342380 set -ex
343381
344382 sleep 30
345-
346383
347384 # This code tested and works on Ubuntu 20.04 (current base AMI)
348385 disk=$(lsblk -e7 --output PATH,NAME,FSTYPE --json | jq -r '.blockdevices[] | select(.children == null and .fstype == null) | .path ')
@@ -356,6 +393,10 @@ Resources:
356393 dblab_pool \
357394 $disk
358395
396+ for i in {1..${DLEZFSDataSetsNumber}}; do
397+ sudo zfs create dblab_pool/dataset_$i
398+ done
399+
359400 dle_config_path="/home/ubuntu/.dblab/engine/configs"
360401 dle_meta_path="/home/ubuntu/.dblab/engine/meta"
361402 postgres_conf_path="/home/ubuntu/.dblab/postgres_conf"
@@ -366,9 +407,11 @@ Resources:
366407 .server.verificationToken="${DLEVerificationToken}" |
367408 .retrieval.refresh.timetable="${DLERetrievalRefreshTimetable}" |
368409 .retrieval.spec.logicalRestore.options.forceInit=true |
369- .databaseContainer.dockerImage="postgresai/extended-postgres:${SourcePostgresVersion}" |
370- .databaseConfigs.configs.shared_preload_libraries="${PostgresConfigSharedPreloadLibraries}" |
371- .databaseContainer.dockerImage="postgresai/extended-postgres:${SourcePostgresVersion}"
410+ .poolManager.mountDir = "/var/lib/dblab/dblab_pool" |
411+ .retrieval.spec.logicalDump.options.dumpLocation="/var/lib/dblab/dblab_pool/dataset_1/dump/" |
412+ .retrieval.spec.logicalRestore.options.dumpLocation="/var/lib/dblab/dblab_pool/dataset_1/dump/" |
413+ .databaseContainer.dockerImage="${PostgresDockerImage}" |
414+ .databaseConfigs.configs.shared_preload_libraries="${PostgresConfigSharedPreloadLibraries}"
372415 ' $dle_config_path/server.yml
373416
374417 yq e -i '
@@ -397,13 +440,13 @@ Resources:
397440 --publish 2345:2345 \
398441 --volume /var/run/docker.sock:/var/run/docker.sock \
399442 --volume /var/lib/dblab:/var/lib/dblab/:rshared \
400- --volume /var/lib/dblab/dblab_pool/dump:/var/lib/dblab/dblab_pool/dump/:rshared \
443+ --volume /var/lib/dblab/dblab_pool/dataset_1/ dump/ :/var/lib/dblab/dblab_pool/dataset_1 /dump/:rshared \
401444 --volume $dle_config_path:/home/dblab/configs:ro \
402445 --volume $dle_meta_path:/home/dblab/meta \
403446 --volume $postgres_conf_path:/home/dblab/standard/postgres/control \
404447 --env DOCKER_API_VERSION=1.39 \
405448 --restart always \
406- registry.gitlab.com/postgres-ai/database-lab/dblab-server:3.0.3
449+ registry.gitlab.com/postgres-ai/database-lab/dblab-server:3.1.0
407450
408451 if [ ! -z "${CertificateHostedZone}" ]; then
409452 export DOMAIN=${CertificateSubdomain}.${CertificateHostedZone}
@@ -495,7 +538,6 @@ Resources:
495538 CidrIp : ' 0.0.0.0/0'
496539 VpcId : !Ref VPC
497540
498-
499541Outputs :
500542 VerificationToken :
501543 Description : ' DLE verification token'
@@ -511,6 +553,10 @@ Outputs:
511553 Value : !Sub 'https://${CertificateSubdomain}.${CertificateHostedZone}:446'
512554 Condition : CreateSubDomain
513555
556+ EBSVolume :
557+ Description : Size of provisioned EBS volume
558+ Value : !GetAtt SizeCalculate.Value
559+
514560 DNSName :
515561 Description : Public DNS name
516562 Value : !GetAtt DLEInstance.PublicDnsName
@@ -538,3 +584,4 @@ Outputs:
538584 Value : !Sub
539585 - ' ssh -N -L CLONE_PORT:${DNSName}:CLONE_PORT -i YOUR_PRIVATE_KEY ubuntu@${DNSName}'
540586 - DNSName : !GetAtt DLEInstance.PublicDnsName
587+
0 commit comments