in lib/constructs/workstation.ts [21:121]
constructor(scope: cdk.Construct, id: string, props: WorkstationProps) {
super(scope, id);
// for launching from Jenkins
const workstationRole = new iam.Role(this, "WorkstationRole", {
assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
});
workstationRole.attachInlinePolicy(
createSSMPolicy(this, props.ssmLogBucket)
);
workstationRole.attachInlinePolicy(
new iam.Policy(this, "for-nice-policy", {
statements: [
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: RegionInfo.regions.map(
(i) => `arn:aws:s3:::dcv-license.${i.name}/*`
),
actions: ["s3:GetObject"],
}),
],
})
);
workstationRole.attachInlinePolicy(
new iam.Policy(this, "for-gpu-policy", {
statements: [
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: [
"arn:aws:s3:::nvidia-gaming/*",
"arn:aws:s3:::nvidia-gaming",
"arn:aws:s3:::ec2-windows-nvidia-drivers/*",
"arn:aws:s3:::ec2-windows-nvidia-drivers",
],
actions: ["s3:Get*", "s3:List*"],
}),
],
})
);
workstationRole.addManagedPolicy(
iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore")
);
workstationRole.addManagedPolicy(
iam.ManagedPolicy.fromAwsManagedPolicyName(
"AmazonSSMDirectoryServiceAccess"
)
);
props.resourceBucket.grantRead(workstationRole);
const workstationSG = new ec2.SecurityGroup(this, "WorkstationSG", {
vpc: props.vpc,
securityGroupName: "WorkstationSG",
});
props.allowAccessFrom.forEach((p) => {
workstationSG.addIngressRule(p, ec2.Port.tcp(3389), "allow RDP access");
workstationSG.addIngressRule(
p,
ec2.Port.tcp(8443),
"allow NICE DCV access"
);
workstationSG.addIngressRule(
p,
ec2.Port.udp(8443),
"allow NICE DCV QUIC access"
);
});
const userData = ec2.UserData.custom(`
<powershell>
${setupFirefoxPowershell()}
${this.setupNiceDCV("Administrator")} // for default session
${this.downloadGPUDriver()}
</powershell>
`);
const workstationTemplate = new ec2.LaunchTemplate(this, "workstation-template", {
launchTemplateName: "workstation-template",
instanceType: props.instanceType,
machineImage: ec2.MachineImage.latestWindows(
ec2.WindowsVersion.WINDOWS_SERVER_2019_JAPANESE_FULL_BASE
),
userData,
role: workstationRole,
blockDevices: [
{
deviceName: "/dev/sda1",
volume: {
ebsDevice: {
volumeSize: 500,
volumeType: ec2.EbsDeviceVolumeType.GP3,
}
},
},
],
securityGroup: workstationSG,
});
cdk.Tags.of(workstationTemplate).add("Name", "NICE DCV");
cdk.Tags.of(workstationTemplate).add("Feature", "Join-AD");
cdk.Tags.of(workstationTemplate).add("NICE DCV AD User", "");
}