cdk-rds-sql 6.0.2 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +26 -7
- package/README.md +57 -0
- package/lambda/engine.abstract.ts +2 -1
- package/lambda/engine.mysql.test.ts +75 -0
- package/lambda/engine.mysql.ts +46 -14
- package/lambda/engine.postgresql.test.ts +74 -1
- package/lambda/engine.postgresql.ts +73 -79
- package/lib/database.js +1 -1
- package/lib/handler/handler.js +94 -81
- package/lib/provider.js +1 -1
- package/lib/role.custom-resource.d.ts +6 -0
- package/lib/role.custom-resource.js +2 -1
- package/lib/role.d.ts +10 -0
- package/lib/role.js +27 -17
- package/lib/schema.js +1 -1
- package/lib/sql.js +1 -1
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -3910,7 +3910,7 @@
|
|
|
3910
3910
|
},
|
|
3911
3911
|
"name": "cdk-rds-sql",
|
|
3912
3912
|
"readme": {
|
|
3913
|
-
"markdown": "# About\n\nThis CDK construct library makes it possible to create databases,\nschemas, and roles in an Aurora Serverless v2, RDS Database Cluster or\nDatabase Instance. Both PostgreSQL and MySQL databases are supported.\n\nThis construct library is intended to be used in enterprise\nenvironments, and works in isolated subnets.\n\n<p align=\"left\">\n <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release\" alt=semantic-release: angular\"></a>\n <a href=\"https://github.com/berenddeboer/cdk-rds-sql/actions/workflows/release.yml\"><img src=\"https://github.com/berenddeboer/cdk-rds-sql/actions/workflows/release.yml/badge.svg\" alt=\"Release badge\"></a>\n</p>\n\n# Requirements\n\n- CDK v2.\n\n# Installation\n\n npm i cdk-rds-sql\n\n# Usage\n\n## Provider\n\nFirst setup your VPC and create your cluster:\n\n```ts\nimport { Duration, RemovalPolicy } from \"aws-cdk-lib\"\nimport * as ec2 from \"aws-cdk-lib/aws-ec2\"\nimport * as rds from \"aws-cdk-lib/aws-rds\"\n\nconst vpc = ec2.Vpc.fromLookup(this, \"Vpc\", {\n vpcId: this.node.tryGetContext(\"vpc-id\"),\n})\n\nconst cluster = new rds.ServerlessCluster(this, \"Cluster\", {\n vpc: vpc,\n vpcSubnets: {\n subnetType: ec2.SubnetType.PRIVATE_ISOLATED,\n },\n engine: rds.DatabaseClusterEngine.AURORA_POSTGRESQL,\n parameterGroup: rds.ParameterGroup.fromParameterGroupName(\n this,\n \"ParameterGroup\",\n \"default.aurora-postgresql11\"\n ),\n removalPolicy: RemovalPolicy.DESTROY,\n scaling: {\n autoPause: Duration.minutes(60),\n minCapacity: rds.AuroraCapacityUnit.ACU_2,\n maxCapacity: rds.AuroraCapacityUnit.ACU_2,\n },\n})\n```\n\nThen create a provider which will connect to your database. For a cluster:\n\n```ts\nimport { Provider } from \"cdk-rds-sql\"\n\nconst provider = new Provider(this, \"Provider\", {\n vpc: vpc,\n cluster: cluster,\n secret: cluster.secret!,\n})\n```\n\nFor an instance:\n\n```ts\nimport { Provider } from \"cdk-rds-sql\"\n\nconst provider = new Provider(this, \"Provider\", {\n vpc: vpc,\n instance: instance,\n secret: cluster.secret!,\n})\n```\n\nThe provider will setup a lambda, which normally lives in the same VPC\nas the database. You can give a different VPC, as long as that VPC has\naccess to the VPC of the database. Only the provider lambda will talk\nto your database.\n\nThe provider will by default use the private isolated subnet of the\nVPC. Your isolated network must have a VPC endpoint to AWS Secrets Manager\nand possibly KMS as well. If you want to use a subnet with egress\naccess in case you have no such VPC endpoints, specify the subnet as\nfollows:\n\n```ts\nimport { Provider } from \"cdk-rds-sql\"\n\nconst provider = new Provider(this, \"Provider\", {\n vpc: vpc,\n vpcSubnets: {\n subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,\n },\n cluster: cluster,\n secret: cluster.secret!,\n})\n```\n\n### Disabling SSL\n\nThe default connection to RDS is ssl enabled (this used to be disabled\nin versions below 4).\n\nYou can disable ssl by setting the `ssl` option to `false`:\n\n```ts\nconst provider = new Provider(this, \"Provider\", {\n vpc: vpc,\n instance: instance,\n secret: cluster.secret!,\n ssl: false, // default is true\n})\n```\n\n## Roles\n\nCreate a postgres role (or mysql user) for a cluster as follows:\n\n```ts\nimport { Role } from \"cdk-rds-sql\"\n\nconst role = new Role(this, \"Role\", {\n provider: provider,\n roleName: \"myrole\",\n databaseName: \"mydb\",\n})\n```\n\nThis will automatically create a secret just like `ServerlessCluster`\ndoes, with all the connection info needed for this user. It's secret value is a JSON like:\n\n```json\n{\n \"dbClusterIdentifier\": \"teststack-clustereb1186t9-sh4wpqfdyfvu\",\n \"password\": \"very-long-and-boring\",\n \"dbname\": \"mydb\",\n \"engine\": \"postgres\",\n \"port\": 5432,\n \"host\": \"teststack-clustereb1186t9-sh4wpqfdyfvu.cluster-cgudolabssna.us-east-1.rds.amazonaws.com\",\n \"username\": \"myrole\"\n}\n```\n\nYou can access the secret via `role.secret`.\n\nInstead of `databaseName` you can also specify `database` to reference\nan existing database. The role will not be created until the database\nhas been created.\n\nIf you want to make the role the owner of a new database, just specify\nthe `databaseName` here, and create the database later.\n\n### MySQL support\n\nIn MySQL users are created with '%' as value for the host. It is hard\nto do this better:\n\n- Determine the CIDR blocks used by a VPC is not trivial.\n- For imported VPCs you cannot specify the IPv6 CIDR.\n- CIDRs might change without the system knowing, meaning applications\n could lose access to the database at random times, such as when a\n container is restarted.\n\n## Database\n\nCreate a database as follows:\n\n```ts\nimport { Database } from \"cdk-rds-sql\"\n\nconst database = new Database(this, \"Database\", {\n provider: provider,\n databaseName: \"mydb\",\n})\n```\n\nYou can provide an owner, which makes it easy to create database owned\nby a new user:\n\n```ts\nconst database = new Database(this, \"Database\", {\n provider: provider,\n databaseName: \"mydb\",\n owner: role,\n})\n```\n\n## Schema\n\nCreate a schema in the default database as follows:\n\n```ts\nimport { Schema } from \"cdk-rds-sql\"\n\nnew Schema(this, \"Schema\", {\n provider: provider,\n schemaName: \"myschema\",\n})\n```\n\nOr in another database:\n\n```ts\nconst database = new Database(this, \"Database\", {\n provider: provider,\n databaseName: \"mydb\",\n})\n\nnew Schema(this, \"Schema\", {\n provider: provider,\n schemaName: \"myschema\",\n databaseName: database.databaseName,\n})\n```\n\nOne may need a role permitted for using schema:\n\n```ts\nnew Schema(this, \"Schema\", {\n provider: provider,\n schemaName: \"myschema\",\n databaseName: database.databaseName,\n role: role,\n})\n```\n\n## Sql\n\nYou can insert arbitrary SQL into your database with the `Sql` construct:\n\n```ts\nimport { Sql } from \"cdk-rds-sql\"\n\nconst sql = new Sql(this, \"Sql\", {\n provider: provider,\n database: database,\n statement: \"create table t (i int)\",\n})\n```\n\nCreate a table if it does not exist, and grant a role privileges:\n\n```ts\nconst sql = new Sql(this, \"Sql\", {\n provider: provider,\n database: database,\n statement: `\ncreate table if not exists t (i int);\ngrant select on t to myrole;\n`,\n})\n```\n\nRollback sql on stack deletion:\n\n```ts\nconst sql = new Sql(this, \"Sql\", {\n provider: provider,\n database: database,\n statement: `\ncreate table if not exists t (i int);\ngrant select on t to myrole;\n`,\n rollback: `\nDO $$BEGIN\n IF EXISTS (select from pg_database WHERE datname = 't') THEN\n IF EXISTS (select from pg_catalog.pg_roles WHERE rolname = 'myrole') THEN\n revoke select t from myrole;\n END IF;\n drop table t;\n END IF;\nEND$$;\n`,\n})\n```\n\nNote that there is no synchronisation between various `Sql`\nconstructs, in particular the order in your code does not determine\nthe order in which your SQL is executed. This happens in parallel,\nunless you specify an explicit dependency via `sql.node.addDepency()`.\n\nThere are a lot of concerns when using `Sql`:\n\n- When you update your Sql, your previous Sql is not \"rolled back\",\n the new Sql is simply executed again.\n- When you delete your `Sql` construct the rollback is executed if specified\n- When permission are granted via `Sql` they must be removed via rollback to succesfully remove the role\n- Currently the `Sql` constructs has less than 5 minutes to execute\n its work.\n- It is unknown how large your SQL can be.\n\n# Parameters\n\nSome lambda constructs, in particular [Bref](https://bref.sh/), do not\nsupport secrets out of the box. This construct allows you to create\nSSM parameters in addition to a secret:\n\n```ts\nconst role = new Role(this, \"Role\", {\n provider: provider,\n roleName: \"myrole\",\n databaseName: \"mydb\",\n parameterPrefix: \"/my-app/\",\n})\n```\n\nThis will create `/my-app/username`, `/my-app/password` and such.\n\nTo access parameters you will need IAM permissions such as:\n\n```ts\ninitialPolicy: [\n new iam.PolicyStatement({\n\tactions: [\"ssm:GetParameter\", \"ssm:GetParameters\"],\n\tresources: [\n\t // Grant access to all parameters under the base path\n\t `arn:aws:ssm:${this.region}:${this.account}:parameter/my-app/*`,\n\t],\n\teffect: iam.Effect.ALLOW,\n })\n],\n```\n\nNote that your VPC will need an SSM Parameters interface endpoint to support this.\n\n# IPv6\n\nIf you use the provider in an IPv6 subnet you probably need these settings:\n\n```ts\nimport { Provider } from \"cdk-rds-sql\"\n\nconst provider = new Provider(this, \"Provider\", {\n ...\n functionProps: {\n\tipv6AllowedForDualStack: true,\n\tallowAllIpv6Outbound: true,\n },\n}\n```\n\n# Working on this code\n\nThis code is managed by\n[projen](https://github.com/projen/projen/blob/main/README.md). In\naddition [pre-commit](https://pre-commit.com/) is used.\n\nSo after git clone and `npm ci` you would do:\n\n```\npre-commit install --install-hooks --hook-type commit-msg --hook-type pre-commit\n```\n\nto install the pre-commit hooks.\n\n## Testing\n\nTest code via projen with:\n\n npx projen test\n\nYou can run the sample stack with:\n\n npx projen integ:deploy:serverless\n\nIf you want to use an existing vpc:\n\n npx cdk deploy --context vpc-id=vpc-0123456789 TestServerlessV2Stack\n\n# To do\n\n- Update role: will not revoke connect to previous database if database name has changed.\n- If the cluster is configured for autopausing, wake cluster up before doing any SQL operations.\n- We rename roles and database on update: is that actually the best\n thing? More change to get us into an irrecoverable situation??\n"
|
|
3913
|
+
"markdown": "# About\n\nThis CDK construct library makes it possible to create databases,\nschemas, and roles in an Aurora Serverless v2, RDS Database Cluster or\nDatabase Instance. Both PostgreSQL and MySQL databases are supported.\n\nThis construct library is intended to be used in enterprise\nenvironments, and works in isolated subnets.\n\n<p align=\"left\">\n <a href=\"https://github.com/semantic-release/semantic-release\"><img src=\"https://img.shields.io/badge/semantic--release-angular-e10079?logo=semantic-release\" alt=semantic-release: angular\"></a>\n <a href=\"https://github.com/berenddeboer/cdk-rds-sql/actions/workflows/release.yml\"><img src=\"https://github.com/berenddeboer/cdk-rds-sql/actions/workflows/release.yml/badge.svg\" alt=\"Release badge\"></a>\n</p>\n\n# Requirements\n\n- CDK v2.\n\n# Installation\n\n npm i cdk-rds-sql\n\n# Usage\n\n## Provider\n\nFirst setup your VPC and create your cluster:\n\n```ts\nimport { Duration, RemovalPolicy } from \"aws-cdk-lib\"\nimport * as ec2 from \"aws-cdk-lib/aws-ec2\"\nimport * as rds from \"aws-cdk-lib/aws-rds\"\n\nconst vpc = ec2.Vpc.fromLookup(this, \"Vpc\", {\n vpcId: this.node.tryGetContext(\"vpc-id\"),\n})\n\nconst cluster = new rds.ServerlessCluster(this, \"Cluster\", {\n vpc: vpc,\n vpcSubnets: {\n subnetType: ec2.SubnetType.PRIVATE_ISOLATED,\n },\n engine: rds.DatabaseClusterEngine.AURORA_POSTGRESQL,\n parameterGroup: rds.ParameterGroup.fromParameterGroupName(\n this,\n \"ParameterGroup\",\n \"default.aurora-postgresql11\"\n ),\n removalPolicy: RemovalPolicy.DESTROY,\n scaling: {\n autoPause: Duration.minutes(60),\n minCapacity: rds.AuroraCapacityUnit.ACU_2,\n maxCapacity: rds.AuroraCapacityUnit.ACU_2,\n },\n})\n```\n\nThen create a provider which will connect to your database. For a cluster:\n\n```ts\nimport { Provider } from \"cdk-rds-sql\"\n\nconst provider = new Provider(this, \"Provider\", {\n vpc: vpc,\n cluster: cluster,\n secret: cluster.secret!,\n})\n```\n\nFor an instance:\n\n```ts\nimport { Provider } from \"cdk-rds-sql\"\n\nconst provider = new Provider(this, \"Provider\", {\n vpc: vpc,\n instance: instance,\n secret: cluster.secret!,\n})\n```\n\nThe provider will setup a lambda, which normally lives in the same VPC\nas the database. You can give a different VPC, as long as that VPC has\naccess to the VPC of the database. Only the provider lambda will talk\nto your database.\n\nThe provider will by default use the private isolated subnet of the\nVPC. Your isolated network must have a VPC endpoint to AWS Secrets Manager\nand possibly KMS as well. If you want to use a subnet with egress\naccess in case you have no such VPC endpoints, specify the subnet as\nfollows:\n\n```ts\nimport { Provider } from \"cdk-rds-sql\"\n\nconst provider = new Provider(this, \"Provider\", {\n vpc: vpc,\n vpcSubnets: {\n subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,\n },\n cluster: cluster,\n secret: cluster.secret!,\n})\n```\n\n### Disabling SSL\n\nThe default connection to RDS is ssl enabled (this used to be disabled\nin versions below 4).\n\nYou can disable ssl by setting the `ssl` option to `false`:\n\n```ts\nconst provider = new Provider(this, \"Provider\", {\n vpc: vpc,\n instance: instance,\n secret: cluster.secret!,\n ssl: false, // default is true\n})\n```\n\n## Roles\n\nCreate a postgres role (or mysql user) for a cluster as follows:\n\n```ts\nimport { Role } from \"cdk-rds-sql\"\n\nconst role = new Role(this, \"Role\", {\n provider: provider,\n roleName: \"myrole\",\n databaseName: \"mydb\",\n})\n```\n\nThis will automatically create a secret just like `ServerlessCluster`\ndoes, with all the connection info needed for this user. It's secret value is a JSON like:\n\n```json\n{\n \"dbClusterIdentifier\": \"teststack-clustereb1186t9-sh4wpqfdyfvu\",\n \"password\": \"very-long-and-boring\",\n \"dbname\": \"mydb\",\n \"engine\": \"postgres\",\n \"port\": 5432,\n \"host\": \"teststack-clustereb1186t9-sh4wpqfdyfvu.cluster-cgudolabssna.us-east-1.rds.amazonaws.com\",\n \"username\": \"myrole\"\n}\n```\n\nYou can access the secret via `role.secret`.\n\nInstead of `databaseName` you can also specify `database` to reference\nan existing database. The role will not be created until the database\nhas been created.\n\nIf you want to make the role the owner of a new database, just specify\nthe `databaseName` here, and create the database later.\n\n### IAM Authentication\n\nInstead of password-based authentication, you can create roles that use AWS IAM database authentication. This eliminates the need to store database passwords and provides enhanced security through AWS IAM policies.\n\n```ts\nimport { Role } from \"cdk-rds-sql\"\n\nconst iamRole = new Role(this, \"IamRole\", {\n provider: provider,\n roleName: \"myiamrole\",\n databaseName: \"mydb\",\n enableIamAuth: true,\n})\n```\n\nFor IAM-authenticated roles, the secret will not contain a password field:\n\n```json\n{\n \"dbClusterIdentifier\": \"teststack-clustereb1186t9-sh4wpqfdyfvu\",\n \"dbname\": \"mydb\",\n \"engine\": \"postgres\",\n \"port\": 5432,\n \"host\": \"teststack-clustereb1186t9-sh4wpqfdyfvu.cluster-cgudolabssna.us-east-1.rds.amazonaws.com\",\n \"username\": \"myiamrole\"\n}\n```\n\n**Requirements for IAM Authentication:**\n\n- SSL connections are required (enabled by default in this library)\n- Your application must have IAM permissions to connect to the database\n- The database user/role name must match the IAM identity\n\n**IAM Policy Example:**\n\nYour application will need an IAM policy like this to connect:\n\n```json\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"rds-db:connect\"\n ],\n \"Resource\": [\n \"arn:aws:rds-db:region:account-id:dbuser:cluster-resource-id/myiamrole\"\n ]\n }\n ]\n}\n```\n\nBoth PostgreSQL and MySQL databases support IAM authentication. For more details, see the [AWS RDS IAM Database Authentication documentation](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html).\n\n### MySQL support\n\nIn MySQL users are created with '%' as value for the host. It is hard\nto do this better:\n\n- Determine the CIDR blocks used by a VPC is not trivial.\n- For imported VPCs you cannot specify the IPv6 CIDR.\n- CIDRs might change without the system knowing, meaning applications\n could lose access to the database at random times, such as when a\n container is restarted.\n\n## Database\n\nCreate a database as follows:\n\n```ts\nimport { Database } from \"cdk-rds-sql\"\n\nconst database = new Database(this, \"Database\", {\n provider: provider,\n databaseName: \"mydb\",\n})\n```\n\nYou can provide an owner, which makes it easy to create database owned\nby a new user:\n\n```ts\nconst database = new Database(this, \"Database\", {\n provider: provider,\n databaseName: \"mydb\",\n owner: role,\n})\n```\n\n## Schema\n\nCreate a schema in the default database as follows:\n\n```ts\nimport { Schema } from \"cdk-rds-sql\"\n\nnew Schema(this, \"Schema\", {\n provider: provider,\n schemaName: \"myschema\",\n})\n```\n\nOr in another database:\n\n```ts\nconst database = new Database(this, \"Database\", {\n provider: provider,\n databaseName: \"mydb\",\n})\n\nnew Schema(this, \"Schema\", {\n provider: provider,\n schemaName: \"myschema\",\n databaseName: database.databaseName,\n})\n```\n\nOne may need a role permitted for using schema:\n\n```ts\nnew Schema(this, \"Schema\", {\n provider: provider,\n schemaName: \"myschema\",\n databaseName: database.databaseName,\n role: role,\n})\n```\n\n## Sql\n\nYou can insert arbitrary SQL into your database with the `Sql` construct:\n\n```ts\nimport { Sql } from \"cdk-rds-sql\"\n\nconst sql = new Sql(this, \"Sql\", {\n provider: provider,\n database: database,\n statement: \"create table t (i int)\",\n})\n```\n\nCreate a table if it does not exist, and grant a role privileges:\n\n```ts\nconst sql = new Sql(this, \"Sql\", {\n provider: provider,\n database: database,\n statement: `\ncreate table if not exists t (i int);\ngrant select on t to myrole;\n`,\n})\n```\n\nRollback sql on stack deletion:\n\n```ts\nconst sql = new Sql(this, \"Sql\", {\n provider: provider,\n database: database,\n statement: `\ncreate table if not exists t (i int);\ngrant select on t to myrole;\n`,\n rollback: `\nDO $$BEGIN\n IF EXISTS (select from pg_database WHERE datname = 't') THEN\n IF EXISTS (select from pg_catalog.pg_roles WHERE rolname = 'myrole') THEN\n revoke select t from myrole;\n END IF;\n drop table t;\n END IF;\nEND$$;\n`,\n})\n```\n\nNote that there is no synchronisation between various `Sql`\nconstructs, in particular the order in your code does not determine\nthe order in which your SQL is executed. This happens in parallel,\nunless you specify an explicit dependency via `sql.node.addDepency()`.\n\nThere are a lot of concerns when using `Sql`:\n\n- When you update your Sql, your previous Sql is not \"rolled back\",\n the new Sql is simply executed again.\n- When you delete your `Sql` construct the rollback is executed if specified\n- When permission are granted via `Sql` they must be removed via rollback to succesfully remove the role\n- Currently the `Sql` constructs has less than 5 minutes to execute\n its work.\n- It is unknown how large your SQL can be.\n\n# Parameters\n\nSome lambda constructs, in particular [Bref](https://bref.sh/), do not\nsupport secrets out of the box. This construct allows you to create\nSSM parameters in addition to a secret:\n\n```ts\nconst role = new Role(this, \"Role\", {\n provider: provider,\n roleName: \"myrole\",\n databaseName: \"mydb\",\n parameterPrefix: \"/my-app/\",\n})\n```\n\nThis will create `/my-app/username`, `/my-app/password` and such.\n\nTo access parameters you will need IAM permissions such as:\n\n```ts\ninitialPolicy: [\n new iam.PolicyStatement({\n\tactions: [\"ssm:GetParameter\", \"ssm:GetParameters\"],\n\tresources: [\n\t // Grant access to all parameters under the base path\n\t `arn:aws:ssm:${this.region}:${this.account}:parameter/my-app/*`,\n\t],\n\teffect: iam.Effect.ALLOW,\n })\n],\n```\n\nNote that your VPC will need an SSM Parameters interface endpoint to support this.\n\n# IPv6\n\nIf you use the provider in an IPv6 subnet you probably need these settings:\n\n```ts\nimport { Provider } from \"cdk-rds-sql\"\n\nconst provider = new Provider(this, \"Provider\", {\n ...\n functionProps: {\n\tipv6AllowedForDualStack: true,\n\tallowAllIpv6Outbound: true,\n },\n}\n```\n\n# Working on this code\n\nThis code is managed by\n[projen](https://github.com/projen/projen/blob/main/README.md). In\naddition [pre-commit](https://pre-commit.com/) is used.\n\nSo after git clone and `npm ci` you would do:\n\n```\npre-commit install --install-hooks --hook-type commit-msg --hook-type pre-commit\n```\n\nto install the pre-commit hooks.\n\n## Testing\n\nTest code via projen with:\n\n npx projen test\n\nYou can run the sample stack with:\n\n npx projen integ:deploy:serverless\n\nIf you want to use an existing vpc:\n\n npx cdk deploy --context vpc-id=vpc-0123456789 TestServerlessV2Stack\n\n# To do\n\n- Update role: will not revoke connect to previous database if database name has changed.\n- If the cluster is configured for autopausing, wake cluster up before doing any SQL operations.\n- We rename roles and database on update: is that actually the best\n thing? More change to get us into an irrecoverable situation??\n"
|
|
3914
3914
|
},
|
|
3915
3915
|
"repository": {
|
|
3916
3916
|
"type": "git",
|
|
@@ -4517,7 +4517,7 @@
|
|
|
4517
4517
|
},
|
|
4518
4518
|
"locationInModule": {
|
|
4519
4519
|
"filename": "src/role.ts",
|
|
4520
|
-
"line":
|
|
4520
|
+
"line": 152
|
|
4521
4521
|
},
|
|
4522
4522
|
"parameters": [
|
|
4523
4523
|
{
|
|
@@ -4543,7 +4543,7 @@
|
|
|
4543
4543
|
"kind": "class",
|
|
4544
4544
|
"locationInModule": {
|
|
4545
4545
|
"filename": "src/role.ts",
|
|
4546
|
-
"line":
|
|
4546
|
+
"line": 141
|
|
4547
4547
|
},
|
|
4548
4548
|
"name": "Role",
|
|
4549
4549
|
"properties": [
|
|
@@ -4555,7 +4555,7 @@
|
|
|
4555
4555
|
"immutable": true,
|
|
4556
4556
|
"locationInModule": {
|
|
4557
4557
|
"filename": "src/role.ts",
|
|
4558
|
-
"line":
|
|
4558
|
+
"line": 145
|
|
4559
4559
|
},
|
|
4560
4560
|
"name": "roleName",
|
|
4561
4561
|
"type": {
|
|
@@ -4570,7 +4570,7 @@
|
|
|
4570
4570
|
"immutable": true,
|
|
4571
4571
|
"locationInModule": {
|
|
4572
4572
|
"filename": "src/role.ts",
|
|
4573
|
-
"line":
|
|
4573
|
+
"line": 150
|
|
4574
4574
|
},
|
|
4575
4575
|
"name": "secret",
|
|
4576
4576
|
"type": {
|
|
@@ -4662,6 +4662,25 @@
|
|
|
4662
4662
|
"primitive": "string"
|
|
4663
4663
|
}
|
|
4664
4664
|
},
|
|
4665
|
+
{
|
|
4666
|
+
"abstract": true,
|
|
4667
|
+
"docs": {
|
|
4668
|
+
"default": "false - use password authentication",
|
|
4669
|
+
"remarks": "When enabled, the role will be created without a password and\nconfigured for AWS IAM database authentication. The secret\nwill not contain a password field.",
|
|
4670
|
+
"stability": "stable",
|
|
4671
|
+
"summary": "Enable IAM authentication for this role."
|
|
4672
|
+
},
|
|
4673
|
+
"immutable": true,
|
|
4674
|
+
"locationInModule": {
|
|
4675
|
+
"filename": "src/role.ts",
|
|
4676
|
+
"line": 84
|
|
4677
|
+
},
|
|
4678
|
+
"name": "enableIamAuth",
|
|
4679
|
+
"optional": true,
|
|
4680
|
+
"type": {
|
|
4681
|
+
"primitive": "boolean"
|
|
4682
|
+
}
|
|
4683
|
+
},
|
|
4665
4684
|
{
|
|
4666
4685
|
"abstract": true,
|
|
4667
4686
|
"docs": {
|
|
@@ -4994,6 +5013,6 @@
|
|
|
4994
5013
|
"symbolId": "src/sql:SqlProps"
|
|
4995
5014
|
}
|
|
4996
5015
|
},
|
|
4997
|
-
"version": "6.
|
|
4998
|
-
"fingerprint": "
|
|
5016
|
+
"version": "6.1.1",
|
|
5017
|
+
"fingerprint": "yO4MjHTDWYCYzDlDYWR7N4qPkFL/jiWbnoxW2E2++zg="
|
|
4999
5018
|
}
|
package/README.md
CHANGED
|
@@ -157,6 +157,63 @@ has been created.
|
|
|
157
157
|
If you want to make the role the owner of a new database, just specify
|
|
158
158
|
the `databaseName` here, and create the database later.
|
|
159
159
|
|
|
160
|
+
### IAM Authentication
|
|
161
|
+
|
|
162
|
+
Instead of password-based authentication, you can create roles that use AWS IAM database authentication. This eliminates the need to store database passwords and provides enhanced security through AWS IAM policies.
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
import { Role } from "cdk-rds-sql"
|
|
166
|
+
|
|
167
|
+
const iamRole = new Role(this, "IamRole", {
|
|
168
|
+
provider: provider,
|
|
169
|
+
roleName: "myiamrole",
|
|
170
|
+
databaseName: "mydb",
|
|
171
|
+
enableIamAuth: true,
|
|
172
|
+
})
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
For IAM-authenticated roles, the secret will not contain a password field:
|
|
176
|
+
|
|
177
|
+
```json
|
|
178
|
+
{
|
|
179
|
+
"dbClusterIdentifier": "teststack-clustereb1186t9-sh4wpqfdyfvu",
|
|
180
|
+
"dbname": "mydb",
|
|
181
|
+
"engine": "postgres",
|
|
182
|
+
"port": 5432,
|
|
183
|
+
"host": "teststack-clustereb1186t9-sh4wpqfdyfvu.cluster-cgudolabssna.us-east-1.rds.amazonaws.com",
|
|
184
|
+
"username": "myiamrole"
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Requirements for IAM Authentication:**
|
|
189
|
+
|
|
190
|
+
- SSL connections are required (enabled by default in this library)
|
|
191
|
+
- Your application must have IAM permissions to connect to the database
|
|
192
|
+
- The database user/role name must match the IAM identity
|
|
193
|
+
|
|
194
|
+
**IAM Policy Example:**
|
|
195
|
+
|
|
196
|
+
Your application will need an IAM policy like this to connect:
|
|
197
|
+
|
|
198
|
+
```json
|
|
199
|
+
{
|
|
200
|
+
"Version": "2012-10-17",
|
|
201
|
+
"Statement": [
|
|
202
|
+
{
|
|
203
|
+
"Effect": "Allow",
|
|
204
|
+
"Action": [
|
|
205
|
+
"rds-db:connect"
|
|
206
|
+
],
|
|
207
|
+
"Resource": [
|
|
208
|
+
"arn:aws:rds-db:region:account-id:dbuser:cluster-resource-id/myiamrole"
|
|
209
|
+
]
|
|
210
|
+
}
|
|
211
|
+
]
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Both PostgreSQL and MySQL databases support IAM authentication. For more details, see the [AWS RDS IAM Database Authentication documentation](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html).
|
|
216
|
+
|
|
160
217
|
### MySQL support
|
|
161
218
|
|
|
162
219
|
In MySQL users are created with '%' as value for the host. It is hard
|
|
@@ -62,9 +62,10 @@ export abstract class AbstractEngine {
|
|
|
62
62
|
): Promise<any>
|
|
63
63
|
|
|
64
64
|
/**
|
|
65
|
-
* Parse password field from secret. Returns void on error.
|
|
65
|
+
* Parse password field from secret. Returns void on error or if no password field exists.
|
|
66
66
|
*/
|
|
67
67
|
protected async getPassword(arn: string): Promise<string | void> {
|
|
68
|
+
if (!arn) return
|
|
68
69
|
const secrets_client = new SecretsManagerClient({})
|
|
69
70
|
const command = new GetSecretValueCommand({
|
|
70
71
|
SecretId: arn,
|
|
@@ -88,6 +88,81 @@ describe("MySQL Engine", () => {
|
|
|
88
88
|
)
|
|
89
89
|
expect(grantStatement).toBeDefined()
|
|
90
90
|
})
|
|
91
|
+
|
|
92
|
+
describe("IAM Authentication", () => {
|
|
93
|
+
it("should create user with IAM authentication", async () => {
|
|
94
|
+
const props = {
|
|
95
|
+
EnableIamAuth: true,
|
|
96
|
+
DatabaseName: "testdb",
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const sql = await engine.createRole("iamuser", props)
|
|
100
|
+
|
|
101
|
+
expect(Array.isArray(sql)).toBe(true)
|
|
102
|
+
expect(sql[0]).toContain("CREATE USER IF NOT EXISTS 'iamuser'@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'")
|
|
103
|
+
expect(sql[1]).toContain("GRANT ALL PRIVILEGES ON `testdb`.* TO 'iamuser'@'%'")
|
|
104
|
+
expect(sql[2]).toBe("FLUSH PRIVILEGES")
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it("should create user without IAM authentication", async () => {
|
|
108
|
+
jest.spyOn(engine as any, "getPassword").mockResolvedValue("test-password")
|
|
109
|
+
|
|
110
|
+
const props = {
|
|
111
|
+
EnableIamAuth: false,
|
|
112
|
+
PasswordArn: "arn:aws:secretsmanager:region:account:secret:name",
|
|
113
|
+
DatabaseName: "testdb",
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const sql = await engine.createRole("passworduser", props)
|
|
117
|
+
|
|
118
|
+
expect(Array.isArray(sql)).toBe(true)
|
|
119
|
+
expect(sql[0]).toContain("CREATE USER IF NOT EXISTS 'passworduser'@'%' IDENTIFIED BY 'test-password'")
|
|
120
|
+
expect(sql[1]).toContain("GRANT ALL PRIVILEGES ON `testdb`.* TO 'passworduser'@'%'")
|
|
121
|
+
expect(sql[2]).toBe("FLUSH PRIVILEGES")
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
it("should switch from password to IAM authentication", async () => {
|
|
125
|
+
const oldProps = {
|
|
126
|
+
EnableIamAuth: false,
|
|
127
|
+
PasswordArn: "arn:aws:secretsmanager:region:account:secret:name",
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const newProps = {
|
|
131
|
+
EnableIamAuth: true,
|
|
132
|
+
DatabaseName: "testdb",
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const sql = await engine.updateRole("switchuser", "switchuser", newProps, oldProps)
|
|
136
|
+
|
|
137
|
+
expect(Array.isArray(sql)).toBe(true)
|
|
138
|
+
expect(sql[0]).toContain("DROP USER IF EXISTS 'switchuser'@'%'")
|
|
139
|
+
expect(sql[1]).toContain("CREATE USER 'switchuser'@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'")
|
|
140
|
+
expect(sql[2]).toContain("GRANT ALL PRIVILEGES ON `testdb`.* TO 'switchuser'@'%'")
|
|
141
|
+
expect(sql[3]).toBe("FLUSH PRIVILEGES")
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it("should switch from IAM to password authentication", async () => {
|
|
145
|
+
jest.spyOn(engine as any, "getPassword").mockResolvedValue("new-password")
|
|
146
|
+
|
|
147
|
+
const oldProps = {
|
|
148
|
+
EnableIamAuth: true,
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const newProps = {
|
|
152
|
+
EnableIamAuth: false,
|
|
153
|
+
PasswordArn: "arn:aws:secretsmanager:region:account:secret:name",
|
|
154
|
+
DatabaseName: "testdb",
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const sql = await engine.updateRole("switchuser", "switchuser", newProps, oldProps)
|
|
158
|
+
|
|
159
|
+
expect(Array.isArray(sql)).toBe(true)
|
|
160
|
+
expect(sql[0]).toContain("DROP USER IF EXISTS 'switchuser'@'%'")
|
|
161
|
+
expect(sql[1]).toContain("CREATE USER 'switchuser'@'%' IDENTIFIED BY 'new-password'")
|
|
162
|
+
expect(sql[2]).toContain("GRANT ALL PRIVILEGES ON `testdb`.* TO 'switchuser'@'%'")
|
|
163
|
+
expect(sql[3]).toBe("FLUSH PRIVILEGES")
|
|
164
|
+
})
|
|
165
|
+
})
|
|
91
166
|
})
|
|
92
167
|
|
|
93
168
|
describe("Schema", () => {
|
package/lambda/engine.mysql.ts
CHANGED
|
@@ -22,21 +22,31 @@ export class MysqlEngine extends AbstractEngine {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
async createRole(resourceId: string, props?: any): Promise<string[]> {
|
|
25
|
-
|
|
26
|
-
const password = await this.getPassword(props.PasswordArn)
|
|
27
|
-
if (!password) throw `Cannot parse password from ${props.PasswordArn}`
|
|
25
|
+
const sql: string[] = []
|
|
28
26
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
if (props.EnableIamAuth) {
|
|
28
|
+
// Create user for IAM authentication
|
|
29
|
+
sql.push(
|
|
30
|
+
`CREATE USER IF NOT EXISTS '${resourceId}'@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'`
|
|
31
|
+
)
|
|
32
|
+
} else {
|
|
33
|
+
// Create user with password authentication
|
|
34
|
+
if (!props.PasswordArn) throw new Error("No PasswordArn provided")
|
|
35
|
+
const password = await this.getPassword(props.PasswordArn)
|
|
36
|
+
if (!password) throw `Cannot parse password from ${props.PasswordArn}`
|
|
37
|
+
|
|
38
|
+
sql.push(
|
|
39
|
+
`CREATE USER IF NOT EXISTS '${resourceId}'@'%' IDENTIFIED BY '${password}'`
|
|
40
|
+
)
|
|
41
|
+
}
|
|
32
42
|
|
|
33
43
|
if (props.DatabaseName) {
|
|
34
44
|
sql.push(
|
|
35
45
|
`GRANT ALL PRIVILEGES ON \`${props.DatabaseName}\`.* TO '${resourceId}'@'%'`
|
|
36
46
|
)
|
|
37
|
-
sql.push(`FLUSH PRIVILEGES`)
|
|
38
47
|
}
|
|
39
48
|
|
|
49
|
+
sql.push(`FLUSH PRIVILEGES`)
|
|
40
50
|
return sql
|
|
41
51
|
}
|
|
42
52
|
|
|
@@ -50,7 +60,13 @@ export class MysqlEngine extends AbstractEngine {
|
|
|
50
60
|
|
|
51
61
|
if (oldResourceId !== resourceId) {
|
|
52
62
|
// MySQL doesn't allow renaming users directly, we need to create a new one and drop the old one
|
|
53
|
-
if (props?.
|
|
63
|
+
if (props?.EnableIamAuth) {
|
|
64
|
+
// Create new user with IAM auth
|
|
65
|
+
sql.push(
|
|
66
|
+
`CREATE USER IF NOT EXISTS '${resourceId}'@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'`
|
|
67
|
+
)
|
|
68
|
+
} else if (props?.PasswordArn) {
|
|
69
|
+
// Create new user with password auth
|
|
54
70
|
const password = await this.getPassword(props.PasswordArn)
|
|
55
71
|
if (!password) throw `Cannot parse password from ${props.PasswordArn}`
|
|
56
72
|
|
|
@@ -65,12 +81,28 @@ export class MysqlEngine extends AbstractEngine {
|
|
|
65
81
|
|
|
66
82
|
// Drop the old user
|
|
67
83
|
sql.push(`DROP USER IF EXISTS '${oldResourceId}'@'%'`)
|
|
68
|
-
} else
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
84
|
+
} else {
|
|
85
|
+
// Handle authentication method changes for existing user
|
|
86
|
+
if (props?.EnableIamAuth && !oldProps?.EnableIamAuth) {
|
|
87
|
+
// Switching from password to IAM auth - need to recreate user
|
|
88
|
+
sql.push(`DROP USER IF EXISTS '${resourceId}'@'%'`)
|
|
89
|
+
sql.push(
|
|
90
|
+
`CREATE USER '${resourceId}'@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'`
|
|
91
|
+
)
|
|
92
|
+
} else if (!props?.EnableIamAuth && oldProps?.EnableIamAuth) {
|
|
93
|
+
// Switching from IAM to password auth - need to recreate user
|
|
94
|
+
sql.push(`DROP USER IF EXISTS '${resourceId}'@'%'`)
|
|
95
|
+
if (props?.PasswordArn) {
|
|
96
|
+
const password = await this.getPassword(props.PasswordArn)
|
|
97
|
+
if (!password) throw `Cannot parse password from ${props.PasswordArn}`
|
|
98
|
+
sql.push(`CREATE USER '${resourceId}'@'%' IDENTIFIED BY '${password}'`)
|
|
99
|
+
}
|
|
100
|
+
} else if (!props?.EnableIamAuth && props?.PasswordArn) {
|
|
101
|
+
// Just update the password for password auth
|
|
102
|
+
const password = await this.getPassword(props.PasswordArn)
|
|
103
|
+
if (!password) throw `Cannot parse password from ${props.PasswordArn}`
|
|
104
|
+
sql.push(`ALTER USER '${resourceId}'@'%' IDENTIFIED BY '${password}'`)
|
|
105
|
+
}
|
|
74
106
|
}
|
|
75
107
|
|
|
76
108
|
// Check if database name has changed
|
|
@@ -46,13 +46,86 @@ describe("PostgreSQL Engine", () => {
|
|
|
46
46
|
// Check for transaction commit
|
|
47
47
|
expect(sql[sql.length - 1]).toBe("commit")
|
|
48
48
|
})
|
|
49
|
+
|
|
50
|
+
describe("IAM Authentication", () => {
|
|
51
|
+
it("should create role with IAM authentication", async () => {
|
|
52
|
+
const props = {
|
|
53
|
+
EnableIamAuth: true,
|
|
54
|
+
DatabaseName: "testdb",
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const sql = await engine.createRole("iamrole", props)
|
|
58
|
+
|
|
59
|
+
expect(Array.isArray(sql)).toBe(true)
|
|
60
|
+
expect(sql[0]).toBe("start transaction")
|
|
61
|
+
expect(sql).toContain('create role iamrole with login')
|
|
62
|
+
expect(sql).toContain('grant rds_iam to iamrole')
|
|
63
|
+
expect(sql[sql.length - 1]).toBe("commit")
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it("should create role without IAM authentication", async () => {
|
|
67
|
+
jest.spyOn(engine as any, "getPassword").mockResolvedValue("test-password")
|
|
68
|
+
|
|
69
|
+
const props = {
|
|
70
|
+
EnableIamAuth: false,
|
|
71
|
+
PasswordArn: "arn:aws:secretsmanager:region:account:secret:name",
|
|
72
|
+
DatabaseName: "testdb",
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const sql = await engine.createRole("passwordrole", props)
|
|
76
|
+
|
|
77
|
+
expect(Array.isArray(sql)).toBe(true)
|
|
78
|
+
expect(sql[0]).toBe("start transaction")
|
|
79
|
+
expect(sql).toContain('create role passwordrole with login password \'test-password\'')
|
|
80
|
+
expect(sql[sql.length - 1]).toBe("commit")
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it("should switch from password to IAM authentication", async () => {
|
|
84
|
+
const oldProps = {
|
|
85
|
+
EnableIamAuth: false,
|
|
86
|
+
PasswordArn: "arn:aws:secretsmanager:region:account:secret:name",
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const newProps = {
|
|
90
|
+
EnableIamAuth: true,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const sql = await engine.updateRole("switchrole", "switchrole", newProps, oldProps)
|
|
94
|
+
|
|
95
|
+
expect(Array.isArray(sql)).toBe(true)
|
|
96
|
+
expect(sql[0]).toBe("start transaction")
|
|
97
|
+
expect(sql).toContain('grant rds_iam to switchrole')
|
|
98
|
+
expect(sql[sql.length - 1]).toBe("commit")
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
it("should switch from IAM to password authentication", async () => {
|
|
102
|
+
jest.spyOn(engine as any, "getPassword").mockResolvedValue("new-password")
|
|
103
|
+
|
|
104
|
+
const oldProps = {
|
|
105
|
+
EnableIamAuth: true,
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const newProps = {
|
|
109
|
+
EnableIamAuth: false,
|
|
110
|
+
PasswordArn: "arn:aws:secretsmanager:region:account:secret:name",
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const sql = await engine.updateRole("switchrole", "switchrole", newProps, oldProps)
|
|
114
|
+
|
|
115
|
+
expect(Array.isArray(sql)).toBe(true)
|
|
116
|
+
expect(sql[0]).toBe("start transaction")
|
|
117
|
+
expect(sql).toContain('revoke rds_iam from switchrole')
|
|
118
|
+
expect(sql).toContain('alter role switchrole with password \'new-password\'')
|
|
119
|
+
expect(sql[sql.length - 1]).toBe("commit")
|
|
120
|
+
})
|
|
121
|
+
})
|
|
49
122
|
})
|
|
50
123
|
|
|
51
124
|
// Add basic tests for other PostgreSQL functionality
|
|
52
125
|
describe("Database", () => {
|
|
53
126
|
it("should generate correct SQL for creating a database", () => {
|
|
54
127
|
const sql = engine.createDatabase("testdb", {})
|
|
55
|
-
expect(sql).toContain('create database
|
|
128
|
+
expect(sql).toContain('create database testdb')
|
|
56
129
|
})
|
|
57
130
|
})
|
|
58
131
|
|
|
@@ -53,33 +53,40 @@ export class PostgresqlEngine extends AbstractEngine {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
async createRole(resourceId: string, props?: any): Promise<string[]> {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
56
|
+
const sql = ["start transaction"]
|
|
57
|
+
|
|
58
|
+
if (props.EnableIamAuth) {
|
|
59
|
+
// Create role for IAM authentication
|
|
60
|
+
sql.push(pgFormat("create role %I with login", resourceId))
|
|
61
|
+
sql.push(pgFormat("grant rds_iam to %I", resourceId))
|
|
62
|
+
} else {
|
|
63
|
+
// Create role with password authentication
|
|
64
|
+
if (!props.PasswordArn) throw "No PasswordArn provided"
|
|
65
|
+
const password = await this.getPassword(props.PasswordArn)
|
|
66
|
+
if (!password) {
|
|
67
|
+
throw `Cannot parse password from ${props.PasswordArn}`
|
|
68
|
+
}
|
|
69
|
+
sql.push(pgFormat("create role %I with login password %L", resourceId, password))
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (props.DatabaseName) {
|
|
73
|
+
sql.push(
|
|
74
|
+
pgFormat(
|
|
75
|
+
`DO $$
|
|
67
76
|
BEGIN
|
|
68
77
|
IF EXISTS (select from pg_database where datname = '%s' and datistemplate = false) THEN
|
|
69
78
|
grant connect on database %I to %I;
|
|
70
79
|
END IF;
|
|
71
80
|
END$$;`,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
)
|
|
81
|
+
props.DatabaseName,
|
|
82
|
+
props.DatabaseName,
|
|
83
|
+
resourceId
|
|
76
84
|
)
|
|
77
|
-
|
|
78
|
-
sql.push("commit")
|
|
79
|
-
return sql
|
|
80
|
-
} else {
|
|
81
|
-
throw `Cannot parse password from ${props.PasswordArn}`
|
|
85
|
+
)
|
|
82
86
|
}
|
|
87
|
+
|
|
88
|
+
sql.push("commit")
|
|
89
|
+
return sql
|
|
83
90
|
}
|
|
84
91
|
|
|
85
92
|
async updateRole(
|
|
@@ -88,72 +95,58 @@ END$$;`,
|
|
|
88
95
|
props?: any,
|
|
89
96
|
oldProps?: any
|
|
90
97
|
): Promise<string[]> {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
sql.push(pgFormat("alter role %I rename to %I", oldResourceId, resourceId))
|
|
97
|
-
}
|
|
98
|
-
sql.push(pgFormat("alter role %I with password %L", resourceId, password))
|
|
99
|
-
// Check if database name has changed
|
|
100
|
-
if (
|
|
101
|
-
oldProps?.DatabaseName &&
|
|
102
|
-
props.DatabaseName &&
|
|
103
|
-
oldProps.DatabaseName !== props.DatabaseName
|
|
104
|
-
) {
|
|
105
|
-
// Revoke from old database
|
|
106
|
-
sql.push(
|
|
107
|
-
pgFormat(
|
|
108
|
-
`DO $$
|
|
109
|
-
BEGIN
|
|
110
|
-
IF EXISTS (select from pg_database where datname = '%s' and datistemplate = false) THEN
|
|
111
|
-
revoke connect on database %I from %I;
|
|
112
|
-
END IF;
|
|
113
|
-
END$$;`,
|
|
114
|
-
oldProps.DatabaseName,
|
|
115
|
-
oldProps.DatabaseName,
|
|
116
|
-
resourceId
|
|
117
|
-
)
|
|
118
|
-
)
|
|
119
|
-
}
|
|
98
|
+
const sql = ["start transaction"]
|
|
99
|
+
|
|
100
|
+
if (oldResourceId !== resourceId) {
|
|
101
|
+
sql.push(pgFormat("alter role %I rename to %I", oldResourceId, resourceId))
|
|
102
|
+
}
|
|
120
103
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
104
|
+
// Handle authentication method changes
|
|
105
|
+
if (props?.EnableIamAuth && !oldProps?.EnableIamAuth) {
|
|
106
|
+
// Switching from password to IAM auth
|
|
107
|
+
sql.push(pgFormat("grant rds_iam to %I", resourceId))
|
|
108
|
+
} else if (!props?.EnableIamAuth && oldProps?.EnableIamAuth) {
|
|
109
|
+
// Switching from IAM to password auth
|
|
110
|
+
sql.push(pgFormat("revoke rds_iam from %I", resourceId))
|
|
111
|
+
if (props?.PasswordArn) {
|
|
112
|
+
const password = await this.getPassword(props.PasswordArn)
|
|
113
|
+
if (!password) {
|
|
114
|
+
throw `Cannot parse password from ${props.PasswordArn}`
|
|
125
115
|
}
|
|
126
|
-
sql.push("
|
|
127
|
-
return sql
|
|
128
|
-
} else {
|
|
129
|
-
throw `Cannot parse password from ${props.PasswordArn}`
|
|
116
|
+
sql.push(pgFormat("alter role %I with password %L", resourceId, password))
|
|
130
117
|
}
|
|
131
|
-
} else {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
118
|
+
} else if (!props?.EnableIamAuth && props?.PasswordArn) {
|
|
119
|
+
// Update password for password auth
|
|
120
|
+
const password = await this.getPassword(props.PasswordArn)
|
|
121
|
+
if (!password) {
|
|
122
|
+
throw `Cannot parse password from ${props.PasswordArn}`
|
|
135
123
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
124
|
+
sql.push(pgFormat("alter role %I with password %L", resourceId, password))
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Check if database name has changed
|
|
128
|
+
if (
|
|
129
|
+
oldProps?.DatabaseName &&
|
|
130
|
+
props?.DatabaseName &&
|
|
131
|
+
oldProps.DatabaseName !== props.DatabaseName
|
|
132
|
+
) {
|
|
133
|
+
// Revoke from old database
|
|
134
|
+
sql.push(
|
|
135
|
+
pgFormat(
|
|
136
|
+
`DO $$
|
|
146
137
|
BEGIN
|
|
147
138
|
IF EXISTS (select from pg_database where datname = '%s' and datistemplate = false) THEN
|
|
148
|
-
|
|
139
|
+
revoke connect on database %I from %I;
|
|
149
140
|
END IF;
|
|
150
141
|
END$$;`,
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
)
|
|
142
|
+
oldProps.DatabaseName,
|
|
143
|
+
oldProps.DatabaseName,
|
|
144
|
+
resourceId
|
|
155
145
|
)
|
|
156
|
-
|
|
146
|
+
)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (props?.DatabaseName) {
|
|
157
150
|
sql.push(
|
|
158
151
|
pgFormat(
|
|
159
152
|
`DO $$
|
|
@@ -167,9 +160,10 @@ END$$;`,
|
|
|
167
160
|
resourceId
|
|
168
161
|
)
|
|
169
162
|
)
|
|
170
|
-
sql.push("commit")
|
|
171
|
-
return sql
|
|
172
163
|
}
|
|
164
|
+
|
|
165
|
+
sql.push("commit")
|
|
166
|
+
return sql
|
|
173
167
|
}
|
|
174
168
|
|
|
175
169
|
deleteRole(resourceId: string, props?: any): string[] {
|
package/lib/database.js
CHANGED
|
@@ -40,5 +40,5 @@ class Database extends aws_cdk_lib_1.CustomResource {
|
|
|
40
40
|
}
|
|
41
41
|
exports.Database = Database;
|
|
42
42
|
_a = JSII_RTTI_SYMBOL_1;
|
|
43
|
-
Database[_a] = { fqn: "cdk-rds-sql.Database", version: "6.
|
|
43
|
+
Database[_a] = { fqn: "cdk-rds-sql.Database", version: "6.1.1" };
|
|
44
44
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNEM7QUFDNUMsMkNBQXNDO0FBQ3RDLGlDQUF1QztBQTJCdkMsTUFBTSxnQkFBaUIsU0FBUSxzQkFBUztJQUd0QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFBO0lBQ3hDLENBQUM7Q0FDRjtBQUVELE1BQWEsUUFBUyxTQUFRLDRCQUFjO0lBQzFDOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFlBQW9CO1FBQ3hFLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3JDLFlBQVksRUFBRSxZQUFZO1NBQzNCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFJRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW9CO1FBQzVELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWTtZQUN6QyxVQUFVLEVBQUU7Z0JBQ1YsUUFBUSxFQUFFLHFCQUFjLENBQUMsUUFBUTtnQkFDakMsVUFBVSxFQUFFLEtBQUssQ0FBQyxZQUFZO2dCQUM5QixTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDMUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUTthQUM3QjtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUE7UUFDdEMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3RDLENBQUM7SUFDSCxDQUFDOztBQTNCSCw0QkE0QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlclwiXG5pbXBvcnQgeyBSb2xlIH0gZnJvbSBcIi4vcm9sZVwiXG5cbmludGVyZmFjZSBEYXRhYmFzZUF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogTmFtZSBvZiBkYXRhYmFzZSB0byBjcmVhdGUuXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZSBvd25lci5cbiAgICovXG4gIHJlYWRvbmx5IG93bmVyPzogUm9sZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlUHJvcHMgZXh0ZW5kcyBEYXRhYmFzZUF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogUHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSBwcm92aWRlcjogUHJvdmlkZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0YWJhc2Uge1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xufVxuXG5jbGFzcyBJbXBvcnRlZERhdGFiYXNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSURhdGFiYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERhdGFiYXNlQXR0cmlidXRlcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcbiAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZSBleHRlbmRzIEN1c3RvbVJlc291cmNlIGltcGxlbWVudHMgSURhdGFiYXNlIHtcbiAgLyoqXG4gICAqIFJldHVybiBhIERhdGFiYXNlIGJhc2VkIHVwb24gbmFtZSBvbmx5LiBVc2UgZm9yIGltcG9ydGluZyBleGlzdGluZyBkYXRhYmFzZXMuXG4gICAqL1xuICBzdGF0aWMgZnJvbURhdGFiYXNlTmFtZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBkYXRhYmFzZU5hbWU6IHN0cmluZyk6IElEYXRhYmFzZSB7XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZERhdGFiYXNlKHNjb3BlLCBpZCwge1xuICAgICAgZGF0YWJhc2VOYW1lOiBkYXRhYmFzZU5hbWUsXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBkYXRhYmFzZU5hbWU6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhYmFzZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgUmVzb3VyY2U6IFJkc1NxbFJlc291cmNlLkRBVEFCQVNFLFxuICAgICAgICBSZXNvdXJjZUlkOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICAgIFNlY3JldEFybjogcHJvcHMucHJvdmlkZXIuc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgT3duZXI6IHByb3BzLm93bmVyPy5yb2xlTmFtZSxcbiAgICAgIH0sXG4gICAgfSlcbiAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5wcm92aWRlcilcbiAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZVxuICAgIGlmIChwcm9wcy5vd25lcikge1xuICAgICAgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMub3duZXIpXG4gICAgfVxuICB9XG59XG4iXX0=
|
package/lib/handler/handler.js
CHANGED
|
@@ -25124,9 +25124,10 @@ var AbstractEngine = class {
|
|
|
25124
25124
|
};
|
|
25125
25125
|
}
|
|
25126
25126
|
/**
|
|
25127
|
-
* Parse password field from secret. Returns void on error.
|
|
25127
|
+
* Parse password field from secret. Returns void on error or if no password field exists.
|
|
25128
25128
|
*/
|
|
25129
25129
|
async getPassword(arn) {
|
|
25130
|
+
if (!arn) return;
|
|
25130
25131
|
const secrets_client2 = new import_client_secrets_manager.SecretsManagerClient({});
|
|
25131
25132
|
const command = new import_client_secrets_manager.GetSecretValueCommand({
|
|
25132
25133
|
SecretId: arn
|
|
@@ -25186,88 +25187,75 @@ var PostgresqlEngine = class extends AbstractEngine {
|
|
|
25186
25187
|
];
|
|
25187
25188
|
}
|
|
25188
25189
|
async createRole(resourceId, props) {
|
|
25189
|
-
|
|
25190
|
-
|
|
25191
|
-
|
|
25192
|
-
|
|
25193
|
-
|
|
25194
|
-
|
|
25195
|
-
|
|
25196
|
-
if (
|
|
25197
|
-
|
|
25198
|
-
|
|
25199
|
-
|
|
25190
|
+
const sql = ["start transaction"];
|
|
25191
|
+
if (props.EnableIamAuth) {
|
|
25192
|
+
sql.push((0, import_node_pg_format.format)("create role %I with login", resourceId));
|
|
25193
|
+
sql.push((0, import_node_pg_format.format)("grant rds_iam to %I", resourceId));
|
|
25194
|
+
} else {
|
|
25195
|
+
if (!props.PasswordArn) throw "No PasswordArn provided";
|
|
25196
|
+
const password = await this.getPassword(props.PasswordArn);
|
|
25197
|
+
if (!password) {
|
|
25198
|
+
throw `Cannot parse password from ${props.PasswordArn}`;
|
|
25199
|
+
}
|
|
25200
|
+
sql.push((0, import_node_pg_format.format)("create role %I with login password %L", resourceId, password));
|
|
25201
|
+
}
|
|
25202
|
+
if (props.DatabaseName) {
|
|
25203
|
+
sql.push(
|
|
25204
|
+
(0, import_node_pg_format.format)(
|
|
25205
|
+
`DO $$
|
|
25200
25206
|
BEGIN
|
|
25201
25207
|
IF EXISTS (select from pg_database where datname = '%s' and datistemplate = false) THEN
|
|
25202
25208
|
grant connect on database %I to %I;
|
|
25203
25209
|
END IF;
|
|
25204
25210
|
END$$;`,
|
|
25205
|
-
|
|
25206
|
-
|
|
25207
|
-
|
|
25208
|
-
|
|
25209
|
-
|
|
25210
|
-
}
|
|
25211
|
-
sql.push("commit");
|
|
25212
|
-
return sql;
|
|
25213
|
-
} else {
|
|
25214
|
-
throw `Cannot parse password from ${props.PasswordArn}`;
|
|
25211
|
+
props.DatabaseName,
|
|
25212
|
+
props.DatabaseName,
|
|
25213
|
+
resourceId
|
|
25214
|
+
)
|
|
25215
|
+
);
|
|
25215
25216
|
}
|
|
25217
|
+
sql.push("commit");
|
|
25218
|
+
return sql;
|
|
25216
25219
|
}
|
|
25217
25220
|
async updateRole(resourceId, oldResourceId, props, oldProps) {
|
|
25218
|
-
|
|
25219
|
-
|
|
25220
|
-
|
|
25221
|
-
|
|
25222
|
-
|
|
25223
|
-
|
|
25221
|
+
const sql = ["start transaction"];
|
|
25222
|
+
if (oldResourceId !== resourceId) {
|
|
25223
|
+
sql.push((0, import_node_pg_format.format)("alter role %I rename to %I", oldResourceId, resourceId));
|
|
25224
|
+
}
|
|
25225
|
+
if (props?.EnableIamAuth && !oldProps?.EnableIamAuth) {
|
|
25226
|
+
sql.push((0, import_node_pg_format.format)("grant rds_iam to %I", resourceId));
|
|
25227
|
+
} else if (!props?.EnableIamAuth && oldProps?.EnableIamAuth) {
|
|
25228
|
+
sql.push((0, import_node_pg_format.format)("revoke rds_iam from %I", resourceId));
|
|
25229
|
+
if (props?.PasswordArn) {
|
|
25230
|
+
const password = await this.getPassword(props.PasswordArn);
|
|
25231
|
+
if (!password) {
|
|
25232
|
+
throw `Cannot parse password from ${props.PasswordArn}`;
|
|
25224
25233
|
}
|
|
25225
25234
|
sql.push((0, import_node_pg_format.format)("alter role %I with password %L", resourceId, password));
|
|
25226
|
-
if (oldProps?.DatabaseName && props.DatabaseName && oldProps.DatabaseName !== props.DatabaseName) {
|
|
25227
|
-
sql.push(
|
|
25228
|
-
(0, import_node_pg_format.format)(
|
|
25229
|
-
`DO $$
|
|
25230
|
-
BEGIN
|
|
25231
|
-
IF EXISTS (select from pg_database where datname = '%s' and datistemplate = false) THEN
|
|
25232
|
-
revoke connect on database %I from %I;
|
|
25233
|
-
END IF;
|
|
25234
|
-
END$$;`,
|
|
25235
|
-
oldProps.DatabaseName,
|
|
25236
|
-
oldProps.DatabaseName,
|
|
25237
|
-
resourceId
|
|
25238
|
-
)
|
|
25239
|
-
);
|
|
25240
|
-
}
|
|
25241
|
-
if (props.DatabaseName) {
|
|
25242
|
-
sql.push(
|
|
25243
|
-
(0, import_node_pg_format.format)("grant connect on database %I to %I", props.DatabaseName, resourceId)
|
|
25244
|
-
);
|
|
25245
|
-
}
|
|
25246
|
-
sql.push("commit");
|
|
25247
|
-
return sql;
|
|
25248
|
-
} else {
|
|
25249
|
-
throw `Cannot parse password from ${props.PasswordArn}`;
|
|
25250
25235
|
}
|
|
25251
|
-
} else {
|
|
25252
|
-
const
|
|
25253
|
-
if (
|
|
25254
|
-
|
|
25236
|
+
} else if (!props?.EnableIamAuth && props?.PasswordArn) {
|
|
25237
|
+
const password = await this.getPassword(props.PasswordArn);
|
|
25238
|
+
if (!password) {
|
|
25239
|
+
throw `Cannot parse password from ${props.PasswordArn}`;
|
|
25255
25240
|
}
|
|
25256
|
-
|
|
25257
|
-
|
|
25258
|
-
|
|
25259
|
-
|
|
25241
|
+
sql.push((0, import_node_pg_format.format)("alter role %I with password %L", resourceId, password));
|
|
25242
|
+
}
|
|
25243
|
+
if (oldProps?.DatabaseName && props?.DatabaseName && oldProps.DatabaseName !== props.DatabaseName) {
|
|
25244
|
+
sql.push(
|
|
25245
|
+
(0, import_node_pg_format.format)(
|
|
25246
|
+
`DO $$
|
|
25260
25247
|
BEGIN
|
|
25261
25248
|
IF EXISTS (select from pg_database where datname = '%s' and datistemplate = false) THEN
|
|
25262
|
-
|
|
25249
|
+
revoke connect on database %I from %I;
|
|
25263
25250
|
END IF;
|
|
25264
25251
|
END$$;`,
|
|
25265
|
-
|
|
25266
|
-
|
|
25267
|
-
|
|
25268
|
-
|
|
25269
|
-
|
|
25270
|
-
|
|
25252
|
+
oldProps.DatabaseName,
|
|
25253
|
+
oldProps.DatabaseName,
|
|
25254
|
+
resourceId
|
|
25255
|
+
)
|
|
25256
|
+
);
|
|
25257
|
+
}
|
|
25258
|
+
if (props?.DatabaseName) {
|
|
25271
25259
|
sql.push(
|
|
25272
25260
|
(0, import_node_pg_format.format)(
|
|
25273
25261
|
`DO $$
|
|
@@ -25281,9 +25269,9 @@ END$$;`,
|
|
|
25281
25269
|
resourceId
|
|
25282
25270
|
)
|
|
25283
25271
|
);
|
|
25284
|
-
sql.push("commit");
|
|
25285
|
-
return sql;
|
|
25286
25272
|
}
|
|
25273
|
+
sql.push("commit");
|
|
25274
|
+
return sql;
|
|
25287
25275
|
}
|
|
25288
25276
|
deleteRole(resourceId, props) {
|
|
25289
25277
|
return [
|
|
@@ -25414,24 +25402,35 @@ var MysqlEngine = class extends AbstractEngine {
|
|
|
25414
25402
|
return [`DROP DATABASE IF EXISTS \`${resourceId}\``];
|
|
25415
25403
|
}
|
|
25416
25404
|
async createRole(resourceId, props) {
|
|
25417
|
-
|
|
25418
|
-
|
|
25419
|
-
|
|
25420
|
-
|
|
25421
|
-
|
|
25422
|
-
|
|
25405
|
+
const sql = [];
|
|
25406
|
+
if (props.EnableIamAuth) {
|
|
25407
|
+
sql.push(
|
|
25408
|
+
`CREATE USER IF NOT EXISTS '${resourceId}'@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'`
|
|
25409
|
+
);
|
|
25410
|
+
} else {
|
|
25411
|
+
if (!props.PasswordArn) throw new Error("No PasswordArn provided");
|
|
25412
|
+
const password = await this.getPassword(props.PasswordArn);
|
|
25413
|
+
if (!password) throw `Cannot parse password from ${props.PasswordArn}`;
|
|
25414
|
+
sql.push(
|
|
25415
|
+
`CREATE USER IF NOT EXISTS '${resourceId}'@'%' IDENTIFIED BY '${password}'`
|
|
25416
|
+
);
|
|
25417
|
+
}
|
|
25423
25418
|
if (props.DatabaseName) {
|
|
25424
25419
|
sql.push(
|
|
25425
25420
|
`GRANT ALL PRIVILEGES ON \`${props.DatabaseName}\`.* TO '${resourceId}'@'%'`
|
|
25426
25421
|
);
|
|
25427
|
-
sql.push(`FLUSH PRIVILEGES`);
|
|
25428
25422
|
}
|
|
25423
|
+
sql.push(`FLUSH PRIVILEGES`);
|
|
25429
25424
|
return sql;
|
|
25430
25425
|
}
|
|
25431
25426
|
async updateRole(resourceId, oldResourceId, props, oldProps) {
|
|
25432
25427
|
const sql = [];
|
|
25433
25428
|
if (oldResourceId !== resourceId) {
|
|
25434
|
-
if (props?.
|
|
25429
|
+
if (props?.EnableIamAuth) {
|
|
25430
|
+
sql.push(
|
|
25431
|
+
`CREATE USER IF NOT EXISTS '${resourceId}'@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'`
|
|
25432
|
+
);
|
|
25433
|
+
} else if (props?.PasswordArn) {
|
|
25435
25434
|
const password = await this.getPassword(props.PasswordArn);
|
|
25436
25435
|
if (!password) throw `Cannot parse password from ${props.PasswordArn}`;
|
|
25437
25436
|
sql.push(
|
|
@@ -25442,10 +25441,24 @@ var MysqlEngine = class extends AbstractEngine {
|
|
|
25442
25441
|
sql.push(`ALTER USER '${resourceId}'@'%' PASSWORD EXPIRE`);
|
|
25443
25442
|
}
|
|
25444
25443
|
sql.push(`DROP USER IF EXISTS '${oldResourceId}'@'%'`);
|
|
25445
|
-
} else
|
|
25446
|
-
|
|
25447
|
-
|
|
25448
|
-
|
|
25444
|
+
} else {
|
|
25445
|
+
if (props?.EnableIamAuth && !oldProps?.EnableIamAuth) {
|
|
25446
|
+
sql.push(`DROP USER IF EXISTS '${resourceId}'@'%'`);
|
|
25447
|
+
sql.push(
|
|
25448
|
+
`CREATE USER '${resourceId}'@'%' IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS'`
|
|
25449
|
+
);
|
|
25450
|
+
} else if (!props?.EnableIamAuth && oldProps?.EnableIamAuth) {
|
|
25451
|
+
sql.push(`DROP USER IF EXISTS '${resourceId}'@'%'`);
|
|
25452
|
+
if (props?.PasswordArn) {
|
|
25453
|
+
const password = await this.getPassword(props.PasswordArn);
|
|
25454
|
+
if (!password) throw `Cannot parse password from ${props.PasswordArn}`;
|
|
25455
|
+
sql.push(`CREATE USER '${resourceId}'@'%' IDENTIFIED BY '${password}'`);
|
|
25456
|
+
}
|
|
25457
|
+
} else if (!props?.EnableIamAuth && props?.PasswordArn) {
|
|
25458
|
+
const password = await this.getPassword(props.PasswordArn);
|
|
25459
|
+
if (!password) throw `Cannot parse password from ${props.PasswordArn}`;
|
|
25460
|
+
sql.push(`ALTER USER '${resourceId}'@'%' IDENTIFIED BY '${password}'`);
|
|
25461
|
+
}
|
|
25449
25462
|
}
|
|
25450
25463
|
if (oldProps?.DatabaseName && props?.DatabaseName && oldProps.DatabaseName !== props.DatabaseName) {
|
|
25451
25464
|
sql.push(
|
package/lib/provider.js
CHANGED
|
@@ -131,7 +131,7 @@ class Provider extends constructs_1.Construct {
|
|
|
131
131
|
}
|
|
132
132
|
exports.Provider = Provider;
|
|
133
133
|
_a = JSII_RTTI_SYMBOL_1;
|
|
134
|
-
Provider[_a] = { fqn: "cdk-rds-sql.Provider", version: "6.
|
|
134
|
+
Provider[_a] = { fqn: "cdk-rds-sql.Provider", version: "6.1.1" };
|
|
135
135
|
function slugify(x) {
|
|
136
136
|
return x.replace(/[^a-zA-Z0-9]/g, "");
|
|
137
137
|
}
|
|
@@ -33,6 +33,12 @@ export interface RoleProps {
|
|
|
33
33
|
* @default no connection to any database is granted
|
|
34
34
|
*/
|
|
35
35
|
readonly databaseName?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Enable IAM authentication for this role.
|
|
38
|
+
*
|
|
39
|
+
* @default false - use password authentication
|
|
40
|
+
*/
|
|
41
|
+
readonly enableIamAuth?: boolean;
|
|
36
42
|
}
|
|
37
43
|
export declare class Role extends CustomResource {
|
|
38
44
|
constructor(scope: Construct, id: string, props: RoleProps);
|
|
@@ -15,6 +15,7 @@ class Role extends aws_cdk_lib_1.CustomResource {
|
|
|
15
15
|
SecretArn: props.provider.secret.secretArn,
|
|
16
16
|
PasswordArn: props.passwordArn,
|
|
17
17
|
DatabaseName: props.database ? props.database.databaseName : props.databaseName,
|
|
18
|
+
EnableIamAuth: props.enableIamAuth || false,
|
|
18
19
|
},
|
|
19
20
|
});
|
|
20
21
|
this.node.addDependency(props.provider);
|
|
@@ -23,4 +24,4 @@ class Role extends aws_cdk_lib_1.CustomResource {
|
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
26
|
exports.Role = Role;
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5jdXN0b20tcmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcm9sZS5jdXN0b20tcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTRDO0FBRzVDLGlDQUF1QztBQStDdkMsTUFBYSxJQUFLLFNBQVEsNEJBQWM7SUFDdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQjtRQUN4RCxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFlBQVk7WUFDdEMsTUFBTSx5Q0FBeUMsQ0FBQTtRQUNqRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVk7WUFDekMsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxxQkFBYyxDQUFDLElBQUk7Z0JBQzdCLFVBQVUsRUFBRSxLQUFLLENBQUMsUUFBUTtnQkFDMUIsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVM7Z0JBQzFDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWTtnQkFDL0UsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSzthQUM1QztTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QyxJQUFJLEtBQUssQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzdELENBQUM7Q0FDRjtBQWxCRCxvQkFrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBJRGF0YWJhc2UgfSBmcm9tIFwiLi9kYXRhYmFzZVwiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlclwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZVByb3BzIHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IFByb3ZpZGVyXG5cbiAgLyoqXG4gICAqIFNRTC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogQSBuZXcgc2VjcmV0IGlzIGNyZWF0ZWQgZm9yIHRoaXMgdXNlci5cbiAgICpcbiAgICogT3B0aW9uYWxseSBlbmNyeXB0IGl0IHdpdGggdGhlIGdpdmVuIGtleS5cbiAgICovXG4gIHJlYWRvbmx5IHBhc3N3b3JkQXJuOiBzdHJpbmdcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGF0YWJhc2UgdGhpcyB1c2VyIGlzIGV4cGVjdGVkIHRvIHVzZS5cbiAgICpcbiAgICogU3BlY2lmeSBub25lIG9mIGBkYXRhYmFzZWAgb3IgYGRhdGFiYXNlTmFtZWAgb3Igb25seSBvbmUgb2YgdGhlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgbm8gY29ubmVjdGlvbiB0byBhbnkgZGF0YWJhc2UgaXMgZ3JhbnRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U/OiBJRGF0YWJhc2VcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGF0YWJhc2UgbmFtZSB0aGlzIHVzZXIgaXMgZXhwZWN0ZWQgdG8gdXNlLlxuICAgKlxuICAgKiBTcGVjaWZ5IG5vbmUgb2YgYGRhdGFiYXNlYCBvciBgZGF0YWJhc2VOYW1lYCBvciBvbmx5IG9uZSBvZiB0aGVtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBubyBjb25uZWN0aW9uIHRvIGFueSBkYXRhYmFzZSBpcyBncmFudGVkXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU/OiBzdHJpbmdcblxuICAvKipcbiAgICogRW5hYmxlIElBTSBhdXRoZW50aWNhdGlvbiBmb3IgdGhpcyByb2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZSAtIHVzZSBwYXNzd29yZCBhdXRoZW50aWNhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlSWFtQXV0aD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNsYXNzIFJvbGUgZXh0ZW5kcyBDdXN0b21SZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSb2xlUHJvcHMpIHtcbiAgICBpZiAocHJvcHMuZGF0YWJhc2UgJiYgcHJvcHMuZGF0YWJhc2VOYW1lKVxuICAgICAgdGhyb3cgXCJTcGVjaWZ5IGVpdGhlciBkYXRhYmFzZSBvciBkYXRhYmFzZU5hbWVcIlxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFJlc291cmNlOiBSZHNTcWxSZXNvdXJjZS5ST0xFLFxuICAgICAgICBSZXNvdXJjZUlkOiBwcm9wcy5yb2xlTmFtZSxcbiAgICAgICAgU2VjcmV0QXJuOiBwcm9wcy5wcm92aWRlci5zZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgICBQYXNzd29yZEFybjogcHJvcHMucGFzc3dvcmRBcm4sXG4gICAgICAgIERhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2UgPyBwcm9wcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUgOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICAgIEVuYWJsZUlhbUF1dGg6IHByb3BzLmVuYWJsZUlhbUF1dGggfHwgZmFsc2UsXG4gICAgICB9LFxuICAgIH0pXG4gICAgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMucHJvdmlkZXIpXG4gICAgaWYgKHByb3BzLmRhdGFiYXNlKSB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5kYXRhYmFzZSlcbiAgfVxufVxuIl19
|
package/lib/role.d.ts
CHANGED
|
@@ -58,6 +58,16 @@ export interface RoleProps {
|
|
|
58
58
|
* @default - credentials are only stored in Secrets Manager
|
|
59
59
|
*/
|
|
60
60
|
readonly parameterPrefix?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Enable IAM authentication for this role.
|
|
63
|
+
*
|
|
64
|
+
* When enabled, the role will be created without a password and
|
|
65
|
+
* configured for AWS IAM database authentication. The secret
|
|
66
|
+
* will not contain a password field.
|
|
67
|
+
*
|
|
68
|
+
* @default false - use password authentication
|
|
69
|
+
*/
|
|
70
|
+
readonly enableIamAuth?: boolean;
|
|
61
71
|
}
|
|
62
72
|
export declare class Role extends Construct {
|
|
63
73
|
/**
|
package/lib/role.js
CHANGED
|
@@ -63,23 +63,32 @@ class Role extends constructs_1.Construct {
|
|
|
63
63
|
const identifier = props.provider.cluster.clusterIdentifier
|
|
64
64
|
? props.provider.cluster.clusterIdentifier
|
|
65
65
|
: props.provider.cluster.instanceIdentifier;
|
|
66
|
+
const secretTemplate = {
|
|
67
|
+
dbClusterIdentifier: identifier,
|
|
68
|
+
engine: props.provider.engine,
|
|
69
|
+
host: host,
|
|
70
|
+
port: port,
|
|
71
|
+
username: props.roleName,
|
|
72
|
+
dbname: props.database ? props.database.databaseName : props.databaseName,
|
|
73
|
+
};
|
|
66
74
|
this.secret = new aws_secretsmanager_1.Secret(this, "Secret", {
|
|
67
75
|
secretName: props.secretName,
|
|
68
76
|
encryptionKey: props.encryptionKey,
|
|
69
|
-
description: `Generated secret for
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
description: `Generated secret for ${props.provider.engine} role ${props.roleName}`,
|
|
78
|
+
...(props.enableIamAuth
|
|
79
|
+
? {
|
|
80
|
+
// For IAM auth, create secret without password generation
|
|
81
|
+
secretStringTemplate: JSON.stringify(secretTemplate),
|
|
82
|
+
}
|
|
83
|
+
: {
|
|
84
|
+
// For password auth, generate password
|
|
85
|
+
generateSecretString: {
|
|
86
|
+
passwordLength: 30, // Oracle password cannot have more than 30 characters
|
|
87
|
+
secretStringTemplate: JSON.stringify(secretTemplate),
|
|
88
|
+
generateStringKey: "password",
|
|
89
|
+
excludeCharacters: " %+~`#$&*()|[]{}:;<>?!'/@\"\\",
|
|
90
|
+
},
|
|
79
91
|
}),
|
|
80
|
-
generateStringKey: "password",
|
|
81
|
-
excludeCharacters: " %+~`#$&*()|[]{}:;<>?!'/@\"\\",
|
|
82
|
-
},
|
|
83
92
|
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
84
93
|
});
|
|
85
94
|
// Create Parameters if parameterPrefix is provided
|
|
@@ -95,7 +104,7 @@ class Role extends constructs_1.Construct {
|
|
|
95
104
|
new Parameters(this, "Parameters", {
|
|
96
105
|
secretArn: props.provider.secret.secretArn,
|
|
97
106
|
parameterPrefix: props.parameterPrefix,
|
|
98
|
-
passwordArn: this.secret.secretArn,
|
|
107
|
+
passwordArn: props.enableIamAuth ? "" : this.secret.secretArn,
|
|
99
108
|
providerServiceToken: props.provider.serviceToken,
|
|
100
109
|
provider: props.provider,
|
|
101
110
|
paramData,
|
|
@@ -104,9 +113,10 @@ class Role extends constructs_1.Construct {
|
|
|
104
113
|
const role = new role_custom_resource_1.Role(this, "PostgresRole", {
|
|
105
114
|
provider: props.provider,
|
|
106
115
|
roleName: props.roleName,
|
|
107
|
-
passwordArn: this.secret.secretArn,
|
|
116
|
+
passwordArn: props.enableIamAuth ? "" : this.secret.secretArn,
|
|
108
117
|
database: props.database,
|
|
109
118
|
databaseName: props.databaseName,
|
|
119
|
+
enableIamAuth: props.enableIamAuth,
|
|
110
120
|
});
|
|
111
121
|
role.node.addDependency(this.secret);
|
|
112
122
|
this.roleName = props.roleName;
|
|
@@ -119,5 +129,5 @@ class Role extends constructs_1.Construct {
|
|
|
119
129
|
}
|
|
120
130
|
exports.Role = Role;
|
|
121
131
|
_a = JSII_RTTI_SYMBOL_1;
|
|
122
|
-
Role[_a] = { fqn: "cdk-rds-sql.Role", version: "6.
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQWtFO0FBQ2xFLDJDQUEwQztBQUcxQyx1RUFBZ0U7QUFDaEUsMkNBQTBDO0FBQzFDLDJDQUFzQztBQUV0QyxpQ0FBdUM7QUFFdkMsaUVBQW1FO0FBaUVuRSw4Q0FBOEM7QUFDOUMsTUFBTSxVQUFXLFNBQVEsc0JBQVM7SUFDaEMsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FPQztRQUVELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsNENBQTRDO1FBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDdkQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxHQUFHLEVBQUUsRUFBRTtvQkFDaEQsYUFBYSxFQUFFLEdBQUcsS0FBSyxDQUFDLGVBQWUsR0FBRyxHQUFHLEVBQUU7b0JBQy9DLFdBQVcsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFO2lCQUM5QixDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFFRiw2REFBNkQ7UUFDN0QsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLEtBQUssQ0FBQyxlQUFlLFVBQVUsQ0FBQTtRQUNoRSxNQUFNLGtCQUFrQixHQUFHLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDdkUsWUFBWSxFQUFFLEtBQUssQ0FBQyxvQkFBb0I7WUFDeEMsVUFBVSxFQUFFO2dCQUNWLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsUUFBUSxFQUFFLHFCQUFjLENBQUMsa0JBQWtC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QUU7WUFDeEQsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1lBQ2xDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7U0FDakMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQTtRQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzdDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QixnREFBZ0Q7WUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDaEUsQ0FBQztJQUNILENBQUM7O0FBMUZILG9CQTJGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1c3RvbVJlc291cmNlLCBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMga21zIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCJcbmltcG9ydCB7IElEYXRhYmFzZUNsdXN0ZXIsIElEYXRhYmFzZUluc3RhbmNlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIlxuaW1wb3J0IHsgSVNlY3JldCwgU2VjcmV0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiXG5pbXBvcnQgKiBhcyBzc20gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zc21cIlxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0IHsgSURhdGFiYXNlIH0gZnJvbSBcIi4vZGF0YWJhc2VcIlxuaW1wb3J0IHsgUmRzU3FsUmVzb3VyY2UgfSBmcm9tIFwiLi9lbnVtXCJcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcIi4vcHJvdmlkZXJcIlxuaW1wb3J0IHsgUm9sZSBhcyBDdXN0b21SZXNvdXJjZVJvbGUgfSBmcm9tIFwiLi9yb2xlLmN1c3RvbS1yZXNvdXJjZVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZVByb3BzIHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXI6IFByb3ZpZGVyXG5cbiAgLyoqXG4gICAqIFNRTC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGF0YWJhc2UgdGhpcyB1c2VyIGlzIGV4cGVjdGVkIHRvIHVzZS5cbiAgICpcbiAgICogSWYgdGhlIGRhdGFiYXNlIGV4aXN0cywgY29ubmVjdCBwcml2aWxlZ2VzIGFyZSBncmFudGVkLlxuICAgKlxuICAgKiBTcGVjaWZ5IG9uZSBvZiBgZGF0YWJhc2VgIG9yIGBkYXRhYmFzZU5hbWVgLiBUaGlzIGlzIHRoZSBuYW1lXG4gICAqIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHJvbGUncyBzZWNyZXQgYXMgdGhlIGRhdGFiYXNlIG5hbWUgdG9cbiAgICogdXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U/OiBJRGF0YWJhc2VcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGF0YWJhc2UgbmFtZSB0aGlzIHVzZXIgaXMgZXhwZWN0ZWQgdG8gdXNlLlxuICAgKlxuICAgKiBJZiB0aGUgZGF0YWJhc2UgZXhpc3RzLCBjb25uZWN0IHByaXZpbGVnZXMgYXJlIGdyYW50ZWQuXG4gICAqXG4gICAqIFNwZWNpZnkgb25lIG9mIGBkYXRhYmFzZWAgb3IgYGRhdGFiYXNlTmFtZWAuIFRoaXMgaXMgdGhlIG5hbWVcbiAgICogdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcm9sZSdzIHNlY3JldCBhcyB0aGUgZGF0YWJhc2UgbmFtZSB0b1xuICAgKiB1c2UuXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZU5hbWU/OiBzdHJpbmdcblxuICAvKipcbiAgICogQSBuZXcgc2VjcmV0IGlzIGNyZWF0ZWQgZm9yIHRoaXMgdXNlci5cbiAgICpcbiAgICogT3B0aW9uYWxseSBlbmNyeXB0IGl0IHdpdGggdGhlIGdpdmVuIGtleS5cbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleVxuXG4gIC8qKlxuICAgKiBBIG5ldyBzZWNyZXQgaXMgY3JlYXRlZCBmb3IgdGhpcyB1c2VyLlxuICAgKlxuICAgKiBPcHRpb25hbGx5IGFkZCBzZWNyZXQgbmFtZSB0byB0aGUgc2VjcmV0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0TmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBQcmVmaXggZm9yIFNTTSBwYXJhbWV0ZXJzIHRvIHN0b3JlIGNyZWRlbnRpYWxzIGluIFBhcmFtZXRlciBTdG9yZS5cbiAgICogV2hlbiBkZWZpbmVkLCBjcmVkZW50aWFscyB3aWxsIGFsc28gYmUgc3RvcmVkIGFzIHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIFRoZSBwYXJhbWV0ZXIgbmFtZXMgc3VjaCBhcyBcInBhc3N3b3JkXCIgaXMgc2ltcGx5IGFwcGVuZGVkIHRvXG4gICAqIGBwYXJhbWV0ZXJQcmVmaXhgLCBzbyBtYWtlIHN1cmUgdGhlIHByZWZpeCBlbmRzIHdpdGggYSBzbGFzaCBpZlxuICAgKiAgeW91IGhhdmUgeW91ciBwYXJhbWV0ZXIgbmFtZXMgc2xhc2ggc2VwYXJhdGVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIHBhc3N3b3JkIGZyb20gdGhlIHNlY3JldCBpcyBjb3BpZWQganVzdCBvbmNlLCB0aGV5XG4gICAqIGFyZSBub3Qga2VwdCBpbiBzeW5jLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGNyZWRlbnRpYWxzIGFyZSBvbmx5IHN0b3JlZCBpbiBTZWNyZXRzIE1hbmFnZXJcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlclByZWZpeD86IHN0cmluZ1xufVxuXG4vLyBQcml2YXRlIFBhcmFtZXRlcnMgY29uc3RydWN0IChub3QgZXhwb3J0ZWQpXG5jbGFzcyBQYXJhbWV0ZXJzIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiB7XG4gICAgICBwcm92aWRlcjogUHJvdmlkZXJcbiAgICAgIHNlY3JldEFybjogc3RyaW5nXG4gICAgICBwYXJhbWV0ZXJQcmVmaXg6IHN0cmluZ1xuICAgICAgcGFzc3dvcmRBcm46IHN0cmluZ1xuICAgICAgcHJvdmlkZXJTZXJ2aWNlVG9rZW46IHN0cmluZ1xuICAgICAgcGFyYW1EYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgfVxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICAvLyBDcmVhdGUgcGFyYW1ldGVycyBmb3IgZWFjaCBrZXktdmFsdWUgcGFpclxuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzLnBhcmFtRGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXcgc3NtLlN0cmluZ1BhcmFtZXRlcih0aGlzLCBgUGFyYW1ldGVyLSR7a2V5fWAsIHtcbiAgICAgICAgICBwYXJhbWV0ZXJOYW1lOiBgJHtwcm9wcy5wYXJhbWV0ZXJQcmVmaXh9JHtrZXl9YCxcbiAgICAgICAgICBzdHJpbmdWYWx1ZTogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gRm9yIHBhc3N3b3JkLCB1c2UgdGhlIGV4aXN0aW5nIHByb3ZpZGVyIHRvIHN0b3JlIGl0IGluIFNTTVxuICAgIGNvbnN0IHBhc3N3b3JkUGFyYW1ldGVyTmFtZSA9IGAke3Byb3BzLnBhcmFtZXRlclByZWZpeH1wYXNzd29yZGBcbiAgICBjb25zdCBwYXNzd29yZF9wYXJhbWV0ZXIgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJQYXNzd29yZFBhcmFtZXRlclwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyU2VydmljZVRva2VuLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBTZWNyZXRBcm46IHByb3BzLnNlY3JldEFybixcbiAgICAgICAgUmVzb3VyY2U6IFJkc1NxbFJlc291cmNlLlBBUkFNRVRFUl9QQVNTV09SRCxcbiAgICAgICAgUGFzc3dvcmRBcm46IHByb3BzLnBhc3N3b3JkQXJuLFxuICAgICAgICBQYXJhbWV0ZXJOYW1lOiBwYXNzd29yZFBhcmFtZXRlck5hbWUsXG4gICAgICB9LFxuICAgIH0pXG4gICAgcGFzc3dvcmRfcGFyYW1ldGVyLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5wcm92aWRlcilcblxuICAgIGNvbnN0IHBhcmFtQXJuID0gYGFybjphd3M6c3NtOiR7U3RhY2sub2YodGhpcykucmVnaW9ufToke1xuICAgICAgU3RhY2sub2YodGhpcykuYWNjb3VudFxuICAgIH06cGFyYW1ldGVyJHtcbiAgICAgIHBhc3N3b3JkUGFyYW1ldGVyTmFtZS5zdGFydHNXaXRoKFwiL1wiKSA/IFwiXCIgOiBcIi9cIlxuICAgIH0ke3Bhc3N3b3JkUGFyYW1ldGVyTmFtZX1gXG5cbiAgICBwcm9wcy5wcm92aWRlci5oYW5kbGVyLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3NtOlB1dFBhcmFtZXRlclwiLCBcInNzbTpBZGRUYWdzVG9SZXNvdXJjZVwiLCBcInNzbTpHZXRQYXJhbWV0ZXJzXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtwYXJhbUFybl0sXG4gICAgICB9KVxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUm9sZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgcm9sZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogVGhlIGdlbmVyYXRlZCBzZWNyZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0OiBJU2VjcmV0XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJvbGVQcm9wcykge1xuICAgIGlmIChwcm9wcy5kYXRhYmFzZSAmJiBwcm9wcy5kYXRhYmFzZU5hbWUpIHtcbiAgICAgIHRocm93IFwiU3BlY2lmeSBlaXRoZXIgZGF0YWJhc2Ugb3IgZGF0YWJhc2VOYW1lXCJcbiAgICB9XG4gICAgaWYgKCFwcm9wcy5kYXRhYmFzZSAmJiAhcHJvcHMuZGF0YWJhc2VOYW1lKSB7XG4gICAgICAvLyBJZiBuZWl0aGVyIGlzIHNwZWNpZmllZCwgd2UgbWlnaHQgbmVlZCBhIGRlZmF1bHQgb3IgdGhyb3cgYW4gZXJyb3IgZGVwZW5kaW5nIG9uIGRlc2lyZWQgYmVoYXZpb3IuXG4gICAgICAvLyBGb3Igbm93LCBsZXQncyBhc3N1bWUgaXQncyBhbGxvd2VkIGJ1dCB0aGUgc2VjcmV0IHdvbid0IGhhdmUgYSBkYm5hbWUuXG4gICAgICAvLyBJZiBpdCBzaG91bGQgYmUgcmVxdWlyZWQsIHVuY29tbWVudCB0aGUgbGluZSBiZWxvdzpcbiAgICAgIHRocm93IFwiU3BlY2lmeSBlaXRoZXIgZGF0YWJhc2Ugb3IgZGF0YWJhc2VOYW1lXCJcbiAgICB9XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgY29uc3QgaG9zdCA9IChwcm9wcy5wcm92aWRlci5jbHVzdGVyIGFzIElEYXRhYmFzZUNsdXN0ZXIpLmNsdXN0ZXJFbmRwb2ludFxuICAgICAgPyAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VDbHVzdGVyKS5jbHVzdGVyRW5kcG9pbnQuaG9zdG5hbWVcbiAgICAgIDogKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlSW5zdGFuY2UpLmluc3RhbmNlRW5kcG9pbnQuaG9zdG5hbWVcblxuICAgIGNvbnN0IHBvcnQgPSAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VDbHVzdGVyKS5jbHVzdGVyRW5kcG9pbnRcbiAgICAgID8gKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlcikuY2x1c3RlckVuZHBvaW50LnBvcnRcbiAgICAgIDogKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlSW5zdGFuY2UpLmluc3RhbmNlRW5kcG9pbnQucG9ydFxuXG4gICAgY29uc3QgaWRlbnRpZmllciA9IChwcm9wcy5wcm92aWRlci5jbHVzdGVyIGFzIElEYXRhYmFzZUNsdXN0ZXIpLmNsdXN0ZXJJZGVudGlmaWVyXG4gICAgICA/IChwcm9wcy5wcm92aWRlci5jbHVzdGVyIGFzIElEYXRhYmFzZUNsdXN0ZXIpLmNsdXN0ZXJJZGVudGlmaWVyXG4gICAgICA6IChwcm9wcy5wcm92aWRlci5jbHVzdGVyIGFzIElEYXRhYmFzZUluc3RhbmNlKS5pbnN0YW5jZUlkZW50aWZpZXJcblxuICAgIHRoaXMuc2VjcmV0ID0gbmV3IFNlY3JldCh0aGlzLCBcIlNlY3JldFwiLCB7XG4gICAgICBzZWNyZXROYW1lOiBwcm9wcy5zZWNyZXROYW1lLFxuICAgICAgZW5jcnlwdGlvbktleTogcHJvcHMuZW5jcnlwdGlvbktleSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgR2VuZXJhdGVkIHNlY3JldCBmb3IgcG9zdGdyZXMgcm9sZSAke3Byb3BzLnJvbGVOYW1lfWAsXG4gICAgICBnZW5lcmF0ZVNlY3JldFN0cmluZzoge1xuICAgICAgICBwYXNzd29yZExlbmd0aDogMzAsIC8vIE9yYWNsZSBwYXNzd29yZCBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMzAgY2hhcmFjdGVyc1xuICAgICAgICBzZWNyZXRTdHJpbmdUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGRiQ2x1c3RlcklkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgICAgZW5naW5lOiBwcm9wcy5wcm92aWRlci5lbmdpbmUsXG4gICAgICAgICAgaG9zdDogaG9zdCxcbiAgICAgICAgICBwb3J0OiBwb3J0LFxuICAgICAgICAgIHVzZXJuYW1lOiBwcm9wcy5yb2xlTmFtZSxcbiAgICAgICAgICBkYm5hbWU6IHByb3BzLmRhdGFiYXNlID8gcHJvcHMuZGF0YWJhc2UuZGF0YWJhc2VOYW1lIDogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICB9KSxcbiAgICAgICAgZ2VuZXJhdGVTdHJpbmdLZXk6IFwicGFzc3dvcmRcIixcbiAgICAgICAgZXhjbHVkZUNoYXJhY3RlcnM6IFwiICUrfmAjJCYqKCl8W117fTo7PD4/IScvQFxcXCJcXFxcXCIsXG4gICAgICB9LFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pXG5cbiAgICAvLyBDcmVhdGUgUGFyYW1ldGVycyBpZiBwYXJhbWV0ZXJQcmVmaXggaXMgcHJvdmlkZWRcbiAgICBpZiAocHJvcHMucGFyYW1ldGVyUHJlZml4KSB7XG4gICAgICBjb25zdCBwYXJhbURhdGEgPSB7XG4gICAgICAgIGRiQ2x1c3RlcklkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIGVuZ2luZTogcHJvcHMucHJvdmlkZXIuZW5naW5lLFxuICAgICAgICBob3N0OiBob3N0LFxuICAgICAgICBwb3J0OiBwb3J0LFxuICAgICAgICB1c2VybmFtZTogcHJvcHMucm9sZU5hbWUsXG4gICAgICAgIGRibmFtZTogcHJvcHMuZGF0YWJhc2UgPyBwcm9wcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUgOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICB9XG5cbiAgICAgIG5ldyBQYXJhbWV0ZXJzKHRoaXMsIFwiUGFyYW1ldGVyc1wiLCB7XG4gICAgICAgIHNlY3JldEFybjogcHJvcHMucHJvdmlkZXIuc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgcGFyYW1ldGVyUHJlZml4OiBwcm9wcy5wYXJhbWV0ZXJQcmVmaXgsXG4gICAgICAgIHBhc3N3b3JkQXJuOiB0aGlzLnNlY3JldC5zZWNyZXRBcm4sXG4gICAgICAgIHByb3ZpZGVyU2VydmljZVRva2VuOiBwcm9wcy5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICAgIHByb3ZpZGVyOiBwcm9wcy5wcm92aWRlcixcbiAgICAgICAgcGFyYW1EYXRhLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByb2xlID0gbmV3IEN1c3RvbVJlc291cmNlUm9sZSh0aGlzLCBcIlBvc3RncmVzUm9sZVwiLCB7XG4gICAgICBwcm92aWRlcjogcHJvcHMucHJvdmlkZXIsXG4gICAgICByb2xlTmFtZTogcHJvcHMucm9sZU5hbWUsXG4gICAgICBwYXNzd29yZEFybjogdGhpcy5zZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgZGF0YWJhc2U6IHByb3BzLmRhdGFiYXNlLFxuICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgfSlcbiAgICByb2xlLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnNlY3JldClcbiAgICB0aGlzLnJvbGVOYW1lID0gcHJvcHMucm9sZU5hbWVcbiAgICB0aGlzLnNlY3JldC5ncmFudFJlYWQocHJvcHMucHJvdmlkZXIuaGFuZGxlcilcbiAgICBpZiAodGhpcy5zZWNyZXQuZW5jcnlwdGlvbktleSkge1xuICAgICAgLy8gSXQgc2VlbXMgd2UgbmVlZCB0byBncmFudCBleHBsaWNpdCBwZXJtaXNzaW9uXG4gICAgICB0aGlzLnNlY3JldC5lbmNyeXB0aW9uS2V5LmdyYW50RGVjcnlwdChwcm9wcy5wcm92aWRlci5oYW5kbGVyKVxuICAgIH1cbiAgfVxufVxuIl19
|
|
132
|
+
Role[_a] = { fqn: "cdk-rds-sql.Role", version: "6.1.1" };
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQWtFO0FBQ2xFLDJDQUEwQztBQUcxQyx1RUFBZ0U7QUFDaEUsMkNBQTBDO0FBQzFDLDJDQUFzQztBQUV0QyxpQ0FBdUM7QUFFdkMsaUVBQW1FO0FBNEVuRSw4Q0FBOEM7QUFDOUMsTUFBTSxVQUFXLFNBQVEsc0JBQVM7SUFDaEMsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FPQztRQUVELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsNENBQTRDO1FBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDdkQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxHQUFHLEVBQUUsRUFBRTtvQkFDaEQsYUFBYSxFQUFFLEdBQUcsS0FBSyxDQUFDLGVBQWUsR0FBRyxHQUFHLEVBQUU7b0JBQy9DLFdBQVcsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFO2lCQUM5QixDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFFRiw2REFBNkQ7UUFDN0QsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLEtBQUssQ0FBQyxlQUFlLFVBQVUsQ0FBQTtRQUNoRSxNQUFNLGtCQUFrQixHQUFHLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDdkUsWUFBWSxFQUFFLEtBQUssQ0FBQyxvQkFBb0I7WUFDeEMsVUFBVSxFQUFFO2dCQUNWLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsUUFBUSxFQUFFLHFCQUFjLENBQUMsa0JBQWtC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aW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBrbXMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1rbXNcIlxuaW1wb3J0IHsgSURhdGFiYXNlQ2x1c3RlciwgSURhdGFiYXNlSW5zdGFuY2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiXG5pbXBvcnQgeyBJU2VjcmV0LCBTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIHNzbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNzbVwiXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgeyBJRGF0YWJhc2UgfSBmcm9tIFwiLi9kYXRhYmFzZVwiXG5pbXBvcnQgeyBSZHNTcWxSZXNvdXJjZSB9IGZyb20gXCIuL2VudW1cIlxuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlclwiXG5pbXBvcnQgeyBSb2xlIGFzIEN1c3RvbVJlc291cmNlUm9sZSB9IGZyb20gXCIuL3JvbGUuY3VzdG9tLXJlc291cmNlXCJcblxuZXhwb3J0IGludGVyZmFjZSBSb2xlUHJvcHMge1xuICAvKipcbiAgICogUHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSBwcm92aWRlcjogUHJvdmlkZXJcblxuICAvKipcbiAgICogU1FMLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZSB0aGlzIHVzZXIgaXMgZXhwZWN0ZWQgdG8gdXNlLlxuICAgKlxuICAgKiBJZiB0aGUgZGF0YWJhc2UgZXhpc3RzLCBjb25uZWN0IHByaXZpbGVnZXMgYXJlIGdyYW50ZWQuXG4gICAqXG4gICAqIFNwZWNpZnkgb25lIG9mIGBkYXRhYmFzZWAgb3IgYGRhdGFiYXNlTmFtZWAuIFRoaXMgaXMgdGhlIG5hbWVcbiAgICogdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcm9sZSdzIHNlY3JldCBhcyB0aGUgZGF0YWJhc2UgbmFtZSB0b1xuICAgKiB1c2UuXG4gICAqL1xuICByZWFkb25seSBkYXRhYmFzZT86IElEYXRhYmFzZVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZSBuYW1lIHRoaXMgdXNlciBpcyBleHBlY3RlZCB0byB1c2UuXG4gICAqXG4gICAqIElmIHRoZSBkYXRhYmFzZSBleGlzdHMsIGNvbm5lY3QgcHJpdmlsZWdlcyBhcmUgZ3JhbnRlZC5cbiAgICpcbiAgICogU3BlY2lmeSBvbmUgb2YgYGRhdGFiYXNlYCBvciBgZGF0YWJhc2VOYW1lYC4gVGhpcyBpcyB0aGUgbmFtZVxuICAgKiB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSByb2xlJ3Mgc2VjcmV0IGFzIHRoZSBkYXRhYmFzZSBuYW1lIHRvXG4gICAqIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFiYXNlTmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBBIG5ldyBzZWNyZXQgaXMgY3JlYXRlZCBmb3IgdGhpcyB1c2VyLlxuICAgKlxuICAgKiBPcHRpb25hbGx5IGVuY3J5cHQgaXQgd2l0aCB0aGUgZ2l2ZW4ga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNlY3JldCBpcyBjcmVhdGVkIGZvciB0aGlzIHVzZXIuXG4gICAqXG4gICAqIE9wdGlvbmFsbHkgYWRkIHNlY3JldCBuYW1lIHRvIHRoZSBzZWNyZXQuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXROYW1lPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFByZWZpeCBmb3IgU1NNIHBhcmFtZXRlcnMgdG8gc3RvcmUgY3JlZGVudGlhbHMgaW4gUGFyYW1ldGVyIFN0b3JlLlxuICAgKiBXaGVuIGRlZmluZWQsIGNyZWRlbnRpYWxzIHdpbGwgYWxzbyBiZSBzdG9yZWQgYXMgcGFyYW1ldGVycy5cbiAgICpcbiAgICogVGhlIHBhcmFtZXRlciBuYW1lcyBzdWNoIGFzIFwicGFzc3dvcmRcIiBpcyBzaW1wbHkgYXBwZW5kZWQgdG9cbiAgICogYHBhcmFtZXRlclByZWZpeGAsIHNvIG1ha2Ugc3VyZSB0aGUgcHJlZml4IGVuZHMgd2l0aCBhIHNsYXNoIGlmXG4gICAqICB5b3UgaGF2ZSB5b3VyIHBhcmFtZXRlciBuYW1lcyBzbGFzaCBzZXBhcmF0ZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgcGFzc3dvcmQgZnJvbSB0aGUgc2VjcmV0IGlzIGNvcGllZCBqdXN0IG9uY2UsIHRoZXlcbiAgICogYXJlIG5vdCBrZXB0IGluIHN5bmMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY3JlZGVudGlhbHMgYXJlIG9ubHkgc3RvcmVkIGluIFNlY3JldHMgTWFuYWdlclxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyUHJlZml4Pzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEVuYWJsZSBJQU0gYXV0aGVudGljYXRpb24gZm9yIHRoaXMgcm9sZS5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCB0aGUgcm9sZSB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dCBhIHBhc3N3b3JkIGFuZFxuICAgKiBjb25maWd1cmVkIGZvciBBV1MgSUFNIGRhdGFiYXNlIGF1dGhlbnRpY2F0aW9uLiBUaGUgc2VjcmV0XG4gICAqIHdpbGwgbm90IGNvbnRhaW4gYSBwYXNzd29yZCBmaWVsZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgLSB1c2UgcGFzc3dvcmQgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUlhbUF1dGg/OiBib29sZWFuXG59XG5cbi8vIFByaXZhdGUgUGFyYW1ldGVycyBjb25zdHJ1Y3QgKG5vdCBleHBvcnRlZClcbmNsYXNzIFBhcmFtZXRlcnMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IHtcbiAgICAgIHByb3ZpZGVyOiBQcm92aWRlclxuICAgICAgc2VjcmV0QXJuOiBzdHJpbmdcbiAgICAgIHBhcmFtZXRlclByZWZpeDogc3RyaW5nXG4gICAgICBwYXNzd29yZEFybjogc3RyaW5nXG4gICAgICBwcm92aWRlclNlcnZpY2VUb2tlbjogc3RyaW5nXG4gICAgICBwYXJhbURhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICB9XG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIC8vIENyZWF0ZSBwYXJhbWV0ZXJzIGZvciBlYWNoIGtleS12YWx1ZSBwYWlyXG4gICAgT2JqZWN0LmVudHJpZXMocHJvcHMucGFyYW1EYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ldyBzc20uU3RyaW5nUGFyYW1ldGVyKHRoaXMsIGBQYXJhbWV0ZXItJHtrZXl9YCwge1xuICAgICAgICAgIHBhcmFtZXRlck5hbWU6IGAke3Byb3BzLnBhcmFtZXRlclByZWZpeH0ke2tleX1gLFxuICAgICAgICAgIHN0cmluZ1ZhbHVlOiB2YWx1ZS50b1N0cmluZygpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBGb3IgcGFzc3dvcmQsIHVzZSB0aGUgZXhpc3RpbmcgcHJvdmlkZXIgdG8gc3RvcmUgaXQgaW4gU1NNXG4gICAgY29uc3QgcGFzc3dvcmRQYXJhbWV0ZXJOYW1lID0gYCR7cHJvcHMucGFyYW1ldGVyUHJlZml4fXBhc3N3b3JkYFxuICAgIGNvbnN0IHBhc3N3b3JkX3BhcmFtZXRlciA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBcIlBhc3N3b3JkUGFyYW1ldGVyXCIsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvcHMucHJvdmlkZXJTZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFNlY3JldEFybjogcHJvcHMuc2VjcmV0QXJuLFxuICAgICAgICBSZXNvdXJjZTogUmRzU3FsUmVzb3VyY2UuUEFSQU1FVEVSX1BBU1NXT1JELFxuICAgICAgICBQYXNzd29yZEFybjogcHJvcHMucGFzc3dvcmRBcm4sXG4gICAgICAgIFBhcmFtZXRlck5hbWU6IHBhc3N3b3JkUGFyYW1ldGVyTmFtZSxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBwYXNzd29yZF9wYXJhbWV0ZXIubm9kZS5hZGREZXBlbmRlbmN5KHByb3BzLnByb3ZpZGVyKVxuXG4gICAgY29uc3QgcGFyYW1Bcm4gPSBgYXJuOmF3czpzc206JHtTdGFjay5vZih0aGlzKS5yZWdpb259OiR7XG4gICAgICBTdGFjay5vZih0aGlzKS5hY2NvdW50XG4gICAgfTpwYXJhbWV0ZXIke1xuICAgICAgcGFzc3dvcmRQYXJhbWV0ZXJOYW1lLnN0YXJ0c1dpdGgoXCIvXCIpID8gXCJcIiA6IFwiL1wiXG4gICAgfSR7cGFzc3dvcmRQYXJhbWV0ZXJOYW1lfWBcblxuICAgIHByb3BzLnByb3ZpZGVyLmhhbmRsZXIuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzc206UHV0UGFyYW1ldGVyXCIsIFwic3NtOkFkZFRhZ3NUb1Jlc291cmNlXCIsIFwic3NtOkdldFBhcmFtZXRlcnNcIl0sXG4gICAgICAgIHJlc291cmNlczogW3BhcmFtQXJuXSxcbiAgICAgIH0pXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSb2xlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSByb2xlIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VuZXJhdGVkIHNlY3JldC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXQ6IElTZWNyZXRcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUm9sZVByb3BzKSB7XG4gICAgaWYgKHByb3BzLmRhdGFiYXNlICYmIHByb3BzLmRhdGFiYXNlTmFtZSkge1xuICAgICAgdGhyb3cgXCJTcGVjaWZ5IGVpdGhlciBkYXRhYmFzZSBvciBkYXRhYmFzZU5hbWVcIlxuICAgIH1cbiAgICBpZiAoIXByb3BzLmRhdGFiYXNlICYmICFwcm9wcy5kYXRhYmFzZU5hbWUpIHtcbiAgICAgIC8vIElmIG5laXRoZXIgaXMgc3BlY2lmaWVkLCB3ZSBtaWdodCBuZWVkIGEgZGVmYXVsdCBvciB0aHJvdyBhbiBlcnJvciBkZXBlbmRpbmcgb24gZGVzaXJlZCBiZWhhdmlvci5cbiAgICAgIC8vIEZvciBub3csIGxldCdzIGFzc3VtZSBpdCdzIGFsbG93ZWQgYnV0IHRoZSBzZWNyZXQgd29uJ3QgaGF2ZSBhIGRibmFtZS5cbiAgICAgIC8vIElmIGl0IHNob3VsZCBiZSByZXF1aXJlZCwgdW5jb21tZW50IHRoZSBsaW5lIGJlbG93OlxuICAgICAgdGhyb3cgXCJTcGVjaWZ5IGVpdGhlciBkYXRhYmFzZSBvciBkYXRhYmFzZU5hbWVcIlxuICAgIH1cbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBob3N0ID0gKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlcikuY2x1c3RlckVuZHBvaW50XG4gICAgICA/IChwcm9wcy5wcm92aWRlci5jbHVzdGVyIGFzIElEYXRhYmFzZUNsdXN0ZXIpLmNsdXN0ZXJFbmRwb2ludC5ob3N0bmFtZVxuICAgICAgOiAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VJbnN0YW5jZSkuaW5zdGFuY2VFbmRwb2ludC5ob3N0bmFtZVxuXG4gICAgY29uc3QgcG9ydCA9IChwcm9wcy5wcm92aWRlci5jbHVzdGVyIGFzIElEYXRhYmFzZUNsdXN0ZXIpLmNsdXN0ZXJFbmRwb2ludFxuICAgICAgPyAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VDbHVzdGVyKS5jbHVzdGVyRW5kcG9pbnQucG9ydFxuICAgICAgOiAocHJvcHMucHJvdmlkZXIuY2x1c3RlciBhcyBJRGF0YWJhc2VJbnN0YW5jZSkuaW5zdGFuY2VFbmRwb2ludC5wb3J0XG5cbiAgICBjb25zdCBpZGVudGlmaWVyID0gKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlcikuY2x1c3RlcklkZW50aWZpZXJcbiAgICAgID8gKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlQ2x1c3RlcikuY2x1c3RlcklkZW50aWZpZXJcbiAgICAgIDogKHByb3BzLnByb3ZpZGVyLmNsdXN0ZXIgYXMgSURhdGFiYXNlSW5zdGFuY2UpLmluc3RhbmNlSWRlbnRpZmllclxuXG4gICAgY29uc3Qgc2VjcmV0VGVtcGxhdGUgPSB7XG4gICAgICBkYkNsdXN0ZXJJZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgZW5naW5lOiBwcm9wcy5wcm92aWRlci5lbmdpbmUsXG4gICAgICBob3N0OiBob3N0LFxuICAgICAgcG9ydDogcG9ydCxcbiAgICAgIHVzZXJuYW1lOiBwcm9wcy5yb2xlTmFtZSxcbiAgICAgIGRibmFtZTogcHJvcHMuZGF0YWJhc2UgPyBwcm9wcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUgOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgfVxuXG4gICAgdGhpcy5zZWNyZXQgPSBuZXcgU2VjcmV0KHRoaXMsIFwiU2VjcmV0XCIsIHtcbiAgICAgIHNlY3JldE5hbWU6IHByb3BzLnNlY3JldE5hbWUsXG4gICAgICBlbmNyeXB0aW9uS2V5OiBwcm9wcy5lbmNyeXB0aW9uS2V5LFxuICAgICAgZGVzY3JpcHRpb246IGBHZW5lcmF0ZWQgc2VjcmV0IGZvciAke3Byb3BzLnByb3ZpZGVyLmVuZ2luZX0gcm9sZSAke3Byb3BzLnJvbGVOYW1lfWAsXG4gICAgICAuLi4ocHJvcHMuZW5hYmxlSWFtQXV0aFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC8vIEZvciBJQU0gYXV0aCwgY3JlYXRlIHNlY3JldCB3aXRob3V0IHBhc3N3b3JkIGdlbmVyYXRpb25cbiAgICAgICAgICAgIHNlY3JldFN0cmluZ1RlbXBsYXRlOiBKU09OLnN0cmluZ2lmeShzZWNyZXRUZW1wbGF0ZSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC8vIEZvciBwYXNzd29yZCBhdXRoLCBnZW5lcmF0ZSBwYXNzd29yZFxuICAgICAgICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgICAgICAgcGFzc3dvcmRMZW5ndGg6IDMwLCAvLyBPcmFjbGUgcGFzc3dvcmQgY2Fubm90IGhhdmUgbW9yZSB0aGFuIDMwIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHNlY3JldFRlbXBsYXRlKSxcbiAgICAgICAgICAgICAgZ2VuZXJhdGVTdHJpbmdLZXk6IFwicGFzc3dvcmRcIixcbiAgICAgICAgICAgICAgZXhjbHVkZUNoYXJhY3RlcnM6IFwiICUrfmAjJCYqKCl8W117fTo7PD4/IScvQFxcXCJcXFxcXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pXG5cbiAgICAvLyBDcmVhdGUgUGFyYW1ldGVycyBpZiBwYXJhbWV0ZXJQcmVmaXggaXMgcHJvdmlkZWRcbiAgICBpZiAocHJvcHMucGFyYW1ldGVyUHJlZml4KSB7XG4gICAgICBjb25zdCBwYXJhbURhdGEgPSB7XG4gICAgICAgIGRiQ2x1c3RlcklkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIGVuZ2luZTogcHJvcHMucHJvdmlkZXIuZW5naW5lLFxuICAgICAgICBob3N0OiBob3N0LFxuICAgICAgICBwb3J0OiBwb3J0LFxuICAgICAgICB1c2VybmFtZTogcHJvcHMucm9sZU5hbWUsXG4gICAgICAgIGRibmFtZTogcHJvcHMuZGF0YWJhc2UgPyBwcm9wcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUgOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICB9XG5cbiAgICAgIG5ldyBQYXJhbWV0ZXJzKHRoaXMsIFwiUGFyYW1ldGVyc1wiLCB7XG4gICAgICAgIHNlY3JldEFybjogcHJvcHMucHJvdmlkZXIuc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgcGFyYW1ldGVyUHJlZml4OiBwcm9wcy5wYXJhbWV0ZXJQcmVmaXgsXG4gICAgICAgIHBhc3N3b3JkQXJuOiBwcm9wcy5lbmFibGVJYW1BdXRoID8gXCJcIiA6IHRoaXMuc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgcHJvdmlkZXJTZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgICAgcHJvdmlkZXI6IHByb3BzLnByb3ZpZGVyLFxuICAgICAgICBwYXJhbURhdGEsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJvbGUgPSBuZXcgQ3VzdG9tUmVzb3VyY2VSb2xlKHRoaXMsIFwiUG9zdGdyZXNSb2xlXCIsIHtcbiAgICAgIHByb3ZpZGVyOiBwcm9wcy5wcm92aWRlcixcbiAgICAgIHJvbGVOYW1lOiBwcm9wcy5yb2xlTmFtZSxcbiAgICAgIHBhc3N3b3JkQXJuOiBwcm9wcy5lbmFibGVJYW1BdXRoID8gXCJcIiA6IHRoaXMuc2VjcmV0LnNlY3JldEFybixcbiAgICAgIGRhdGFiYXNlOiBwcm9wcy5kYXRhYmFzZSxcbiAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgZW5hYmxlSWFtQXV0aDogcHJvcHMuZW5hYmxlSWFtQXV0aCxcbiAgICB9KVxuICAgIHJvbGUubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMuc2VjcmV0KVxuICAgIHRoaXMucm9sZU5hbWUgPSBwcm9wcy5yb2xlTmFtZVxuICAgIHRoaXMuc2VjcmV0LmdyYW50UmVhZChwcm9wcy5wcm92aWRlci5oYW5kbGVyKVxuICAgIGlmICh0aGlzLnNlY3JldC5lbmNyeXB0aW9uS2V5KSB7XG4gICAgICAvLyBJdCBzZWVtcyB3ZSBuZWVkIHRvIGdyYW50IGV4cGxpY2l0IHBlcm1pc3Npb25cbiAgICAgIHRoaXMuc2VjcmV0LmVuY3J5cHRpb25LZXkuZ3JhbnREZWNyeXB0KHByb3BzLnByb3ZpZGVyLmhhbmRsZXIpXG4gICAgfVxuICB9XG59XG4iXX0=
|
package/lib/schema.js
CHANGED
|
@@ -27,5 +27,5 @@ class Schema extends aws_cdk_lib_1.CustomResource {
|
|
|
27
27
|
}
|
|
28
28
|
exports.Schema = Schema;
|
|
29
29
|
_a = JSII_RTTI_SYMBOL_1;
|
|
30
|
-
Schema[_a] = { fqn: "cdk-rds-sql.Schema", version: "6.
|
|
30
|
+
Schema[_a] = { fqn: "cdk-rds-sql.Schema", version: "6.1.1" };
|
|
31
31
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0QztBQUc1QyxpQ0FBdUM7QUE0QnZDLE1BQWEsTUFBTyxTQUFRLDRCQUFjO0lBR3hDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0I7UUFDMUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ3pDLFVBQVUsRUFBRTtnQkFDVixRQUFRLEVBQUUscUJBQWMsQ0FBQyxNQUFNO2dCQUMvQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTO2dCQUMxQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ3RFLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUN2RDtTQUNGLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUE7UUFDbEMsSUFBSSxLQUFLLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMzRCxJQUFJLEtBQUssQ0FBQyxJQUFJO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3JELENBQUM7O0FBbEJILHdCQW1CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1c3RvbVJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCB7IElEYXRhYmFzZSB9IGZyb20gXCIuL2RhdGFiYXNlXCJcbmltcG9ydCB7IFJkc1NxbFJlc291cmNlIH0gZnJvbSBcIi4vZW51bVwiXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gXCIuL3Byb3ZpZGVyXCJcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi9yb2xlXCJcblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFQcm9wcyB7XG4gIC8qKlxuICAgKiBQcm92aWRlci5cbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBQcm92aWRlclxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgZGVmYXVsdCBkYXRhYmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U/OiBJRGF0YWJhc2VcblxuICAvKipcbiAgICogU2NoZW1hIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBzY2hlbWFOYW1lOiBzdHJpbmdcblxuICAvKipcbiAgICogT3B0aW9uYWwgcm9sZSB0byBiZSBncmFudGVkIGZvciBtYW5hZ2luZyB0YWJsZXMgaW4gc2NoZW1hXG4gICAqL1xuICByZWFkb25seSByb2xlPzogUm9sZVxufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hIGV4dGVuZHMgQ3VzdG9tUmVzb3VyY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgc2NoZW1hTmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNjaGVtYVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3BzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgUmVzb3VyY2U6IFJkc1NxbFJlc291cmNlLlNDSEVNQSxcbiAgICAgICAgUmVzb3VyY2VJZDogcHJvcHMuc2NoZW1hTmFtZSxcbiAgICAgICAgU2VjcmV0QXJuOiBwcm9wcy5wcm92aWRlci5zZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgICBEYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlID8gcHJvcHMuZGF0YWJhc2UuZGF0YWJhc2VOYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICBSb2xlTmFtZTogcHJvcHMucm9sZSA/IHByb3BzLnJvbGUucm9sZU5hbWUgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pXG4gICAgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMucHJvdmlkZXIpXG4gICAgdGhpcy5zY2hlbWFOYW1lID0gcHJvcHMuc2NoZW1hTmFtZVxuICAgIGlmIChwcm9wcy5kYXRhYmFzZSkgdGhpcy5ub2RlLmFkZERlcGVuZGVuY3kocHJvcHMuZGF0YWJhc2UpXG4gICAgaWYgKHByb3BzLnJvbGUpIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHByb3BzLnJvbGUpXG4gIH1cbn1cbiJdfQ==
|
package/lib/sql.js
CHANGED
|
@@ -24,5 +24,5 @@ class Sql extends aws_cdk_lib_1.CustomResource {
|
|
|
24
24
|
}
|
|
25
25
|
exports.Sql = Sql;
|
|
26
26
|
_a = JSII_RTTI_SYMBOL_1;
|
|
27
|
-
Sql[_a] = { fqn: "cdk-rds-sql.Sql", version: "6.
|
|
27
|
+
Sql[_a] = { fqn: "cdk-rds-sql.Sql", version: "6.1.1" };
|
|
28
28
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0QztBQUc1QyxpQ0FBdUM7QUEyQnZDLE1BQWEsR0FBSSxTQUFRLDRCQUFjO0lBQ3JDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZTtRQUN2RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVk7WUFDekMsVUFBVSxFQUFFO2dCQUNWLFFBQVEsRUFBRSxxQkFBYyxDQUFDLEdBQUc7Z0JBQzVCLFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTO2dCQUMxQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ3RFLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO2FBQ3pCO1NBQ0YsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3ZDLElBQUksS0FBSyxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDN0QsQ0FBQzs7QUFkSCxrQkFlQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1c3RvbVJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCB7IElEYXRhYmFzZSB9IGZyb20gXCIuL2RhdGFiYXNlXCJcbmltcG9ydCB7IFJkc1NxbFJlc291cmNlIH0gZnJvbSBcIi4vZW51bVwiXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gXCIuL3Byb3ZpZGVyXCJcblxuZXhwb3J0IGludGVyZmFjZSBTcWxQcm9wcyB7XG4gIC8qKlxuICAgKiBQcm92aWRlci5cbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBQcm92aWRlclxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkYXRhYmFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgZGVmYXVsdCBkYXRhYmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U/OiBJRGF0YWJhc2VcblxuICAvKipcbiAgICogU1FMLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVtZW50Pzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHN0YXRtZW50IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHJlc291cmNlIGlzIGRlbGV0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBTcWwgZXh0ZW5kcyBDdXN0b21SZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTcWxQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm9wcy5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFJlc291cmNlOiBSZHNTcWxSZXNvdXJjZS5TUUwsXG4gICAgICAgIFNlY3JldEFybjogcHJvcHMucHJvdmlkZXIuc2VjcmV0LnNlY3JldEFybixcbiAgICAgICAgRGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZSA/IHByb3BzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgU3RhdGVtZW50OiBwcm9wcy5zdGF0ZW1lbnQsXG4gICAgICAgIFJvbGxiYWNrOiBwcm9wcy5yb2xsYmFjayxcbiAgICAgIH0sXG4gICAgfSlcbiAgICB0aGlzLm5vZGUuYWRkRGVwZW5kZW5jeShwcm9wcy5wcm92aWRlcilcbiAgICBpZiAocHJvcHMuZGF0YWJhc2UpIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHByb3BzLmRhdGFiYXNlKVxuICB9XG59XG4iXX0=
|