From 542855c94a0d05e89133df6208a1dd5b84fb19af Mon Sep 17 00:00:00 2001 From: Simon-TechForm <73996878+Simon-TechForm@users.noreply.github.com> Date: Mon, 18 Jan 2021 13:04:53 +0100 Subject: [PATCH 1/4] fix(aws-appsync): use serverlessCluster on rdsDataSource Resolves: #12567 BREAKING CHANGE: RdsDataSource now takes a ServerlessCluster instead of a DatabaseCluster --- .../@aws-cdk/aws-appsync/lib/data-source.ts | 12 ++++---- .../aws-appsync/lib/graphqlapi-base.ts | 16 +++++----- .../aws-appsync/test/appsync-rds.test.ts | 30 ++++++++----------- 3 files changed, 26 insertions(+), 32 deletions(-) diff --git a/packages/@aws-cdk/aws-appsync/lib/data-source.ts b/packages/@aws-cdk/aws-appsync/lib/data-source.ts index 21646e8573193..761c03f0b2bef 100644 --- a/packages/@aws-cdk/aws-appsync/lib/data-source.ts +++ b/packages/@aws-cdk/aws-appsync/lib/data-source.ts @@ -1,7 +1,7 @@ import { ITable } from '@aws-cdk/aws-dynamodb'; import { Grant, IGrantable, IPrincipal, IRole, Role, ServicePrincipal } from '@aws-cdk/aws-iam'; import { IFunction } from '@aws-cdk/aws-lambda'; -import { IDatabaseCluster } from '@aws-cdk/aws-rds'; +import { IServerlessCluster } from '@aws-cdk/aws-rds'; import { ISecret } from '@aws-cdk/aws-secretsmanager'; import { IResolvable, Lazy, Stack } from '@aws-cdk/core'; import { Construct } from 'constructs'; @@ -299,9 +299,9 @@ export class LambdaDataSource extends BackedDataSource { */ export interface RdsDataSourceProps extends BackedDataSourceProps { /** - * The database cluster to call to interact with this data source + * The serverless cluster to call to interact with this data source */ - readonly databaseCluster: IDatabaseCluster; + readonly serverlessCluster: IServerlessCluster; /** * The secret containing the credentials for the database */ @@ -317,12 +317,12 @@ export class RdsDataSource extends BackedDataSource { type: 'RELATIONAL_DATABASE', relationalDatabaseConfig: { rdsHttpEndpointConfig: { - awsRegion: props.databaseCluster.stack.region, + awsRegion: props.serverlessCluster.stack.region, dbClusterIdentifier: Lazy.string({ produce: () => { return Stack.of(this).formatArn({ service: 'rds', - resource: `cluster:${props.databaseCluster.clusterIdentifier}`, + resource: `cluster:${props.serverlessCluster.clusterIdentifier}`, }); }, }), @@ -333,7 +333,7 @@ export class RdsDataSource extends BackedDataSource { }); const clusterArn = Stack.of(this).formatArn({ service: 'rds', - resource: `cluster:${props.databaseCluster.clusterIdentifier}`, + resource: `cluster:${props.serverlessCluster.clusterIdentifier}`, }); props.secretStore.grantRead(this); diff --git a/packages/@aws-cdk/aws-appsync/lib/graphqlapi-base.ts b/packages/@aws-cdk/aws-appsync/lib/graphqlapi-base.ts index 3b037101e97ee..9a058f91728fb 100644 --- a/packages/@aws-cdk/aws-appsync/lib/graphqlapi-base.ts +++ b/packages/@aws-cdk/aws-appsync/lib/graphqlapi-base.ts @@ -1,6 +1,6 @@ import { ITable } from '@aws-cdk/aws-dynamodb'; import { IFunction } from '@aws-cdk/aws-lambda'; -import { IDatabaseCluster } from '@aws-cdk/aws-rds'; +import { IServerlessCluster } from '@aws-cdk/aws-rds'; import { ISecret } from '@aws-cdk/aws-secretsmanager'; import { CfnResource, IResource, Resource } from '@aws-cdk/core'; import { DynamoDbDataSource, HttpDataSource, LambdaDataSource, NoneDataSource, RdsDataSource, AwsIamConfig } from './data-source'; @@ -97,13 +97,13 @@ export interface IGraphqlApi extends IResource { * add a new Rds data source to this API * * @param id The data source's id - * @param databaseCluster The database cluster to interact with this data source - * @param secretStore The secret store that contains the username and password for the database cluster + * @param serverlessCluster The serverless cluster to interact with this data source + * @param secretStore The secret store that contains the username and password for the serverless cluster * @param options The optional configuration for this data source */ addRdsDataSource( id: string, - databaseCluster: IDatabaseCluster, + serverlessCluster: IServerlessCluster, secretStore: ISecret, options?: DataSourceOptions ): RdsDataSource; @@ -204,13 +204,13 @@ export abstract class GraphqlApiBase extends Resource implements IGraphqlApi { /** * add a new Rds data source to this API * @param id The data source's id - * @param databaseCluster The database cluster to interact with this data source - * @param secretStore The secret store that contains the username and password for the database cluster + * @param serverlessCluster The serverless cluster to interact with this data source + * @param secretStore The secret store that contains the username and password for the serverless cluster * @param options The optional configuration for this data source */ public addRdsDataSource( id: string, - databaseCluster: IDatabaseCluster, + serverlessCluster: IServerlessCluster, secretStore: ISecret, options?: DataSourceOptions, ): RdsDataSource { @@ -218,7 +218,7 @@ export abstract class GraphqlApiBase extends Resource implements IGraphqlApi { api: this, name: options?.name, description: options?.description, - databaseCluster, + serverlessCluster, secretStore, }); } diff --git a/packages/@aws-cdk/aws-appsync/test/appsync-rds.test.ts b/packages/@aws-cdk/aws-appsync/test/appsync-rds.test.ts index 97cea819de8f3..42be4bf5ad264 100644 --- a/packages/@aws-cdk/aws-appsync/test/appsync-rds.test.ts +++ b/packages/@aws-cdk/aws-appsync/test/appsync-rds.test.ts @@ -1,7 +1,7 @@ import '@aws-cdk/assert/jest'; import * as path from 'path'; -import { Vpc, SecurityGroup, SubnetType, InstanceType, InstanceClass, InstanceSize } from '@aws-cdk/aws-ec2'; -import { DatabaseSecret, DatabaseCluster, DatabaseClusterEngine, AuroraMysqlEngineVersion } from '@aws-cdk/aws-rds'; +import { Vpc, SecurityGroup, SubnetType } from '@aws-cdk/aws-ec2'; +import { DatabaseSecret, DatabaseClusterEngine, AuroraMysqlEngineVersion, ServerlessCluster } from '@aws-cdk/aws-rds'; import * as cdk from '@aws-cdk/core'; import * as appsync from '../lib'; @@ -21,7 +21,7 @@ beforeEach(() => { describe('Rds Data Source configuration', () => { // GIVEN let secret: DatabaseSecret; - let cluster: DatabaseCluster; + let cluster: ServerlessCluster; beforeEach(() => { const vpc = new Vpc(stack, 'Vpc', { maxAzs: 2 }); const securityGroup = new SecurityGroup(stack, 'AuroraSecurityGroup', { @@ -31,16 +31,13 @@ describe('Rds Data Source configuration', () => { secret = new DatabaseSecret(stack, 'AuroraSecret', { username: 'clusteradmin', }); - cluster = new DatabaseCluster(stack, 'AuroraCluster', { + cluster = new ServerlessCluster(stack, 'AuroraCluster', { engine: DatabaseClusterEngine.auroraMysql({ version: AuroraMysqlEngineVersion.VER_2_07_1 }), credentials: { username: 'clusteradmin' }, clusterIdentifier: 'db-endpoint-test', - instanceProps: { - instanceType: InstanceType.of(InstanceClass.BURSTABLE2, InstanceSize.SMALL), - vpcSubnets: { subnetType: SubnetType.PRIVATE }, - vpc, - securityGroups: [securityGroup], - }, + vpc, + vpcSubnets: { subnetType: SubnetType.PRIVATE }, + securityGroups: [securityGroup], defaultDatabaseName: 'Animals', }); }); @@ -177,7 +174,7 @@ describe('Rds Data Source configuration', () => { describe('adding rds data source from imported api', () => { // GIVEN let secret: DatabaseSecret; - let cluster: DatabaseCluster; + let cluster: ServerlessCluster; beforeEach(() => { const vpc = new Vpc(stack, 'Vpc', { maxAzs: 2 }); const securityGroup = new SecurityGroup(stack, 'AuroraSecurityGroup', { @@ -187,16 +184,13 @@ describe('adding rds data source from imported api', () => { secret = new DatabaseSecret(stack, 'AuroraSecret', { username: 'clusteradmin', }); - cluster = new DatabaseCluster(stack, 'AuroraCluster', { + cluster = new ServerlessCluster(stack, 'AuroraCluster', { engine: DatabaseClusterEngine.auroraMysql({ version: AuroraMysqlEngineVersion.VER_2_07_1 }), credentials: { username: 'clusteradmin' }, clusterIdentifier: 'db-endpoint-test', - instanceProps: { - instanceType: InstanceType.of(InstanceClass.BURSTABLE2, InstanceSize.SMALL), - vpcSubnets: { subnetType: SubnetType.PRIVATE }, - vpc, - securityGroups: [securityGroup], - }, + vpc, + vpcSubnets: { subnetType: SubnetType.PRIVATE }, + securityGroups: [securityGroup], defaultDatabaseName: 'Animals', }); }); From 3e72815eea4bf7ccf928cff53e6e56e781356d79 Mon Sep 17 00:00:00 2001 From: Simon-TechForm <73996878+Simon-TechForm@users.noreply.github.com> Date: Mon, 18 Jan 2021 13:32:29 +0100 Subject: [PATCH 2/4] fix(aws-appsync): update readme serverless example References: #12567 --- packages/@aws-cdk/aws-appsync/README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/@aws-cdk/aws-appsync/README.md b/packages/@aws-cdk/aws-appsync/README.md index 61c4e797f5bb4..a09f29d6b1c03 100644 --- a/packages/@aws-cdk/aws-appsync/README.md +++ b/packages/@aws-cdk/aws-appsync/README.md @@ -107,9 +107,13 @@ const secret = new rds.DatabaseSecret(stack, 'AuroraSecret', { username: 'clusteradmin', }); -// Create the DB cluster, provide all values needed to customise the database. -const cluster = new rds.DatabaseCluster(stack, 'AuroraCluster', { - engine: rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.VER_2_07_1 }), +// The VPC ro place the cluster in +const vpc = new ec2.Vpc(stack, 'AuroraVpc'); + +// Create the serverless cluster, provide all values needed to customise the database. +const cluster = new rds.ServerlessCluster(stack, 'AuroraCluster', { + engine: rds.DatabaseClusterEngine.AURORA_MYSQL, + vpc, credentials: { username: 'clusteradmin' }, clusterIdentifier: 'db-endpoint-test', defaultDatabaseName: 'demos', From 5406af6ad7ffad3910a9e12e608b484497c29110 Mon Sep 17 00:00:00 2001 From: Simon-TechForm <73996878+Simon-TechForm@users.noreply.github.com> Date: Mon, 18 Jan 2021 13:34:50 +0100 Subject: [PATCH 3/4] fix(aws-appsync): fix typo in readme References: #12567 --- packages/@aws-cdk/aws-appsync/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-appsync/README.md b/packages/@aws-cdk/aws-appsync/README.md index a09f29d6b1c03..1b785d561ff38 100644 --- a/packages/@aws-cdk/aws-appsync/README.md +++ b/packages/@aws-cdk/aws-appsync/README.md @@ -107,7 +107,7 @@ const secret = new rds.DatabaseSecret(stack, 'AuroraSecret', { username: 'clusteradmin', }); -// The VPC ro place the cluster in +// The VPC to place the cluster in const vpc = new ec2.Vpc(stack, 'AuroraVpc'); // Create the serverless cluster, provide all values needed to customise the database. From 19223b10842577305595d9dd21878e4874eb6573 Mon Sep 17 00:00:00 2001 From: Simon-TechForm <73996878+Simon-TechForm@users.noreply.github.com> Date: Mon, 22 Feb 2021 10:15:55 +0100 Subject: [PATCH 4/4] fix(aws-appsync): fix duplicate param comment --- packages/@aws-cdk/aws-appsync/lib/graphqlapi-base.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/@aws-cdk/aws-appsync/lib/graphqlapi-base.ts b/packages/@aws-cdk/aws-appsync/lib/graphqlapi-base.ts index 487a43f1dbf99..060d57a34c276 100644 --- a/packages/@aws-cdk/aws-appsync/lib/graphqlapi-base.ts +++ b/packages/@aws-cdk/aws-appsync/lib/graphqlapi-base.ts @@ -99,7 +99,6 @@ export interface IGraphqlApi extends IResource { * @param id The data source's id * @param serverlessCluster The serverless cluster to interact with this data source * @param secretStore The secret store that contains the username and password for the serverless cluster - * @param secretStore The secret store that contains the username and password for the database cluster * @param databaseName The optional name of the database to use within the cluster * @param options The optional configuration for this data source */