321 lines
9.5 KiB
YAML
Raw Permalink Normal View History

2019-10-23 01:03:54 -04:00
AWSTemplateFormatVersion: '2010-09-09'
Description: Nakama ECS Service
Parameters:
#------------------------
# Deployment Information
#------------------------
environment:
Type: String
Description: Name of the environment to use in naming.
Default: production
release:
Type: String
Description: Name of the release name of the stack version to use.
Default: production
AllowedValues: ['develop', 'production']
ConstraintDescription: "Must be a possible release version."
2019-10-23 19:44:48 -04:00
VpcId:
2020-06-28 02:52:14 -04:00
Description: ID of the VPC to deploy resources.
2019-10-23 19:44:48 -04:00
Type: AWS::EC2::VPC::Id
2019-10-23 01:03:54 -04:00
#-------------------
# ECS Configuration
#-------------------
EcsClusterOverride:
2019-10-23 01:03:54 -04:00
Type: String
2020-06-28 02:52:14 -04:00
Description: The cluster to run the Nakama service on, if empty will create new cluster.
Default: ""
2019-10-23 01:03:54 -04:00
#-----------------
# Load Balancing
#-----------------
PublicSubnets:
Description: The public subnets for the ALB to run in. (Seperate by spaces)
2019-10-23 01:03:54 -04:00
Type: String
PortalCertificate:
2020-06-28 02:52:14 -04:00
Description: Arn of AWS Certificate in ACM
2019-10-23 01:03:54 -04:00
Type: String
#----------------------
# Nakama Configuration
#----------------------
2020-06-27 19:35:13 -04:00
NakamaContainer:
Type: String
Description: Container image for Nakama server
Default: "heroiclabs/nakama:2.7.0"
NakamaUsername:
Type: String
Description: Username to access the Nakama admin portal
Default: "admin"
NakamaPasswordOverride:
Type: String
Description: Override Nakama admin portal password. Leave blank for random password.
Default: ""
2020-06-28 02:52:14 -04:00
NoEcho: true
2019-10-23 19:44:48 -04:00
#------------------------
# Database Configuration
#------------------------
2019-10-23 19:44:48 -04:00
CreateDatabase:
Type: String
Default: "true"
2020-06-28 02:52:14 -04:00
Description: If
2019-10-23 19:44:48 -04:00
AllowedValues: ["true", "false"]
# Manual Database Configuration
2019-10-23 01:03:54 -04:00
DatabaseUsername:
Type: String
2020-06-28 02:52:14 -04:00
Description: Manual username of the Postgres server
2019-10-23 01:03:54 -04:00
Default: postgres
DatabasePassword:
Type: String
2020-06-28 02:52:14 -04:00
Description: Manual password for the Postgres server
2019-10-23 19:44:48 -04:00
Default: ""
2020-06-28 02:52:14 -04:00
NoEcho: true
2019-10-23 01:03:54 -04:00
DatabaseEndpoint:
Type: String
2020-06-28 02:52:14 -04:00
Description: Manual endpoint for the Postgres server
2019-10-23 19:44:48 -04:00
Default: ""
2019-10-23 01:03:54 -04:00
DatabasePort:
Type: Number
2020-06-28 02:52:14 -04:00
Description: Manual port for the Postgres server
2019-10-23 01:03:54 -04:00
Default: 5432
# Advanced RDS Configuration
RdsInstanceClass:
Type: String
Description: Instance class for the dabase to run on
Default: db.t2.micro
RdsEngine:
Type: String
Description: Database engine for the database to use
Default: postgres
2020-06-28 02:52:14 -04:00
AllowedValues: ["aurora-postgresql", "postgres"]
RdsUsername:
Type: String
Description: Master account's username for database
Default: postgres
RdsPort:
Type: Number
Description: Port for the database to open a socket on
Default: "5432"
RdsStorage:
Type: Number
Description: The amount of storage (in GB) allocated to the RDS instance
Default: "100"
RdsAccessCidr:
Type: String
Description: The CIDR used in the security group to secure the database
Default: "0.0.0.0/0"
2020-06-28 02:52:14 -04:00
#-----
# DNS
#-----
2019-11-10 20:02:43 -05:00
Domain:
Type: String
Description: The domain to create the endpoint on (Must have an existing hosted zone ex. `example.com`) Leave blank to skip DNS.
Default: ""
SubDomain:
Type: String
Description: The subdomain to be used by nakama. (ex. `nakama.example.com`)
Default: nakama
2019-10-23 19:44:48 -04:00
2020-06-28 02:52:14 -04:00
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: "Deployment Information"
Parameters:
- environment
- release
- VpcId
- PublicSubnets
- Label:
default: "DNS"
Parameters:
- Domain
- SubDomain
- Label:
default: "Nakama Configuration"
Parameters:
- NakamaContainer
- NakamaUsername
- NakamaPasswordOverride
- Label:
default: "Load Balancing"
Parameters:
- PortalCertificate
- Label:
default: "ECS Configuration"
Parameters:
- EcsClusterOverride
- Label:
default: "Database Configuration"
Parameters:
- CreateDatabase
- Label:
default: "Manual Database Configuration"
Parameters:
- DatabaseUsername
- DatabasePassword
- DatabaseEndpoint
- DatabasePort
- Label:
default: "RDS Configuration"
Parameters:
- RdsInstanceClass
- RdsEngine
- RdsUsername
- RdsPort
- RdsStorage
- RdsAccessCidr
ParameterLabels:
environment:
default: "Environment"
release:
default: "Release"
VpcId:
default: "Vpc Id"
EcsClusterOverride:
default: "Optional ECS Cluster Override"
PublicSubnets:
default: "Public Subnets"
PortalCertificate:
default: "Admin Portal ACM Certificate"
Domain:
default: "Route53 Domain"
NakamaContainer:
default: "Nakama Container Image"
NakamaUsername:
default: "Nakama Username"
NakamaPasswordOverride:
default: "Nakama Password Override"
CreateDatabase:
default: "Create RDS database?"
DatabaseUsername:
default: "Remote Database Username"
DatabasePassword:
default: "Remote Database Password"
DatabaseEndpoint:
default: "Remote Database Endpoint"
DatabasePort:
default: "Remote Database Port"
RdsInstanceClass:
default: "RDS Instance Class"
RdsEngine:
default: "RDS Engine"
RdsUsername:
default: "RDS Username"
RdsPort:
default: "RDS Port"
RdsStorage:
default: "RDS Storage"
RdsAccessCidr:
default: "RDS Allow Access CIDR"
2019-10-23 19:44:48 -04:00
Conditions:
CreateRdsStack: !Equals [!Ref CreateDatabase, "true"]
2019-11-10 20:02:43 -05:00
CreateDns: !Not [!Equals [!Ref Domain, ""]]
CreateCluster: !Equals [!Ref EcsClusterOverride, ""]
2019-10-23 19:44:48 -04:00
2019-10-23 01:03:54 -04:00
Resources:
2019-11-10 20:02:43 -05:00
#-----
# DNS
#-----
DnsRecords:
Condition: CreateDns
Type: AWS::CloudFormation::Stack
Properties:
2020-05-20 21:04:08 -04:00
TemplateURL: !Sub 'https://s3.us-east-1.amazonaws.com/sumu-stacks/nakama/${release}/cloudformation/nakama/dns.yaml'
2019-11-10 20:02:43 -05:00
Parameters:
environment: !Ref environment
Domain: !Ref Domain
SubDomain: !Ref SubDomain
2019-11-10 20:55:35 -05:00
NakamaDns: !GetAtt LoadBalancing.Outputs.PublicNlbDnsName
AdminDns: !GetAtt LoadBalancing.Outputs.PublicAlbDnsName
2019-11-10 20:02:43 -05:00
2019-10-23 19:44:48 -04:00
#----------
# Database
#----------
RdsDatabase:
Condition: CreateRdsStack
Type: AWS::CloudFormation::Stack
Properties:
2020-05-20 21:04:08 -04:00
TemplateURL: !Sub 'https://s3.us-east-1.amazonaws.com/sumu-stacks/nakama/${release}/cloudformation/nakama/rds.yaml'
2019-10-23 19:44:48 -04:00
Parameters:
environment: !Ref environment
VpcId: !Ref VpcId
InstanceClass: !Ref RdsInstanceClass
DatabaseEngine: !Ref RdsEngine
DatabaseUsername: !Ref RdsUsername
DatabasePort: !Ref RdsPort
DatabaseStorage: !Ref RdsStorage
DatabaseAccessCidr: !Ref RdsAccessCidr
2019-10-23 19:44:48 -04:00
2019-10-23 01:03:54 -04:00
#-----------------
# Load Balancing
#-----------------
2019-11-10 20:55:35 -05:00
LoadBalancing:
Type: AWS::CloudFormation::Stack
2019-10-23 01:03:54 -04:00
Properties:
2020-05-20 21:04:08 -04:00
TemplateURL: !Sub 'https://s3.us-east-1.amazonaws.com/sumu-stacks/nakama/${release}/cloudformation/nakama/load_balancing.yaml'
2019-11-10 20:55:35 -05:00
Parameters:
environment: !Ref environment
release: !Ref release
VpcId: !Ref VpcId
PublicSubnets: !Join [",", !Split [" ", !Ref PublicSubnets]]
2019-11-10 20:55:35 -05:00
PortalCertificate: !Ref PortalCertificate
2019-10-23 01:03:54 -04:00
#-------------
# ECS Cluster
#-------------
EcsCluster:
Condition: CreateCluster
Type: AWS::CloudFormation::Stack
Properties:
2020-05-20 21:04:08 -04:00
TemplateURL: !Sub 'https://s3.us-east-1.amazonaws.com/sumu-stacks/nakama/${release}/cloudformation/cluster/top.yaml'
Parameters:
Environment: !Ref environment
VpcId: !Ref VpcId
SubnetIds: !Join [",", !Split [" ", !Ref PublicSubnets]]
Project: "Nakama"
2019-10-23 01:03:54 -04:00
#-------------------
# ECS Task & Service
#-------------------
TaskDefinition:
Type: AWS::CloudFormation::Stack
Properties:
2020-05-20 21:04:08 -04:00
TemplateURL: !Sub 'https://s3.us-east-1.amazonaws.com/sumu-stacks/nakama/${release}/cloudformation/nakama/task.yaml'
2019-10-23 01:03:54 -04:00
Parameters:
2020-06-27 19:35:13 -04:00
NakamaContainer: !Ref NakamaContainer
2019-10-23 19:44:48 -04:00
DatabaseUsername: !If ["CreateRdsStack", !GetAtt RdsDatabase.Outputs.RdsUsername, !Ref DatabaseUsername]
DatabasePassword: !If ["CreateRdsStack", !Join ["", ["{{resolve:secretsmanager:", !GetAtt RdsDatabase.Outputs.RdsSecret, ":SecretString}}" ]], !Ref DatabasePassword]
DatabaseEndpoint: !If ["CreateRdsStack", !GetAtt RdsDatabase.Outputs.RdsEnpoint, !Ref DatabaseEndpoint]
DatabasePort: !If ["CreateRdsStack", !GetAtt RdsDatabase.Outputs.RdsPort, !Ref DatabasePort]
NakamaUsername: !Ref NakamaUsername
NakamaPasswordOverride: !Ref NakamaPasswordOverride
2019-10-23 01:03:54 -04:00
EcsService:
2019-11-10 20:55:35 -05:00
DependsOn: LoadBalancing
2019-10-23 01:03:54 -04:00
Type: AWS::ECS::Service
Properties:
Cluster: !If ["CreateCluster", !GetAtt EcsCluster.Outputs.Cluster, !Ref EcsClusterOverride]
2019-10-23 01:03:54 -04:00
DesiredCount: 1
TaskDefinition: !GetAtt TaskDefinition.Outputs.TaskArn
LoadBalancers:
- ContainerName: "nakama"
ContainerPort: 7351
2019-11-10 20:55:35 -05:00
TargetGroupArn: !GetAtt LoadBalancing.Outputs.AdminPortalTargetGroup
- ContainerName: "nakama"
ContainerPort: 7350
2019-11-10 20:55:35 -05:00
TargetGroupArn: !GetAtt LoadBalancing.Outputs.HttpApiTargetGroup
- ContainerName: "nakama"
ContainerPort: 7349
2019-11-10 20:55:35 -05:00
TargetGroupArn: !GetAtt LoadBalancing.Outputs.GRpcApiTargetGroup
- ContainerName: "nakama"
ContainerPort: 7348
2019-11-10 20:55:35 -05:00
TargetGroupArn: !GetAtt LoadBalancing.Outputs.GRpcEApiTargetGroup