integ/lib/worker-struct.ts (80 lines of code) (raw):
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
import { Stack } from 'aws-cdk-lib';
import { IMachineImage, MachineImage, Port, Vpc } from 'aws-cdk-lib/aws-ec2';
import {
RetentionDays,
} from 'aws-cdk-lib/aws-logs';
import { X509CertificatePem } from 'aws-rfdk';
import {
RenderQueue,
WorkerInstanceFleet,
} from 'aws-rfdk/deadline';
import { Construct } from 'constructs';
import { NetworkTier } from '../components/_infrastructure/lib/network-tier';
import { RenderStruct } from './render-struct';
export interface WorkerStructProps {
readonly integStackTag: string;
readonly renderStruct: RenderStruct;
readonly os: string;
}
export class WorkerStruct extends Construct {
readonly workerFleet: WorkerInstanceFleet[] = [];
readonly renderQueue: RenderQueue;
readonly cert?: X509CertificatePem;
constructor(scope: Construct, id: string, props: WorkerStructProps) {
super(scope, id);
// Collect environment variables
const infrastructureStackName = 'RFDKIntegInfrastructure' + props.integStackTag;
const linuxAmi = process.env.LINUX_DEADLINE_AMI_ID!.toString();
const windowsAmi = process.env.WINDOWS_DEADLINE_AMI_ID!.toString();
let workerMachineImage: IMachineImage;
// Retrieve VPC created for _infrastructure stack
const vpc = Vpc.fromLookup(this, 'Vpc', { tags: { StackName: infrastructureStackName }}) as Vpc;
this.renderQueue = props.renderStruct.renderQueue;
this.cert = props.renderStruct.cert;
if( props.os === 'Windows' ) {
const deadlineClientWindowsAmiMap: Record<string, string> = {[Stack.of(this).region]: windowsAmi};
workerMachineImage = MachineImage.genericWindows(deadlineClientWindowsAmiMap);
}
else {
const deadlineClientLinuxAmiMap: Record<string, string> = {[Stack.of(this).region]: linuxAmi};
workerMachineImage = MachineImage.genericLinux(deadlineClientLinuxAmiMap);
}
const workerSubnets = vpc.selectSubnets({ subnetGroupName: NetworkTier.subnetConfig.workerInstanceFleet.name });
this.workerFleet.push(
new WorkerInstanceFleet(this, 'Worker1', {
vpc,
vpcSubnets: workerSubnets,
renderQueue: this.renderQueue,
workerMachineImage,
logGroupProps: {
logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`,
retention: RetentionDays.TWO_MONTHS,
},
groups: ['testgroup'],
}),
new WorkerInstanceFleet(this, 'Worker2', {
vpc,
vpcSubnets: workerSubnets,
renderQueue: this.renderQueue,
workerMachineImage,
logGroupProps: {
logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`,
retention: RetentionDays.TWO_MONTHS,
},
pools: ['testpool'],
}),
new WorkerInstanceFleet(this, 'Worker3', {
vpc,
vpcSubnets: workerSubnets,
renderQueue: this.renderQueue,
workerMachineImage,
logGroupProps: {
logGroupPrefix: `/${Stack.of(this).stackName}-${id}/`,
retention: RetentionDays.TWO_MONTHS,
},
region: 'testregion',
}),
);
this.workerFleet.forEach( worker => {
worker.connections.allowFromAnyIpv4(Port.tcp(22));
});
}
}