From 3aa3ff28c7405e720a7680694251b02352a7da8c Mon Sep 17 00:00:00 2001 From: Luca Pizzini Date: Mon, 6 Nov 2023 17:26:22 +0100 Subject: [PATCH 1/4] feat(gamelift): support Build serverSdkVersion, updated OperatingSystem values --- .../@aws-cdk/aws-gamelift-alpha/README.md | 12 +++++ .../@aws-cdk/aws-gamelift-alpha/lib/build.ts | 48 ++++++++++++++++++- .../aws-gamelift-alpha/test/build.test.ts | 16 +++++++ .../aws-gamelift-build.template.json | 3 +- .../aws-gamelift-alpha/test/integ.build.ts | 1 + 5 files changed, 78 insertions(+), 2 deletions(-) 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..2beeaff85cd5d 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) 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 128, got ${serverSdkVersion}.`); + } + } } 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..f1c29d87bf6a2 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 128/); + }); }); }); 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 }); From affb55ebcd3584836440ed5819afc191112f6b84 Mon Sep 17 00:00:00 2001 From: Parker Scanlon <69879391+scanlonp@users.noreply.github.com> Date: Mon, 6 Nov 2023 08:47:30 -0800 Subject: [PATCH 2/4] Update packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts --- packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts b/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts index 2beeaff85cd5d..cda284374ce6e 100644 --- a/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts +++ b/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts @@ -319,7 +319,7 @@ export class Build extends BuildBase { 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 128, got ${serverSdkVersion}.`); + throw new Error(`serverSdkVersion length must be smaller than or equal to 128, got ${serverSdkVersion}.`); } } } From 9ff0d08a6a9bed9464b9617e043cba5cfbe33688 Mon Sep 17 00:00:00 2001 From: Parker Scanlon <69879391+scanlonp@users.noreply.github.com> Date: Mon, 6 Nov 2023 08:47:35 -0800 Subject: [PATCH 3/4] Update packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts --- packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f1c29d87bf6a2..6b077ca225be3 100644 --- a/packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts +++ b/packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts @@ -197,7 +197,7 @@ describe('build', () => { expect(() => new gamelift.Build(stack, 'BuildWithInvalidServerSdkVersion', { content, serverSdkVersion: '1'.repeat(50) + '.' + '1'.repeat(50) + '.' + '1'.repeat(50), - })).toThrow(/serverSdkVersion length must be smaller than 128/); + })).toThrow(/serverSdkVersion length must be smaller than or equal to 128/); }); }); }); From 640044bae81e4c0df2a8f9c14a732676d7d626e8 Mon Sep 17 00:00:00 2001 From: Luca Pizzini Date: Tue, 7 Nov 2023 08:30:03 +0100 Subject: [PATCH 4/4] fixed serverSdkVersion validation --- packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts | 6 +++--- packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts b/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts index cda284374ce6e..6bf94f1831b07 100644 --- a/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts +++ b/packages/@aws-cdk/aws-gamelift-alpha/lib/build.ts @@ -314,12 +314,12 @@ export class Build extends BuildBase { } private validateServerSdkVersion(serverSdkVersion?: string) { - if (!serverSdkVersion) return; + 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}.`); + 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}.`); + 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 6b077ca225be3..b2d1698f273f5 100644 --- a/packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts +++ b/packages/@aws-cdk/aws-gamelift-alpha/test/build.test.ts @@ -190,14 +190,14 @@ describe('build', () => { expect(() => new gamelift.Build(stack, 'BuildWithInvalidServerSdkVersion', { content, serverSdkVersion: 'invalid', - })).toThrow(/serverSdkVersion must be in the 0.0.0 format, got 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/); + })).toThrow(/serverSdkVersion length must be smaller than or equal to 128, got 152./); }); }); });