diff --git a/packages/@aws-cdk/aws-gamelift-alpha/README.md b/packages/@aws-cdk/aws-gamelift-alpha/README.md index d985059155bf3..64aa5ae057532 100644 --- a/packages/@aws-cdk/aws-gamelift-alpha/README.md +++ b/packages/@aws-cdk/aws-gamelift-alpha/README.md @@ -187,6 +187,18 @@ new CfnOutput(this, 'BuildArn', { value: build.buildArn }); new CfnOutput(this, 'BuildId', { value: build.buildId }); ``` +To specify a server SDK version you used when integrating your game server build with Amazon GameLift use the `serverSdkVersion` parameter: + +> See [Integrate games with custom game servers](https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-custom-intro.html) for more details. + +```ts +declare const bucket: s3.Bucket; +const build = new gamelift.Build(this, 'Build', { + content: gamelift.Content.fromBucket(bucket, "sample-asset-key"), + serverSdkVersion: '5.0.0', +}); +``` + #### Upload a realtime server Script Your server script can include one or more files combined into a single .zip file for uploading. The .zip file must contain diff --git a/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts b/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts index 364fab7ef112e..6bf94f1831b07 100644 --- a/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts +++ b/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts @@ -52,9 +52,34 @@ export abstract class BuildBase extends cdk.Resource implements IBuild { * The operating system that the game server binaries are built to run on. */ export enum OperatingSystem { + /** + * Amazon Linux operating system. + */ AMAZON_LINUX = 'AMAZON_LINUX', + + /** + * Amazon Linux 2 operating system. + */ AMAZON_LINUX_2 = 'AMAZON_LINUX_2', - WINDOWS_2012 = 'WINDOWS_2012' + + /** + * Amazon Linux 2023 operating system. + */ + AMAZON_LINUX_2023 = 'AMAZON_LINUX_2023', + + /** + * Windows Server 2012 operating system. + * + * @deprecated If you have active fleets using the Windows Server 2012 operating system, + * you can continue to create new builds using this OS until October 10, 2023, when Microsoft ends its support. + * All others must use Windows Server 2016 when creating new Windows-based builds. + */ + WINDOWS_2012 = 'WINDOWS_2012', + + /** + * Windows Server 2016 operating system. + */ + WINDOWS_2016 = 'WINDOWS_2016', } /** @@ -137,6 +162,15 @@ export interface BuildProps { * @default - a role will be created with default permissions. */ readonly role?: iam.IRole; + + /** + * A server SDK version you used when integrating your game server build with Amazon GameLift. + * + * @see https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-custom-intro.html + * + * @default - 4.0.2 + */ + readonly serverSdkVersion?: string; } /** @@ -247,6 +281,8 @@ export class Build extends BuildBase { } } + this.validateServerSdkVersion(props.serverSdkVersion); + this.role = props.role ?? new iam.Role(this, 'ServiceRole', { assumedBy: new iam.ServicePrincipal('gamelift.amazonaws.com'), }); @@ -263,6 +299,7 @@ export class Build extends BuildBase { objectVersion: content.s3Location && content.s3Location.objectVersion, roleArn: this.role.roleArn, }, + serverSdkVersion: props.serverSdkVersion, }); resource.node.addDependency(this.role); @@ -276,4 +313,13 @@ export class Build extends BuildBase { }); } + private validateServerSdkVersion(serverSdkVersion?: string) { + if (serverSdkVersion === undefined || cdk.Token.isUnresolved(serverSdkVersion)) return; + if (!serverSdkVersion.match(/^\d+\.\d+\.\d+$/)) { + throw new Error(`serverSdkVersion must be in the 0.0.0 format, got \'${serverSdkVersion}\'.`); + } + if (serverSdkVersion.length > 128) { + throw new Error(`serverSdkVersion length must be smaller than or equal to 128, got ${serverSdkVersion.length}.`); + } + } } diff --git a/packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts b/packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts index 8a1efed138682..b2d1698f273f5 100644 --- a/packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts +++ b/packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts @@ -163,12 +163,14 @@ describe('build', () => { buildName: buildName, operatingSystem: gamelift.OperatingSystem.AMAZON_LINUX_2, buildVersion: '1.0', + serverSdkVersion: '5.0.0', }); Template.fromStack(stack).hasResourceProperties('AWS::GameLift::Build', { Name: buildName, OperatingSystem: gamelift.OperatingSystem.AMAZON_LINUX_2, Version: '1.0', + ServerSdkVersion: '5.0.0', }); }); @@ -183,6 +185,20 @@ describe('build', () => { buildName: incorrectBuildName, })).toThrow(/Build name can not be longer than 1024 characters but has 1025 characters./); }); + + test('with an incorrect serverSdkVersion format', () => { + expect(() => new gamelift.Build(stack, 'BuildWithInvalidServerSdkVersion', { + content, + serverSdkVersion: 'invalid', + })).toThrow(/serverSdkVersion must be in the 0.0.0 format, got 'invalid'./); + }); + + test('with an incorrect serverSdkVersion length', () => { + expect(() => new gamelift.Build(stack, 'BuildWithInvalidServerSdkVersion', { + content, + serverSdkVersion: '1'.repeat(50) + '.' + '1'.repeat(50) + '.' + '1'.repeat(50), + })).toThrow(/serverSdkVersion length must be smaller than or equal to 128, got 152./); + }); }); }); diff --git a/packages/@aws-cdk/aws-gamelift-alpha/test/integ.build.js.snapshot/aws-gamelift-build.template.json b/packages/@aws-cdk/aws-gamelift-alpha/test/integ.build.js.snapshot/aws-gamelift-build.template.json index d1e5c0a43f872..ae993ba66cee3 100644 --- a/packages/@aws-cdk/aws-gamelift-alpha/test/integ.build.js.snapshot/aws-gamelift-build.template.json +++ b/packages/@aws-cdk/aws-gamelift-alpha/test/integ.build.js.snapshot/aws-gamelift-build.template.json @@ -72,7 +72,8 @@ ] } }, - "Version": "1.0" + "Version": "1.0", + "ServerSdkVersion": "5.0.0" }, "DependsOn": [ "BuildServiceRoleDefaultPolicyCB7101C6", diff --git a/packages/@aws-cdk/aws-gamelift-alpha/test/integ.build.ts b/packages/@aws-cdk/aws-gamelift-alpha/test/integ.build.ts index a297fb1b50539..a9268f61eba29 100644 --- a/packages/@aws-cdk/aws-gamelift-alpha/test/integ.build.ts +++ b/packages/@aws-cdk/aws-gamelift-alpha/test/integ.build.ts @@ -13,6 +13,7 @@ class TestStack extends cdk.Stack { content: gamelift.Content.fromAsset(path.join(__dirname, 'my-game-build')), operatingSystem: gamelift.OperatingSystem.AMAZON_LINUX_2, buildVersion: '1.0', + serverSdkVersion: '5.0.0', }); new CfnOutput(this, 'BuildArn', { value: build.buildArn });