# SPDX-FileCopyrightText: 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # SPDX-License-Identifier: MIT-0 License Description: "(SO8015) - Contruct full functional live video and VOD platform with cloud native services in AWS. Version v1.0.0" Parameters: UserName: Type: String Description: Console user name. UserPassword: Type: String Description: Console user password. Strict password policy is recommended. NoEcho: True InstallDemoConsole: Type: String Default: False Description: Install Web Console For Live Video Demostration, fill in 'True' (case sensitive) to install. CNAME: Type: String Default: www.example.cn Description: Alternate Domain Names for CloudFront Version: Type: String Default: v1.0.0 Description: Solution template version, check https://www.amazonaws.cn/en/solutions/ for latest version AvailabilityZones: Description: 'List of Availability Zones to use for the subnets in the VPC. Note: The logical order is preserved.' Type: List VpcCIDR: Type: String Default: 192.168.0.0/16 Description: Please enter the IP range (CIDR notation) for this VPC AllowedPattern: "(?:^$|(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2}))" ConstraintDescription: "must be a valid IP CIDR range of the form x.x.x.x/x." MinLength: 9 MaxLength: 18 PublicSubnet1CIDR: Type: String Default: 192.168.10.0/24 Description: Please enter the IP range (CIDR notation) for the public subnet in the first Availability Zone AllowedPattern: "(?:^$|(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2}))" ConstraintDescription: "must be a valid IP CIDR range of the form x.x.x.x/x." MinLength: 9 MaxLength: 18 PublicSubnet2CIDR: Type: String Default: 192.168.11.0/24 Description: Please enter the IP range (CIDR notation) for the public subnet in the second Availability Zone AllowedPattern: "(?:^$|(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2}))" ConstraintDescription: "must be a valid IP CIDR range of the form x.x.x.x/x." PrivateSubnet1CIDR: Type: String Default: 192.168.20.0/24 Description: Please enter the IP range (CIDR notation) for the private subnet in the first Availability Zone AllowedPattern: "(?:^$|(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2}))" ConstraintDescription: "must be a valid IP CIDR range of the form x.x.x.x/x." PrivateSubnet2CIDR: Type: String Default: 192.168.21.0/24 Description: Please enter the IP range (CIDR notation) for the private subnet in the second Availability Zone AllowedPattern: "(?:^$|(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2}))" ConstraintDescription: "must be a valid IP CIDR range of the form x.x.x.x/x." TemplateRegion: AllowedPattern: ^[0-9a-zA-Z]+([0-9a-zA-Z-]*[0-9a-zA-Z])*$ ConstraintDescription: Region include numbers, lowercase letters, uppercase letters, and hyphens (-). It cannot start or end with a hyphen (-). Default: cn-north-1 Description: Region for the assets. This string can include numbers, lowercase letters, uppercase letters, and hyphens (-). It cannot start or end with a hyphen (-). Type: String TemplateS3BucketName: AllowedPattern: ^[0-9a-zA-Z]+([0-9a-zA-Z-]*[0-9a-zA-Z])*$ ConstraintDescription: Bucket name can include numbers, lowercase letters, uppercase letters, and hyphens (-). It cannot start or end with a hyphen (-). Default: aws-gcr-solutions Description: S3 bucket name for the assets. This string can include numbers, lowercase letters, uppercase letters, and hyphens (-). It cannot start or end with a hyphen (-). Type: String Conditions: InstallDemoConsoleCondition: !Equals - !Ref InstallDemoConsole - 'True' Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Label: default: "Account Configuration, set account info" Parameters: - UserName - UserPassword - CNAME - Label: default: "Network Configuration, create new VPC for AWS ECS Fargate" Parameters: - AvailabilityZones - VpcCIDR - PublicSubnet1CIDR - PublicSubnet2CIDR - PrivateSubnet1CIDR - PrivateSubnet2CIDR ParameterLabels: UserName: default: "Initial Console User Name" UserPassword: default: "Initial Console User Password" CNAME: default: "Initial Alias for CloudFront" AvailabilityZones: default: "Availability Zones" VpcCIDR: default: "AWS ECS Fargate VPC CIDR Block" PublicSubnet1CIDR: default: "Public Subnet for the first Availability Zone" PublicSubnet2CIDR: default: "Public Subnet for the second Availability Zone" PrivateSubnet1CIDR: default: "Private Subnet for the first Availability Zone" PrivateSubnet2CIDR: default: "Private Subnet for the second Availability Zone" Resources: Vpc: Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/aws-vpc.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Parameters: AvailabilityZones: !Join - ',' - !Ref 'AvailabilityZones' PublicSubnet1CIDR: !Ref 'PublicSubnet1CIDR' PublicSubnet2CIDR: !Ref 'PublicSubnet2CIDR' PrivateSubnet1ACIDR: !Ref 'PrivateSubnet1CIDR' PrivateSubnet2ACIDR: !Ref 'PrivateSubnet2CIDR' VPCCIDR: !Ref VpcCIDR NumberOfAZs: 2 VideoMetadata: Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/metadata.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Parameters: CodeBucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Version: !Ref Version Assets: Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/assets.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' DynamoDB: Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/dynamodb.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' SecurityGroup: DependsOn: Vpc Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/security-group.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Parameters: VpcID: Fn::GetAtt: [Vpc, Outputs.VPCID] EFS: DependsOn: SecurityGroup Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/efs.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Parameters: PublicSubnet1ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet1ID] PublicSubnet2ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet2ID] VpcID: Fn::GetAtt: [Vpc, Outputs.VPCID] Redis: DependsOn: SecurityGroup Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/redis.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Parameters: PublicSubnet1ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet1ID] PublicSubnet2ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet2ID] VpcID: Fn::GetAtt: [Vpc, Outputs.VPCID] ECS: Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/ecs.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Proxy: DependsOn: - SecurityGroup - ECS Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/proxy.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Parameters: PublicSubnet1ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet1ID] PublicSubnet2ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet2ID] VpcID: Fn::GetAtt: [Vpc, Outputs.VPCID] TemplateRegion: !Ref TemplateRegion MediaServer: DependsOn: - Assets - ECS - Redis Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/media-server.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Parameters: PublicSubnet1ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet1ID] PublicSubnet2ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet2ID] VpcID: Fn::GetAtt: [Vpc, Outputs.VPCID] TemplateRegion: !Ref TemplateRegion MediaProcessor: DependsOn: - EFS - ECS - Redis - Assets Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/media-processor.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Parameters: PublicSubnet1ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet1ID] PublicSubnet2ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet2ID] VpcID: Fn::GetAtt: [Vpc, Outputs.VPCID] TemplateRegion: !Ref TemplateRegion Origin: DependsOn: - ECS - Redis Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/origin.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Parameters: PublicSubnet1ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet1ID] PublicSubnet2ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet2ID] VpcID: Fn::GetAtt: [Vpc, Outputs.VPCID] CNAME: !Ref CNAME TemplateRegion: !Ref TemplateRegion Web: Condition: InstallDemoConsoleCondition DependsOn: - SecurityGroup - ECS - Origin Type: 'AWS::CloudFormation::Stack' Properties: TemplateURL: !Sub - 'https://${S3Bucket}.s3.${AWS::Region}.${AWS::URLSuffix}/serverless-video-streaming/${Version}/web.template' - S3Bucket: !Sub '${TemplateS3BucketName}-${AWS::Region}' Parameters: PublicSubnet1ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet1ID] PublicSubnet2ID: Fn::GetAtt: [Vpc, Outputs.PublicSubnet2ID] VpcID: Fn::GetAtt: [Vpc, Outputs.VPCID] TemplateRegion: !Ref TemplateRegion ## live video & VOD platform console url Outputs: LiveVideoPushStreamURL: Description: Live Video Push Stream URL Value: !GetAtt [MediaServer, Outputs.ServerLoadBalancerURL] LiveVideoPullStreamURL: Description: Live Video Pull Stream URL Value: !GetAtt [Origin, Outputs.CloudFrontDomain] LiveVideoPullStreamAlias: Description: Live Video Pull Stream URL Alias Value: !GetAtt [Origin, Outputs.OriginLoadBalancerAlias] LiveVideoConsoleURL: Condition: InstallDemoConsoleCondition Description: Live Video Management Console Address Value: !GetAtt [Web, Outputs.WebLoadBalancerURL]