{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "This template deploys the AWS IBM Spectrum Scale Quick Start. See the deployment guide at http://aws.amazon.com/quickstart for details. This template creates Amazon EC2 instances and related resources. You will be billed for the AWS resources used if you create a stack from this template. (qs-1nkhqu6io)", "Metadata": { "AWS::CloudFormation::Interface": { "ParameterGroups": [ { "Label": { "default": "File System Configurations:" }, "Parameters": [ "BlockSize", "DataReplica", "GpfsMountPoint" ] }, { "Label": { "default": "NSD Configurations:" }, "Parameters": [ "EBSType", "DiskPerNode", "DiskSize" ] }, { "Label": { "default": "Server Node Configurations:" }, "Parameters": [ "ServerNodeCount", "ServerInstanceType" ] }, { "Label": { "default": "Compute Node Configurations:" }, "Parameters": [ "ComputeNodeCount", "ComputeInstanceType" ] }, { "Label": { "default": "Network Configuration:" }, "Parameters": [ "AvailabilityZones", "VPCCIDR", "PrivateSubnet1CIDR", "PrivateSubnet2CIDR", "PublicSubnet1CIDR", "PublicSubnet2CIDR", "RemoteAccessCIDR" ] }, { "Label": { "default": "Amazon EC2 Configuration:" }, "Parameters": [ "KeyPairName", "BastionAMIOS", "BastionInstanceType" ] }, { "Label": { "default": "AWS Quick Start Configuration:" }, "Parameters": [ "QSS3BucketName", "QSS3BucketRegion", "QSS3KeyPrefix" ] }, { "Label": { "default": "Personal Configuration:" }, "Parameters": [ "SpectrumS3Bucket", "OperatorEmail" ] }, { "Label": { "default": "License Information:" }, "Parameters": [ "LicenseAgreementTerms" ] } ], "ParameterLabels": { "BlockSize": { "default": "Block Size" }, "DataReplica": { "default": "Data replica" }, "GpfsMountPoint": { "default": "GPFS Mount Point" }, "EBSType": { "default": "EBS Type" }, "DiskPerNode": { "default": "Disk Per Node" }, "DiskSize": { "default": "Disk Size" }, "ServerNodeCount": { "default": "Server Node Count" }, "ServerInstanceType": { "default": "Server Instance Type" }, "ComputeNodeCount": { "default": "Compute Node Count" }, "ComputeInstanceType": { "default": "Compute Instance Type" }, "LicenseAgreementTerms": { "default": "License Agreement Terms" }, "QSS3BucketName": { "default": "Quick Start S3 Bucket Name" }, "QSS3BucketRegion": { "default": "Quick Start S3 bucket region" }, "QSS3KeyPrefix": { "default": "Quick Start S3 Key Prefix" }, "AvailabilityZones": { "default": "Availability Zones" }, "VPCCIDR": { "default": "VPC CIDR" }, "PublicSubnet1CIDR": { "default": "Public Subnet 1 CIDR" }, "PublicSubnet2CIDR": { "default": "Public Subnet 2 CIDR" }, "PrivateSubnet1CIDR": { "default": "Private Subnet 1 CIDR" }, "PrivateSubnet2CIDR": { "default": "Private Subnet 2 CIDR" }, "RemoteAccessCIDR": { "default": "Allowed External Access CIDR" }, "KeyPairName": { "default": "Key Pair Name" }, "BastionInstanceType": { "default": "Bastion Instance Type" }, "OperatorEmail": { "default": "Operator Email" }, "SpectrumS3Bucket": { "default": "Spectrum S3 Bucket" }, "BastionAMIOS": { "default": "Bastion AMI OS" } } } }, "Parameters": { "LicenseAgreementTerms": { "AllowedValues": [ "Accept" ], "Description": "Review the licensing terms at http://spectrumscale-license.s3-website-us-west-2.amazonaws.com and choose Accept to indicate your acceptance.", "Type": "String" }, "QSS3BucketName": { "AllowedPattern": "^[0-9a-zA-Z]+([0-9a-zA-Z-]*[0-9a-zA-Z])*$", "ConstraintDescription": "Quick Start bucket name can include numbers, lowercase letters, uppercase letters, and hyphens (-). It cannot start or end with a hyphen (-).", "Default": "aws-quickstart", "Description": "S3 bucket name for the Quick Start assets. This string can include numbers, lowercase letters, uppercase letters, and hyphens (-). It cannot start or end with a hyphen (-).", "Type": "String" }, "QSS3BucketRegion": { "Default": "us-east-1", "Description": "The AWS Region where the Quick Start S3 bucket (QSS3BucketName) is hosted. When using your own bucket, you must specify this value.", "Type": "String" }, "QSS3KeyPrefix": { "AllowedPattern": "^[0-9a-zA-Z-/]*$", "ConstraintDescription": "Quick Start key prefix can include numbers, lowercase letters, uppercase letters, hyphens (-), and forward slash (/).", "Default": "quickstart-ibm-spectrum-scale/", "Description": "S3 key prefix for the Quick Start assets. Quick Start key prefix can include numbers, lowercase letters, uppercase letters, hyphens (-), and forward slash (/).", "Type": "String" }, "SpectrumS3Bucket": { "Description": "The name of the S3 bucket to be used for data store. If you choose not to create an S3 bucket, simply leave the SpectrumS3Bucket parameter blank, and a new S3 bucket will be created by this Quick Start.", "AllowedPattern": "^[0-9a-z]?([0-9a-z-/]*[0-9a-z])*$", "Type": "String", "MinLength": "0", "Default": "", "ConstraintDescription": "S3 bucket name can include numbers, lowercase letters, lowercase letters, and hyphens (-). It cannot start or end with a hyphen (-)." }, "BlockSize": { "Description": "File system block size.", "Type": "String", "Default": "1M", "AllowedValues": [ "256K", "512K", "1M", "2M", "4M", "8M", "16M" ] }, "DataReplica": { "Description": "Number of replica copies of data across the cluster nodes.", "Type": "Number", "Default": "2", "AllowedValues": [ "1", "2" ] }, "GpfsMountPoint": { "Type": "String", "Default": "/gpfs/fs1", "AllowedPattern": "(/[a-zA-Z0-9]+)/([a-zA-Z0-9]+)", "Description": "The mount point for the Spectrum Scale volume i.e /gpfs/fs1." }, "EBSType": { "Description": "EBS volume type for each NSD server node NSD disk. Options are: General Purpose SSD (gp2), Provisioned IOPS SSD (io1), Throughput Optimized HDD(st1), Cold HDD (sc1) and EBS Magnetic (standard). ", "Type": "String", "Default": "gp2", "AllowedValues": [ "gp2", "io1", "sc1", "st1", "standard" ] }, "DiskPerNode": { "Description": "Number of disks attached to each NSD Server Node.", "Type": "Number", "Default": "1", "AllowedValues": [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15" ] }, "DiskSize": { "Description": "Disk size of each NSD server node, in GiB. Supported disk sizes are 10-16384 GiB.", "Type": "Number", "Default": "500", "MinValue": "10", "MaxValue": "16384", "ConstraintDescription": "Allowed Disk size are MIN=10,MAX=16384 (GB)." }, "ServerNodeCount": { "Description": "Number of EC2 instances to launch for NSD Server on GPFS cluster (MIN=2, MAX=64).", "Type": "Number", "Default": "2", "AllowedValues": [ "2", "4", "6", "8", "10", "12", "14", "16", "18", "20", "22", "24", "26", "28", "30", "32", "34", "36", "38", "40", "42", "44", "46", "48", "50", "52", "54", "56", "58", "60", "62", "64" ], "ConstraintDescription": "NSD Server node size must be between 2 to 64." }, "ServerInstanceType": { "Description": "Instance type to use for the NSD Server nodes instances.", "Type": "String", "Default": "t2.medium", "AllowedValues": [ "t2.micro", "t2.small", "t2.medium", "t2.large", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "m4.16xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c5.large", "c5.xlarge", "c5.2xlarge", "c5.4xlarge", "c5.9xlarge", "c5.18xlarge", "cc2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "r4.large", "r4.xlarge", "r4.2xlarge", "r4.4xlarge", "r4.8xlarge", "r4.16xlarge", "x1.16xlarge", "x1.32xlarge", "x1e.xlarge", "x1e.2xlarge", "x1e.4xlarge", "x1e.8xlarge", "x1e.16xlarge", "x1e.32xlarge" ], "ConstraintDescription": "must be a valid EC2 instance type." }, "ComputeNodeCount": { "Description": "Number of Compute node instances (MIN=1, MAX=64).", "Type": "Number", "Default": "2", "MinValue": "1", "MaxValue": "64", "ConstraintDescription": "Compute node size must be between 1 to 64." }, "ComputeInstanceType": { "Description": "Instance type to use for the Compute node instances.", "Type": "String", "Default": "t2.medium", "AllowedValues": [ "t2.micro", "t2.small", "t2.medium", "t2.large", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "m4.16xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c5.large", "c5.xlarge", "c5.2xlarge", "c5.4xlarge", "c5.9xlarge", "c5.18xlarge", "cc2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "r4.large", "r4.xlarge", "r4.2xlarge", "r4.4xlarge", "r4.8xlarge", "r4.16xlarge", "x1.16xlarge", "x1.32xlarge", "x1e.xlarge", "x1e.2xlarge", "x1e.4xlarge", "x1e.8xlarge", "x1e.16xlarge", "x1e.32xlarge" ], "ConstraintDescription": "must be a valid EC2 instance type." }, "AvailabilityZones": { "Description": "List of Availability Zones to use for the subnets in the VPC. Only two Availability Zones are used for this deployment, and the logical order of your selections is preserved.", "Type": "List", "AllowedPattern": "(([a-zA-Z]+)-([a-zA-Z]+)-([0-9a-z]+))", "ConstraintDescription": "Two Availability Zones must be added." }, "VPCCIDR": { "Description": "CIDR block for the VPC.", "Type": "String", "Default": "10.0.0.0/16", "AllowedPattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/(1[6-9]|2[0-8]))$", "ConstraintDescription": "CIDR block parameter must be in the form x.x.x.x/16-28." }, "PublicSubnet1CIDR": { "Description": "CIDR block for the public subnet located in Availability Zone 1.", "Type": "String", "Default": "10.0.0.0/24", "AllowedPattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/(1[6-9]|2[0-8]))$", "ConstraintDescription": "CIDR block parameter must be in the form x.x.x.x/16-28." }, "PublicSubnet2CIDR": { "Description": "CIDR block for the public subnet located in Availability Zone 2.", "Type": "String", "Default": "10.0.2.0/24", "AllowedPattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/(1[6-9]|2[0-8]))$", "ConstraintDescription": "CIDR block parameter must be in the form x.x.x.x/16-28." }, "PrivateSubnet1CIDR": { "Description": "CIDR block for the private subnet located in Availability Zone 1.", "Type": "String", "Default": "10.0.1.0/24", "AllowedPattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/(1[6-9]|2[0-8]))$", "ConstraintDescription": "CIDR block parameter must be in the form x.x.x.x/16-28." }, "PrivateSubnet2CIDR": { "Description": "CIDR block for the private subnet located in Availability Zone 2.", "Type": "String", "Default": "10.0.3.0/24", "AllowedPattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/(1[6-9]|2[0-8]))$", "ConstraintDescription": "CIDR block parameter must be in the form x.x.x.x/16-28." }, "BastionInstanceType": { "AllowedValues": [ "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge" ], "Default": "t2.micro", "Description": "EC2 instance type for the bastion instances.", "Type": "String" }, "BastionAMIOS": { "AllowedValues": [ "Amazon-Linux2-HVM" ], "Default": "Amazon-Linux2-HVM", "Description": "The Linux distribution for the AMI to be used for the bastion instances", "Type": "String" }, "RemoteAccessCIDR": { "AllowedPattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$", "ConstraintDescription": "CIDR block parameter must be in the form x.x.x.x/x.", "Description": "CIDR block thats allowed external SSH access to the bastion hosts, e.g., x.x.x.x/16-28. We recommend that you set this value to a trusted CIDR block. For example, you might want to restrict access to your corporate network.", "Type": "String" }, "KeyPairName": { "Description": "Name of an existing EC2 Key Pair.", "Type": "AWS::EC2::KeyPair::KeyName", "MinLength": "1", "ConstraintDescription": "must be the name of an existing EC2 KeyPair." }, "OperatorEmail": { "AllowedPattern": "([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)", "ConstraintDescription": "Must be a valid email address.", "Description": "Email address that notifications of any scaling operations will be sent to.", "Type": "String" } }, "Conditions":{ "GovCloudCondition": { "Fn::Equals": [ { "Ref": "AWS::Region" }, "us-gov-west-1" ] }, "ReplicaOneCondition": { "Fn::Equals": [ { "Ref": "DataReplica" }, "1" ] }, "UsingDefaultBucket": { "Fn::Equals": [ { "Ref": "QSS3BucketName" }, "aws-quickstart" ] } }, "Resources": { "VPCStack": { "Type": "AWS::CloudFormation::Stack", "Properties": { "TemplateURL": { "Fn::Sub": [ "https://${S3Bucket}.s3.${S3Region}.${AWS::URLSuffix}/${QSS3KeyPrefix}submodules/quickstart-aws-vpc/templates/aws-vpc.template", { "S3Region": { "Fn::If": ["UsingDefaultBucket", { "Ref": "AWS::Region" }, {"Ref": "QSS3BucketRegion"}] }, "S3Bucket": { "Fn::If": ["UsingDefaultBucket", { "Fn::Sub": "${QSS3BucketName}-${AWS::Region}" }, {"Ref": "QSS3BucketName"}] } } ] }, "Tags" : [ { "Key" : "Version", "Value" : "v1.3" } ], "Parameters": { "AvailabilityZones": { "Fn::Join": [ ",", { "Ref": "AvailabilityZones" } ] }, "KeyPairName": { "Ref": "KeyPairName" }, "PrivateSubnet1ACIDR": { "Ref": "PrivateSubnet1CIDR" }, "PrivateSubnet2ACIDR": { "Ref": "PrivateSubnet2CIDR" }, "PublicSubnet1CIDR": { "Ref": "PublicSubnet1CIDR" }, "PublicSubnet2CIDR": { "Ref": "PublicSubnet2CIDR" }, "VPCCIDR": { "Ref": "VPCCIDR" }, "CreatePrivateSubnets": { "Fn::If": [ "ReplicaOneCondition", "false", "true" ] } } } }, "SubnetNATStack": { "DependsOn": "VPCStack", "Condition": "ReplicaOneCondition", "Type": "AWS::CloudFormation::Stack", "Properties": { "TemplateURL": { "Fn::Sub": [ "https://${S3Bucket}.s3.${S3Region}.${AWS::URLSuffix}/${QSS3KeyPrefix}templates/ibm-spectrum-scale-subnet.template", { "S3Region": { "Fn::If": ["UsingDefaultBucket", { "Ref": "AWS::Region" }, {"Ref": "QSS3BucketRegion"}] }, "S3Bucket": { "Fn::If": ["UsingDefaultBucket", { "Fn::Sub": "${QSS3BucketName}-${AWS::Region}" }, {"Ref": "QSS3BucketName"}] } } ] }, "Tags" : [ { "Key" : "Version", "Value" : "v1.3" } ], "Parameters": { "AvailabilityZones": { "Fn::Join": [ ",", { "Ref": "AvailabilityZones" } ] }, "VPCCIDR": { "Fn::GetAtt": [ "VPCStack", "Outputs.VPCCIDR" ] }, "VpcId": { "Fn::GetAtt": [ "VPCStack", "Outputs.VPCID" ] }, "KeyPairName": { "Ref": "KeyPairName" }, "PrivateSubnet1ACIDR": { "Ref": "PrivateSubnet1CIDR" }, "PublicSubnet1ID": { "Fn::GetAtt": [ "VPCStack", "Outputs.PublicSubnet1ID" ] } } } }, "BastionStack": { "DependsOn": "VPCStack", "Type": "AWS::CloudFormation::Stack", "Properties": { "TemplateURL":{ "Fn::Sub": [ "https://${S3Bucket}.s3.${S3Region}.${AWS::URLSuffix}/${QSS3KeyPrefix}submodules/quickstart-linux-bastion/templates/linux-bastion.template", { "S3Region": { "Fn::If": ["UsingDefaultBucket", { "Ref": "AWS::Region" }, {"Ref": "QSS3BucketRegion"}] }, "S3Bucket": { "Fn::If": ["UsingDefaultBucket", { "Fn::Sub": "${QSS3BucketName}-${AWS::Region}" }, {"Ref": "QSS3BucketName"}] } } ] }, "Tags" : [ { "Key" : "Version", "Value" : "v1.3" } ], "Parameters": { "BastionAMIOS": { "Ref": "BastionAMIOS" }, "BastionInstanceType": { "Ref": "BastionInstanceType" }, "KeyPairName": { "Ref": "KeyPairName" }, "PublicSubnet1ID": { "Fn::GetAtt": [ "VPCStack", "Outputs.PublicSubnet1ID" ] }, "PublicSubnet2ID": { "Fn::GetAtt": [ "VPCStack", "Outputs.PublicSubnet2ID" ] }, "QSS3BucketName": { "Fn::If": [ "UsingDefaultBucket", { "Fn::Sub": "${QSS3BucketName}-${AWS::Region}" }, { "Ref": "QSS3BucketName" } ] }, "QSS3KeyPrefix": { "Fn::Sub": "${QSS3KeyPrefix}submodules/quickstart-linux-bastion/" }, "QSS3BucketRegion": { "Fn::If": [ "UsingDefaultBucket", { "Ref": "AWS::Region" }, { "Ref": "QSS3BucketRegion" } ] }, "RemoteAccessCIDR": { "Ref": "RemoteAccessCIDR" }, "VPCID": { "Fn::GetAtt": [ "VPCStack", "Outputs.VPCID" ] } } } }, "ClusterStack": { "Type": "AWS::CloudFormation::Stack", "DependsOn": "BastionStack", "Properties": { "TemplateURL": { "Fn::Sub": [ "https://${S3Bucket}.s3.${S3Region}.${AWS::URLSuffix}/${QSS3KeyPrefix}templates/ibm-spectrum-scale.template", { "S3Region": { "Fn::If": ["UsingDefaultBucket", { "Ref": "AWS::Region" }, {"Ref": "QSS3BucketRegion"}] }, "S3Bucket": { "Fn::If": ["UsingDefaultBucket", { "Fn::Sub": "${QSS3BucketName}-${AWS::Region}" }, {"Ref": "QSS3BucketName"}] } } ] }, "Tags" : [ { "Key" : "Version", "Value" : "v1.3" } ], "Parameters": { "BlockSize": { "Ref": "BlockSize" }, "DataReplica": { "Ref": "DataReplica" }, "GpfsMountPoint": { "Ref": "GpfsMountPoint" }, "EBSType": { "Ref": "EBSType" }, "DiskPerNode": { "Ref": "DiskPerNode" }, "DiskSize": { "Ref": "DiskSize" }, "ServerNodeCount": { "Ref": "ServerNodeCount" }, "ServerInstanceType": { "Ref": "ServerInstanceType" }, "ComputeNodeCount": { "Ref": "ComputeNodeCount" }, "ComputeInstanceType": { "Ref": "ComputeInstanceType" }, "PrivateSubnet1ID": { "Fn::If": [ "ReplicaOneCondition", { "Fn::GetAtt": [ "SubnetNATStack", "Outputs.PrivateSubnetID" ] }, { "Fn::GetAtt": [ "VPCStack", "Outputs.PrivateSubnet1AID" ] } ] }, "PrivateSubnet2ID": { "Fn::If": [ "ReplicaOneCondition", { "Fn::GetAtt": [ "SubnetNATStack", "Outputs.PrivateSubnetID" ] }, { "Fn::GetAtt": [ "VPCStack", "Outputs.PrivateSubnet2AID" ] } ] }, "VpcId": { "Fn::GetAtt": [ "VPCStack", "Outputs.VPCID" ] }, "BastionSecurityGroupID": { "Fn::GetAtt": [ "BastionStack", "Outputs.BastionSecurityGroupID" ] }, "SpectrumS3Bucket": { "Ref": "SpectrumS3Bucket" }, "KeyPairName": { "Ref": "KeyPairName" }, "LicenseAgreementTerms": { "Ref": "LicenseAgreementTerms" }, "OperatorEmail": { "Ref": "OperatorEmail" } } } } }, "Outputs" : { "StackName": { "Value": { "Ref": "AWS::StackName" }, "Description": "Stack Name" }, "QSS3BucketName": { "Value": { "Ref": "QSS3BucketName" }, "Description": "Master Template Bucket Name" }, "QSS3KeyPrefix":{ "Value": { "Ref": "QSS3KeyPrefix" }, "Description": "Master Template Path" }, "Version": { "Value": "v1.3", "Description": "Template version" }, "SpectrumScaleVersion":{ "Value": "4.2.3.7", "Description": "Spectrum Scale version included with this release" }, "SpectrumS3Bucket": { "Value": { "Fn::GetAtt": [ "ClusterStack", "Outputs.SpectrumS3Bucket" ] }, "Description": "Spectrum Scale S3 bucket name" } } }