def main(): # ------------------------------ # Validate Config Values # ------------------------------ if 'region' in config.deadline_client_linux_ami_map: raise ValueError('Deadline Client Linux AMI map is required but was not specified.') # ------------------------------ # Application # ------------------------------ app = App() if 'CDK_DEPLOY_ACCOUNT' not in os.environ and 'CDK_DEFAULT_ACCOUNT' not in os.environ: raise ValueError('You must define either CDK_DEPLOY_ACCOUNT or CDK_DEFAULT_ACCOUNT in the environment.') if 'CDK_DEPLOY_REGION' not in os.environ and 'CDK_DEFAULT_REGION' not in os.environ: raise ValueError('You must define either CDK_DEPLOY_REGION or CDK_DEFAULT_REGION in the environment.') env = Environment( account=os.environ.get('CDK_DEPLOY_ACCOUNT', os.environ.get('CDK_DEFAULT_ACCOUNT')), region=os.environ.get('CDK_DEPLOY_REGION', os.environ.get('CDK_DEFAULT_REGION')) ) sep_props = sep_stack.SEPStackProps( docker_recipes_stage_path=os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir, 'stage'), worker_machine_image=MachineImage.generic_linux(config.deadline_client_linux_ami_map), create_resource_tracker_role=config.create_resource_tracker_role, ) service = sep_stack.SEPStack(app, 'SEPStack', props=sep_props, env=env) app.synth()
def __init__(self, scope: Construct, stack_id: str, *, props: ComputeStackProps, **kwargs): super().__init__(scope, stack_id, **kwargs) region = Stack.of(self).region version = VersionQuery(self, 'Version', version=props.deadline_version) # Take a Linux image and install Deadline on it to create a new image linux_image = DeadlineMachineImage( self, "LinuxImage", props=ImageBuilderProps( # We use the linux full version string here as there is no Windows equivalent available on the # VersionQuery right now, since it is only exposing Linux installers. deadline_version=version.linux_full_version_string(), parent_ami=MachineImage.latest_amazon_linux(), image_version=props.image_recipe_version)) # Set up a worker fleet that uses the image we just created worker_fleet_linux = WorkerInstanceFleet( self, "WorkerFleetLinux", vpc=props.vpc, render_queue=props.render_queue, worker_machine_image=MachineImage.generic_linux( {region: linux_image.ami_id})) worker_fleet_linux.fleet.node.default_child.node.add_dependency( linux_image.node.default_child) # Take a Windows image and install Deadline on it to create a new image windows_image = DeadlineMachineImage( self, "WindowsImage", props=ImageBuilderProps( deadline_version=version.linux_full_version_string(), parent_ami=MachineImage.latest_windows( WindowsVersion.WINDOWS_SERVER_2019_ENGLISH_CORE_BASE), image_version=props.image_recipe_version)) # Set up a worker fleet that uses the image we just created worker_fleet_windows = WorkerInstanceFleet( self, "WorkerFleetWindows", vpc=props.vpc, render_queue=props.render_queue, worker_machine_image=MachineImage.generic_windows( {region: windows_image.ami_id})) worker_fleet_windows.fleet.node.default_child.node.add_dependency( windows_image.node.default_child)
def main(): # ------------------------------ # Validate Config Values # ------------------------------ if not config.ubl_certificate_secret_arn and config.ubl_licenses: raise ValueError( 'UBL certificates secret ARN is required when using UBL but was not specified.' ) if not config.ubl_licenses: print('No UBL licenses specified. UBL Licensing will not be set up.') if not config.key_pair_name: print( 'EC2 key pair name not specified. You will not have SSH access to the render farm.' ) if 'region' in config.deadline_client_linux_ami_map: raise ValueError( 'Deadline Client Linux AMI map is required but was not specified.') # ------------------------------ # Application # ------------------------------ app = App() if 'CDK_DEPLOY_ACCOUNT' not in os.environ and 'CDK_DEFAULT_ACCOUNT' not in os.environ: raise ValueError( 'You must define either CDK_DEPLOY_ACCOUNT or CDK_DEFAULT_ACCOUNT in the environment.' ) if 'CDK_DEPLOY_REGION' not in os.environ and 'CDK_DEFAULT_REGION' not in os.environ: raise ValueError( 'You must define either CDK_DEPLOY_REGION or CDK_DEFAULT_REGION in the environment.' ) env = Environment( account=os.environ.get('CDK_DEPLOY_ACCOUNT', os.environ.get('CDK_DEFAULT_ACCOUNT')), region=os.environ.get('CDK_DEPLOY_REGION', os.environ.get('CDK_DEFAULT_REGION'))) # ------------------------------ # Network Tier # ------------------------------ network = network_tier.NetworkTier(app, 'NetworkTier', env=env) # ------------------------------ # Security Tier # ------------------------------ security = security_tier.SecurityTier(app, 'SecurityTier', env=env) # ------------------------------ # Storage Tier # ------------------------------ if config.deploy_mongo_db: storage_props = storage_tier.StorageTierMongoDBProps( vpc=network.vpc, database_instance_type=InstanceType.of(InstanceClass.MEMORY5, InstanceSize.LARGE), root_ca=security.root_ca, dns_zone=network.dns_zone, accept_sspl_license=config.accept_sspl_license, key_pair_name=config.key_pair_name) storage = storage_tier.StorageTierMongoDB(app, 'StorageTier', props=storage_props, env=env) else: storage_props = storage_tier.StorageTierDocDBProps( vpc=network.vpc, database_instance_type=InstanceType.of(InstanceClass.MEMORY5, InstanceSize.LARGE), ) storage = storage_tier.StorageTierDocDB(app, 'StorageTier', props=storage_props, env=env) # ------------------------------ # Service Tier # ------------------------------ service_props = service_tier.ServiceTierProps( database=storage.database, file_system=storage.file_system, vpc=network.vpc, docker_recipes_stage_path=os.path.join( os.path.dirname(os.path.realpath(__file__)), os.pardir, 'stage'), ubl_certs_secret_arn=config.ubl_certificate_secret_arn, ubl_licenses=config.ubl_licenses, root_ca=security.root_ca, dns_zone=network.dns_zone) service = service_tier.ServiceTier(app, 'ServiceTier', props=service_props, env=env) # ------------------------------ # Compute Tier # ------------------------------ deadline_client_image = MachineImage.generic_linux( config.deadline_client_linux_ami_map) compute_props = compute_tier.ComputeTierProps( vpc=network.vpc, render_queue=service.render_queue, worker_machine_image=deadline_client_image, key_pair_name=config.key_pair_name, usage_based_licensing=service.ubl_licensing, licenses=config.ubl_licenses) _compute = compute_tier.ComputeTier(app, 'ComputeTier', props=compute_props, env=env) app.synth()
def main(): # ------------------------------ # Validate Config Values # ------------------------------ if not config.config.key_pair_name: print( 'EC2 key pair name not specified. You will not have SSH access to the render farm.' ) # ------------------------------ # Application # ------------------------------ app = App() if 'CDK_DEPLOY_ACCOUNT' not in os.environ and 'CDK_DEFAULT_ACCOUNT' not in os.environ: raise ValueError( 'You must define either CDK_DEPLOY_ACCOUNT or CDK_DEFAULT_ACCOUNT in the environment.' ) if 'CDK_DEPLOY_REGION' not in os.environ and 'CDK_DEFAULT_REGION' not in os.environ: raise ValueError( 'You must define either CDK_DEPLOY_REGION or CDK_DEFAULT_REGION in the environment.' ) env = Environment( account=os.environ.get('CDK_DEPLOY_ACCOUNT', os.environ.get('CDK_DEFAULT_ACCOUNT')), region=os.environ.get('CDK_DEPLOY_REGION', os.environ.get('CDK_DEFAULT_REGION'))) # ------------------------------ # Network Tier # ------------------------------ network = network_tier.NetworkTier(app, 'NetworkTier', env=env) # ------------------------------ # Security Tier # ------------------------------ security = security_tier.SecurityTier(app, 'SecurityTier', env=env) # ------------------------------ # Service Tier # ------------------------------ service_props = service_tier.ServiceTierProps( vpc=network.vpc, availability_zones=config.config.availability_zones_standard, root_ca=security.root_ca, dns_zone=network.dns_zone, deadline_version=config.config.deadline_version, accept_aws_thinkbox_eula=config.config.accept_aws_thinkbox_eula) service = service_tier.ServiceTier(app, 'ServiceTier', props=service_props, env=env) # ------------------------------ # Compute Tier # ------------------------------ deadline_client_image = MachineImage.generic_linux( config.config.deadline_client_linux_ami_map) compute_props = compute_tier.ComputeTierProps( vpc=network.vpc, availability_zones=config.config.availability_zones_local, render_queue=service.render_queue, worker_machine_image=deadline_client_image, key_pair_name=config.config.key_pair_name, ) _compute = compute_tier.ComputeTier(app, 'ComputeTier', props=compute_props, env=env) app.synth()
def __init__(self, scope: cdk.Construct, construct_id: str, config, vpc: IVpc, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) self.neo4j_user_secret = Secret(self,'secretsmanager-secret-neo4j-user', secret_name=NEO4J_USER_SECRET_NAME ) neo4j_server_instance_role = Role(self,'iam-role-neo4j-server-instance', assumed_by=ServicePrincipal('ec2.amazonaws.com'), managed_policies=[ ManagedPolicy.from_aws_managed_policy_name('AmazonSSMManagedInstanceCore'), # Use SSM Session Manager rather than straight ssh ManagedPolicy.from_aws_managed_policy_name('CloudWatchAgentServerPolicy') ], inline_policies={ "work-with-tags": PolicyDocument( statements=[ PolicyStatement( actions=[ 'ec2:CreateTags', 'ec2:Describe*', 'elasticloadbalancing:Describe*', 'cloudwatch:ListMetrics', 'cloudwatch:GetMetricStatistics', 'cloudwatch:Describe*', 'autoscaling:Describe*', ], resources=["*"] ) ] ), "access-neo4j-user-secret": PolicyDocument( statements=[ PolicyStatement( actions=['secretsmanager:GetSecretValue'], resources=[self.neo4j_user_secret.secret_arn] ) ] ) } ) instance_security_group = SecurityGroup(self, "ec2-sg-neo4j-server-instance", description="Altimeter Neo4j Server Instance", vpc=vpc ) instance_security_group.add_ingress_rule(Peer.ipv4("0.0.0.0/0"), Port.tcp(7687), 'Bolt from ANYWHERE') # TESTING # instance_security_group.add_ingress_rule(Peer.ipv4("0.0.0.0/0"), Port.tcp(7473), 'Bolt from ANYWHERE') # TESTING # Prepare userdata script with open("./resources/neo4j-server-instance-userdata.sh", "r") as f: userdata_content = f.read() userdata_content = userdata_content.replace("[[NEO4J_USER_SECRET_NAME]]",NEO4J_USER_SECRET_NAME) user_data = UserData.for_linux() user_data.add_commands(userdata_content) instance_type = InstanceType.of(InstanceClass.BURSTABLE2, InstanceSize.MEDIUM) self.instance = Instance(self, 'ec2-instance-neo4j-server-instance', instance_name="instance-altimeter--neo4j-community-standalone-server", machine_image=MachineImage.generic_linux( ami_map={ "eu-west-1": "ami-00c8631d384ad7c53" } ), instance_type=instance_type, role=neo4j_server_instance_role, vpc=vpc, # vpc_subnets=SubnetSelection(subnets=vpc.select_subnets(subnet_group_name='Private').subnets), vpc_subnets=SubnetSelection(subnets=vpc.select_subnets(subnet_group_name='Public').subnets), security_group=instance_security_group, user_data=user_data, block_devices=[ BlockDevice( device_name="/dev/sda1", volume=BlockDeviceVolume.ebs( volume_size=10, volume_type=EbsDeviceVolumeType.GP2, encrypted=True, # Just encrypt delete_on_termination=True ) ), BlockDevice( device_name="/dev/sdb", volume=BlockDeviceVolume.ebs( volume_size=20, # TODO: Check size requirements volume_type=EbsDeviceVolumeType.GP2, encrypted=True, delete_on_termination=True # ASSUMPTION: NO 'primary' data, only altimeter results. ) ) ] ) cdk.Tags.of(self.instance).add("neo4j_mode", "SINGLE") cdk.Tags.of(self.instance).add("dbms_mode", "SINGLE")