You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
7.0 KiB
Python
159 lines
7.0 KiB
Python
"""
|
|
Copyright (c) Contributors to the Open 3D Engine Project.
|
|
For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
|
|
SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
"""
|
|
|
|
from aws_cdk import (
|
|
core,
|
|
aws_gamelift as gamelift
|
|
)
|
|
|
|
from .flexmatch import matchmaking
|
|
from .game_session_queue import game_session_queue
|
|
|
|
|
|
class GameLiftStack(core.Stack):
|
|
"""
|
|
The AWS GameLift stack
|
|
|
|
Defines GameLift resources to use in project
|
|
"""
|
|
def __init__(self, scope: core.Construct, id_: str,
|
|
stack_name: str, fleet_configurations: dict,
|
|
create_game_session_queue: bool,
|
|
flex_match: bool,
|
|
**kwargs) -> None:
|
|
super().__init__(scope, id_, **kwargs)
|
|
|
|
self._stack_name = stack_name
|
|
|
|
fleet_ids = []
|
|
queue_destinations = []
|
|
for index in range(len(fleet_configurations)):
|
|
fleet_configuration = fleet_configurations[index]
|
|
# Create a new GameLift fleet using the configuration
|
|
fleet_ids.append(self._create_fleet(fleet_configuration, index).attr_fleet_id)
|
|
destination_arn = core.Fn.sub(
|
|
body='arn:${AWS::Partition}:gamelift:${AWS::Region}::fleet/${FleetId}',
|
|
variables={
|
|
'FleetId': fleet_ids[index],
|
|
}
|
|
)
|
|
|
|
if fleet_configuration.get('alias_configuration'):
|
|
# Create an alias for the fleet if the alias configuration is provided
|
|
alias = self._create_alias(fleet_configuration['alias_configuration'], fleet_ids[index])
|
|
destination_arn = core.Fn.sub(
|
|
body='arn:${AWS::Partition}:gamelift:${AWS::Region}::alias/${AliasId}',
|
|
variables={
|
|
'AliasId': alias.attr_alias_id,
|
|
}
|
|
)
|
|
|
|
queue_destinations.append(destination_arn)
|
|
|
|
# Export the GameLift fleet ids as a stack output
|
|
core.CfnOutput(
|
|
self,
|
|
id='GameLiftFleets',
|
|
description='List of GameLift fleet ids',
|
|
export_name=f'{self._stack_name}:GameLiftFleets',
|
|
value=','.join(fleet_ids)
|
|
)
|
|
|
|
game_session_queue_arns = []
|
|
if flex_match or create_game_session_queue:
|
|
queue = game_session_queue.GameSessionQueueResources(self, queue_destinations)
|
|
game_session_queue_arns.append(queue.game_session_queue_arn)
|
|
|
|
if flex_match:
|
|
matchmaking.MatchmakingResoures(self, game_session_queue_arns)
|
|
|
|
def _create_fleet(self, fleet_configuration: dict, identifier: int) -> gamelift.CfnFleet:
|
|
"""
|
|
Create an Amazon GameLift fleet to host game servers.
|
|
:param fleet_configuration: Configuration of the fleet.
|
|
:param identifier: Unique identifier of the fleet which will be included in the resource id.
|
|
:return: Generated GameLift fleet.
|
|
"""
|
|
fleet = gamelift.CfnFleet(
|
|
self,
|
|
id=f'{self._stack_name}-GameLiftFleet{identifier}',
|
|
build_id=self._get_gamelift_build_id(fleet_configuration.get('build_configuration', {}), identifier),
|
|
certificate_configuration=gamelift.CfnFleet.CertificateConfigurationProperty(
|
|
certificate_type=fleet_configuration['certificate_configuration'].get('certificate_type')
|
|
) if fleet_configuration.get('certificate_configuration') else None,
|
|
description=fleet_configuration.get('description'),
|
|
ec2_inbound_permissions=[
|
|
gamelift.CfnFleet.IpPermissionProperty(
|
|
**inbound_permission
|
|
) for inbound_permission in fleet_configuration.get('ec2_inbound_permissions', [])
|
|
],
|
|
ec2_instance_type=fleet_configuration.get('ec2_instance_type'),
|
|
fleet_type=fleet_configuration.get('fleet_type'),
|
|
name=f'{self._stack_name}-GameLiftFleet{identifier}',
|
|
new_game_session_protection_policy=fleet_configuration.get('new_game_session_protection_policy'),
|
|
resource_creation_limit_policy=gamelift.CfnFleet.ResourceCreationLimitPolicyProperty(
|
|
**fleet_configuration['resource_creation_limit_policy']
|
|
) if fleet_configuration.get('resource_creation_limit_policy') else None,
|
|
runtime_configuration=gamelift.CfnFleet.RuntimeConfigurationProperty(
|
|
game_session_activation_timeout_seconds=fleet_configuration['runtime_configuration'].get(
|
|
'game_session_activation_timeout_seconds'),
|
|
max_concurrent_game_session_activations=fleet_configuration['runtime_configuration'].get(
|
|
'max_concurrent_game_session_activations'),
|
|
server_processes=[
|
|
gamelift.CfnFleet.ServerProcessProperty(
|
|
**server_process
|
|
) for server_process in fleet_configuration['runtime_configuration'].get('server_processes', [])
|
|
]
|
|
) if fleet_configuration.get('runtime_configuration') else None,
|
|
)
|
|
|
|
return fleet
|
|
|
|
def _get_gamelift_build_id(self, build_configuration: dict, identifier: int) -> str:
|
|
"""
|
|
Create a GameLift build using the storage location if the build doesn't exist and return the build id.
|
|
:param build_configuration: Configuration of the GameLift build.
|
|
:param identifier: Unique identifier of the build which will be included in the resource id.
|
|
:return: Build id.
|
|
"""
|
|
if build_configuration.get('build_id'):
|
|
# GameLift build already exists
|
|
return build_configuration['build_id']
|
|
elif build_configuration.get('storage_location'):
|
|
# Create the GameLift build using the storage location information.
|
|
build = gamelift.CfnBuild(
|
|
self,
|
|
id=f'{self._stack_name}-GameLiftBuild{identifier}',
|
|
name=f'{self._stack_name}-GameLiftBuild{identifier}',
|
|
operating_system=build_configuration.get('operating_system'),
|
|
storage_location=gamelift.CfnBuild.S3LocationProperty(
|
|
**build_configuration['storage_location']
|
|
)
|
|
)
|
|
return build.ref
|
|
|
|
return ''
|
|
|
|
def _create_alias(self, alias_configuration: dict, fleet_id: str) -> gamelift.CfnAlias:
|
|
"""
|
|
Create an alias for an Amazon GameLift fleet destination.
|
|
:param alias_configuration: Configuration of the alias
|
|
:param fleet_id: Fleet id that the alias points to.
|
|
:return: Generated GameLift fleet alias.
|
|
"""
|
|
alias = gamelift.CfnAlias(
|
|
self,
|
|
id=f'{self._stack_name}-GameLiftAlias',
|
|
name=alias_configuration.get('name'),
|
|
routing_strategy=gamelift.CfnAlias.RoutingStrategyProperty(
|
|
**alias_configuration.get('routing_strategy', {}),
|
|
fleet_id=fleet_id
|
|
)
|
|
)
|
|
|
|
return alias
|