mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-15 16:51:03 +00:00
335 lines
No EOL
11 KiB
YAML
335 lines
No EOL
11 KiB
YAML
AWSTemplateFormatVersion: 2010-09-09
|
|
Description: FeatureBase Cluster for testing
|
|
|
|
Parameters:
|
|
# Network params
|
|
PrivateSubnetIds:
|
|
Type: String
|
|
Default: 'subnet-0319dde319380326f,subnet-0517ca9a646d80f88,subnet-05a7b685ed27eb1cf'
|
|
Description: private subnet provisioned for integration test.
|
|
PublicSubnetIds:
|
|
Type: String
|
|
Default: 'subnet-066b4b922b54e51a2,subnet-037b8884269a69025,subnet-08482631514426210'
|
|
Description: public subnet provisioned for integration test.
|
|
FeatureBasePort:
|
|
Type: Number
|
|
Default: 10101
|
|
Description: The port where FeatureBase is listening on.
|
|
# basic ec2 instance params
|
|
SecurityGroupID:
|
|
Type: String
|
|
Default: sg-000ac63a3e020c470
|
|
Description: security group id
|
|
KeyPairName:
|
|
Type: String
|
|
Default: smoke-0fjLX8lrTQpONO2-gitlab-ci
|
|
Description: key pair for ec2 instances
|
|
InstanceImageId:
|
|
Type: 'AWS::SSM::Parameter::Value<String>'
|
|
Description: The ID of the AMI to use for the deployment EC2 instances.
|
|
Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
|
|
# basic root device volume params
|
|
VolumeSize:
|
|
Type: Number
|
|
Default: 20
|
|
Description: The volume size in gigabytes for the root volume of deployment instances.
|
|
Iops:
|
|
Type: Number
|
|
Default: 3000
|
|
Description: The IOPS for the root EBS volume of deployment instances.
|
|
# FeatureBase Params
|
|
FBInstanceCount:
|
|
Type: Number
|
|
Default: 5
|
|
Description: The number of EC2 instances for the FeatureBase cluster
|
|
FBInstanceSize:
|
|
Type: String
|
|
Default: m5ad.16xlarge
|
|
Description: Class of EC2 instance used to host the deployment.
|
|
# note that we are using a producer, which is also the kafka host
|
|
# and the consumer uses the kafka-static binary for ingesting data
|
|
# to featurebase
|
|
# producer/consumer related params
|
|
ProducerInstanceSize:
|
|
Type: String
|
|
Default: m4.16xlarge
|
|
ConsumerInstanceSize:
|
|
Type: String
|
|
Default: m4.16xlarge
|
|
ProducerInstanceCount:
|
|
Type: Number
|
|
Default: 1
|
|
Description: number of producer instances.
|
|
ConsumerInstanceCount:
|
|
Type: Number
|
|
Default: 1
|
|
Description: number of consumer instances.
|
|
# producer/consumer ebs volume params
|
|
EBSVolumeSize:
|
|
Type: Number
|
|
Default: 1200
|
|
EBSIops:
|
|
Type: Number
|
|
Default: 3000
|
|
# test info
|
|
TestCommitSHA:
|
|
Type: String
|
|
Default: the-current-featurebase-commit-sha
|
|
Description: FeatureBase repo gitlab commit SHA.
|
|
TestName:
|
|
Type: String
|
|
Default: some-test-name
|
|
Description: Test name (gitlab job name).
|
|
TestID:
|
|
Type: String
|
|
Default: some-test-id
|
|
Description: Test run id (gitlab CI job id).
|
|
Name:
|
|
Type: String
|
|
Default: instance-name
|
|
Description: ec2 instance name.
|
|
Prefix:
|
|
Type: String
|
|
Default: instance-prefix
|
|
Description: ec2 prefix tag.
|
|
|
|
Resources:
|
|
|
|
####################### For provisioning the Featurebase Cluster #########################
|
|
# Autoscaling group. This launches the actual EC2 instances containing FeatureBase
|
|
# we are not really auto scaling anything. this is just a way to launch multiple instances
|
|
DeploymentAutoScalingGroup:
|
|
Type: AWS::AutoScaling::AutoScalingGroup
|
|
Properties:
|
|
AutoScalingGroupName: !Sub '${AWS::StackName}-asg'
|
|
VPCZoneIdentifier:
|
|
!Split [ ",", !Ref PrivateSubnetIds ]
|
|
LaunchConfigurationName: !Ref 'DeploymentInstances'
|
|
MinSize: !Ref 'FBInstanceCount'
|
|
MaxSize: !Ref 'FBInstanceCount'
|
|
DesiredCapacity: !Ref 'FBInstanceCount'
|
|
HealthCheckGracePeriod: 120
|
|
Tags:
|
|
- Key: TestCommitSHA
|
|
Value: !Ref TestCommitSHA
|
|
PropagateAtLaunch: "true"
|
|
- Key: TestName
|
|
Value: !Sub '${TestName}-featurebase-cluster'
|
|
PropagateAtLaunch: "true"
|
|
- Key: TestID
|
|
Value: !Ref TestID
|
|
PropagateAtLaunch: "true"
|
|
- Key: Name
|
|
Value: !Ref Name
|
|
PropagateAtLaunch: "true"
|
|
- Key: Prefix
|
|
Value: !Ref Prefix
|
|
PropagateAtLaunch: "true"
|
|
UpdatePolicy:
|
|
AutoScalingRollingUpdate:
|
|
MaxBatchSize: 1
|
|
|
|
# Metadata describing the EC2 instance
|
|
DeploymentInstances:
|
|
Type: AWS::AutoScaling::LaunchConfiguration
|
|
Properties:
|
|
LaunchConfigurationName: !Sub '${AWS::StackName}-launch-cfg'
|
|
KeyName: !Ref KeyPairName
|
|
ImageId: !Ref InstanceImageId
|
|
SecurityGroups:
|
|
- !Ref SecurityGroupID
|
|
InstanceType: !Ref FBInstanceSize
|
|
BlockDeviceMappings:
|
|
- DeviceName: /dev/xvda
|
|
Ebs:
|
|
Encrypted: true
|
|
VolumeSize: !Ref 'VolumeSize'
|
|
VolumeType: "gp3"
|
|
Iops: !Ref 'Iops'
|
|
IamInstanceProfile: !Ref DeploymentInstanceProfile
|
|
UserData:
|
|
Fn::Base64: !Sub |
|
|
#!/bin/bash
|
|
set +x
|
|
set -e
|
|
sudo mdadm --create --verbose /dev/md0 --level=0 --raid-devices=4 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1 /dev/nvme4n1
|
|
sudo mkfs.ext4 /dev/md0
|
|
sudo mkdir data
|
|
sudo mount /dev/md0 /data
|
|
sudo chown -R ec2-user:ec2-user /data
|
|
|
|
####################### For provisioning the Producer Cluster #########################
|
|
ProducerAutoScalingGroup:
|
|
Type: AWS::AutoScaling::AutoScalingGroup
|
|
Properties:
|
|
AutoScalingGroupName: !Sub '${AWS::StackName}-producer-asg'
|
|
VPCZoneIdentifier:
|
|
!Split [ ",", !Ref PrivateSubnetIds ]
|
|
LaunchConfigurationName: !Ref 'ProducerInstances'
|
|
MinSize: !Ref 'ProducerInstanceCount'
|
|
MaxSize: !Ref 'ProducerInstanceCount'
|
|
DesiredCapacity: !Ref 'ProducerInstanceCount'
|
|
HealthCheckGracePeriod: 120
|
|
Tags:
|
|
- Key: TestCommitSHA
|
|
Value: !Ref TestCommitSHA
|
|
PropagateAtLaunch: "true"
|
|
- Key: TestName
|
|
Value: !Sub '${TestName}-ingest-producer'
|
|
PropagateAtLaunch: "true"
|
|
- Key: TestID
|
|
Value: !Ref TestID
|
|
PropagateAtLaunch: "true"
|
|
- Key: Name
|
|
Value: !Ref Name
|
|
PropagateAtLaunch: "true"
|
|
- Key: Prefix
|
|
Value: !Ref Prefix
|
|
PropagateAtLaunch: "true"
|
|
UpdatePolicy:
|
|
AutoScalingRollingUpdate:
|
|
MaxBatchSize: 1
|
|
|
|
# Metadata describing the EC2 instance
|
|
ProducerInstances:
|
|
Type: AWS::AutoScaling::LaunchConfiguration
|
|
Properties:
|
|
LaunchConfigurationName: !Sub '${AWS::StackName}-producer-launch-cfg'
|
|
KeyName: !Ref KeyPairName
|
|
ImageId: !Ref InstanceImageId
|
|
SecurityGroups:
|
|
- !Ref SecurityGroupID
|
|
InstanceType: !Ref ProducerInstanceSize
|
|
BlockDeviceMappings:
|
|
# root device volume
|
|
- DeviceName: /dev/xvda
|
|
Ebs:
|
|
Encrypted: true
|
|
VolumeSize: !Ref 'VolumeSize'
|
|
VolumeType: "gp3"
|
|
Iops: !Ref 'Iops'
|
|
- DeviceName: /dev/sdb
|
|
Ebs:
|
|
Encrypted: true
|
|
VolumeSize: !Ref 'EBSVolumeSize'
|
|
VolumeType: "gp3"
|
|
Iops: !Ref 'EBSIops'
|
|
IamInstanceProfile: !Ref DeploymentInstanceProfile
|
|
|
|
####################### For provisioning the Consumer Cluster #########################
|
|
ConsumerAutoScalingGroup:
|
|
Type: AWS::AutoScaling::AutoScalingGroup
|
|
Properties:
|
|
AutoScalingGroupName: !Sub '${AWS::StackName}-consumer-asg'
|
|
VPCZoneIdentifier:
|
|
!Split [ ",", !Ref PrivateSubnetIds ]
|
|
LaunchConfigurationName: !Ref 'ConsumerInstances'
|
|
MinSize: !Ref 'ConsumerInstanceCount'
|
|
MaxSize: !Ref 'ConsumerInstanceCount'
|
|
DesiredCapacity: !Ref 'ConsumerInstanceCount'
|
|
HealthCheckGracePeriod: 120
|
|
Tags:
|
|
- Key: TestCommitSHA
|
|
Value: !Ref TestCommitSHA
|
|
PropagateAtLaunch: "true"
|
|
- Key: TestName
|
|
Value: !Sub '${TestName}-ingest-consumer'
|
|
PropagateAtLaunch: "true"
|
|
- Key: TestID
|
|
Value: !Ref TestID
|
|
PropagateAtLaunch: "true"
|
|
- Key: Name
|
|
Value: !Ref Name
|
|
PropagateAtLaunch: "true"
|
|
- Key: Prefix
|
|
Value: !Ref Prefix
|
|
PropagateAtLaunch: "true"
|
|
UpdatePolicy:
|
|
AutoScalingRollingUpdate:
|
|
MaxBatchSize: 1
|
|
|
|
# Metadata describing the EC2 instance
|
|
ConsumerInstances:
|
|
Type: AWS::AutoScaling::LaunchConfiguration
|
|
Properties:
|
|
LaunchConfigurationName: !Sub '${AWS::StackName}-consumer-launch-cfg'
|
|
KeyName: !Ref KeyPairName
|
|
ImageId: !Ref InstanceImageId
|
|
SecurityGroups:
|
|
- !Ref SecurityGroupID
|
|
InstanceType: !Ref ConsumerInstanceSize
|
|
BlockDeviceMappings:
|
|
# root device volume
|
|
- DeviceName: /dev/xvda
|
|
Ebs:
|
|
Encrypted: true
|
|
VolumeSize: !Ref 'VolumeSize'
|
|
VolumeType: "gp3"
|
|
Iops: !Ref 'Iops'
|
|
- DeviceName: /dev/sdb
|
|
Ebs:
|
|
Encrypted: true
|
|
VolumeSize: !Ref 'EBSVolumeSize'
|
|
VolumeType: "gp3"
|
|
Iops: !Ref 'EBSIops'
|
|
IamInstanceProfile: !Ref DeploymentInstanceProfile
|
|
|
|
####################### IAM roles and policies #################################
|
|
# Role for the deployment's EC2 hosts. Adds policies for SSM-based access and CloudWatchAgent.
|
|
DeploymentEC2Role:
|
|
Type: AWS::IAM::Role
|
|
Properties:
|
|
RoleName: !Sub '${AWS::StackName}'
|
|
AssumeRolePolicyDocument:
|
|
Statement:
|
|
- Effect: Allow
|
|
Principal:
|
|
Service: [ec2.amazonaws.com]
|
|
Action: ['sts:AssumeRole']
|
|
Path: /
|
|
ManagedPolicyArns:
|
|
- 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore'
|
|
- 'arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy'
|
|
- !Ref EC2InstanceS3PermissionsPolicy
|
|
|
|
# Attach roles to the deployment instances
|
|
DeploymentInstanceProfile:
|
|
Type: AWS::IAM::InstanceProfile
|
|
Properties:
|
|
InstanceProfileName: !Sub '${AWS::StackName}'
|
|
Path: /
|
|
Roles: [!Ref 'DeploymentEC2Role']
|
|
|
|
EC2InstanceS3PermissionsPolicy:
|
|
Type: AWS::IAM::ManagedPolicy
|
|
Properties:
|
|
PolicyDocument:
|
|
Version: 2012-10-17
|
|
Statement:
|
|
- Effect: Allow
|
|
Action:
|
|
- 's3:GetObject'
|
|
- 's3:PutObject*'
|
|
Resource:
|
|
- !Sub 'arn:aws:s3:::*/*'
|
|
- Effect: Allow
|
|
Action: 's3:ListBucket'
|
|
Resource:
|
|
- !Sub 'arn:aws:s3:::*'
|
|
|
|
# "Action": [
|
|
# "s3:PutObject",
|
|
# "s3:GetObject"
|
|
# ],
|
|
# "Resource": "arn:aws:s3:::tremor-data-backup/*"
|
|
|
|
Outputs:
|
|
DeploymentAutoscalingGroupName:
|
|
Description: Deployment Auto Scaling Group
|
|
Value: !Ref DeploymentAutoScalingGroup
|
|
ProducerAutoscalingGroupName:
|
|
Description: Producer Auto Scaling Group
|
|
Value: !Ref ProducerAutoScalingGroup
|
|
ConsumerAutoscalingGroupName:
|
|
Description: Consumer Auto Scaling Group
|
|
Value: !Ref ConsumerAutoScalingGroup |