@aws-cdk/aws-glue-alpha 2.176.0-alpha.0 → 2.178.0-alpha.0

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.
Files changed (54) hide show
  1. package/.jsii +6187 -3907
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +525 -235
  4. package/README.md +422 -159
  5. package/awslint.json +5 -5
  6. package/lib/code.js +4 -5
  7. package/lib/connection.js +15 -3
  8. package/lib/constants.d.ts +261 -0
  9. package/lib/constants.js +281 -0
  10. package/lib/data-format.js +5 -5
  11. package/lib/data-quality-ruleset.js +6 -3
  12. package/lib/database.js +5 -2
  13. package/lib/external-table.js +20 -2
  14. package/lib/index.d.ts +13 -2
  15. package/lib/index.js +14 -3
  16. package/lib/jobs/job.d.ts +393 -0
  17. package/lib/jobs/job.js +298 -0
  18. package/lib/jobs/pyspark-etl-job.d.ts +81 -0
  19. package/lib/jobs/pyspark-etl-job.js +130 -0
  20. package/lib/jobs/pyspark-flex-etl-job.d.ts +83 -0
  21. package/lib/jobs/pyspark-flex-etl-job.js +137 -0
  22. package/lib/jobs/pyspark-streaming-job.d.ts +81 -0
  23. package/lib/jobs/pyspark-streaming-job.js +130 -0
  24. package/lib/jobs/python-shell-job.d.ts +55 -0
  25. package/lib/jobs/python-shell-job.js +99 -0
  26. package/lib/jobs/ray-job.d.ts +44 -0
  27. package/lib/jobs/ray-job.js +89 -0
  28. package/lib/jobs/scala-spark-etl-job.d.ts +78 -0
  29. package/lib/jobs/scala-spark-etl-job.js +134 -0
  30. package/lib/jobs/scala-spark-flex-etl-job.d.ts +109 -0
  31. package/lib/jobs/scala-spark-flex-etl-job.js +143 -0
  32. package/lib/jobs/scala-spark-streaming-job.d.ts +77 -0
  33. package/lib/jobs/scala-spark-streaming-job.js +131 -0
  34. package/lib/jobs/spark-ui-utils.d.ts +53 -0
  35. package/lib/jobs/spark-ui-utils.js +26 -0
  36. package/lib/s3-table.d.ts +4 -4
  37. package/lib/s3-table.js +20 -2
  38. package/lib/schema.d.ts +1 -1
  39. package/lib/schema.js +2 -2
  40. package/lib/security-configuration.js +5 -2
  41. package/lib/storage-parameter.js +1 -1
  42. package/lib/table-base.d.ts +1 -1
  43. package/lib/table-base.js +2 -2
  44. package/lib/table-deprecated.js +1 -1
  45. package/lib/triggers/trigger-options.d.ts +205 -0
  46. package/lib/triggers/trigger-options.js +39 -0
  47. package/lib/triggers/workflow.d.ts +203 -0
  48. package/lib/triggers/workflow.js +371 -0
  49. package/package.json +8 -8
  50. package/rosetta/default.ts-fixture +1 -1
  51. package/lib/job-executable.d.ts +0 -384
  52. package/lib/job-executable.js +0 -348
  53. package/lib/job.d.ts +0 -574
  54. package/lib/job.js +0 -531
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ScalaSparkFlexEtlJob = void 0;
5
+ const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
6
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
+ const iam = require("aws-cdk-lib/aws-iam");
8
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
9
+ const aws_glue_1 = require("aws-cdk-lib/aws-glue");
10
+ const job_1 = require("./job");
11
+ const constants_1 = require("../constants");
12
+ const spark_ui_utils_1 = require("./spark-ui-utils");
13
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
14
+ /**
15
+ * Spark ETL Jobs class
16
+ *
17
+ * ETL jobs support pySpark and Scala languages, for which there are separate
18
+ * but similar constructors. ETL jobs default to the G2 worker type, but you
19
+ * can override this default with other supported worker type values
20
+ * (G1, G2, G4 and G8). ETL jobs defaults to Glue version 4.0, which you can
21
+ * override to 3.0. The following ETL features are enabled by default:
22
+ * —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
23
+ * You can find more details about version, worker type and other features
24
+ * in Glue's public documentation.
25
+ */
26
+ class ScalaSparkFlexEtlJob extends job_1.Job {
27
+ /**
28
+ * ScalaSparkFlexEtlJob constructor
29
+ */
30
+ constructor(scope, id, props) {
31
+ super(scope, id, {
32
+ physicalName: props.jobName,
33
+ });
34
+ try {
35
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ScalaSparkFlexEtlJobProps(props);
36
+ }
37
+ catch (error) {
38
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
39
+ Error.captureStackTrace(error, ScalaSparkFlexEtlJob);
40
+ }
41
+ throw error;
42
+ }
43
+ // Enhanced CDK Analytics Telemetry
44
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
45
+ // Set up role and permissions for principal
46
+ this.role = props.role, {
47
+ assumedBy: new iam.ServicePrincipal('glue.amazonaws.com'),
48
+ managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSGlueServiceRole')],
49
+ };
50
+ this.grantPrincipal = this.role;
51
+ // Enable SparkUI by default as a best practice
52
+ const sparkUIArgs = props.sparkUI?.bucket ? this.setupSparkUI(this.role, props.sparkUI) : undefined;
53
+ this.sparkUILoggingLocation = sparkUIArgs?.location;
54
+ // Enable CloudWatch metrics and continuous logging by default as a best practice
55
+ const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
56
+ const profilingMetricsArgs = { '--enable-metrics': '' };
57
+ const observabilityMetricsArgs = { '--enable-observability-metrics': 'true' };
58
+ // Gather executable arguments
59
+ const execuatbleArgs = this.executableArguments(props);
60
+ if (props.className === undefined) {
61
+ throw new Error('className must be set for Scala ETL Jobs');
62
+ }
63
+ // Conbine command line arguments into a single line item
64
+ const defaultArguments = {
65
+ ...execuatbleArgs,
66
+ ...continuousLoggingArgs,
67
+ ...profilingMetricsArgs,
68
+ ...observabilityMetricsArgs,
69
+ ...sparkUIArgs?.args,
70
+ ...this.checkNoReservedArgs(props.defaultArguments),
71
+ };
72
+ const jobResource = new aws_glue_1.CfnJob(this, 'Resource', {
73
+ name: props.jobName,
74
+ description: props.description,
75
+ role: this.role.roleArn,
76
+ command: {
77
+ name: constants_1.JobType.ETL,
78
+ scriptLocation: this.codeS3ObjectUrl(props.script),
79
+ },
80
+ glueVersion: props.glueVersion ? props.glueVersion : constants_1.GlueVersion.V3_0,
81
+ workerType: props.workerType ? props.workerType : constants_1.WorkerType.G_1X,
82
+ numberOfWorkers: props.numberOfWorkers ? props.numberOfWorkers : 10,
83
+ maxRetries: props.maxRetries,
84
+ executionProperty: props.maxConcurrentRuns ? { maxConcurrentRuns: props.maxConcurrentRuns } : undefined,
85
+ notificationProperty: props.notifyDelayAfter ? { notifyDelayAfter: props.notifyDelayAfter.toMinutes() } : undefined,
86
+ timeout: props.timeout?.toMinutes(),
87
+ connections: props.connections ? { connections: props.connections.map((connection) => connection.connectionName) } : undefined,
88
+ securityConfiguration: props.securityConfiguration?.securityConfigurationName,
89
+ tags: props.tags,
90
+ executionClass: constants_1.ExecutionClass.FLEX,
91
+ jobRunQueuingEnabled: false,
92
+ defaultArguments,
93
+ });
94
+ const resourceName = this.getResourceNameAttribute(jobResource.ref);
95
+ this.jobArn = this.buildJobArn(this, resourceName);
96
+ this.jobName = resourceName;
97
+ }
98
+ /**
99
+ * Set the executable arguments with best practices enabled by default
100
+ *
101
+ * @returns An array of arguments for Glue to use on execution
102
+ */
103
+ executableArguments(props) {
104
+ const args = {};
105
+ args['--job-language'] = constants_1.JobLanguage.SCALA;
106
+ args['--class'] = props.className;
107
+ if (props.extraJars && props.extraJars?.length > 0) {
108
+ args['--extra-jars'] = props.extraJars.map(code => this.codeS3ObjectUrl(code)).join(',');
109
+ }
110
+ if (props.extraFiles && props.extraFiles.length > 0) {
111
+ args['--extra-files'] = props.extraFiles.map(code => this.codeS3ObjectUrl(code)).join(',');
112
+ }
113
+ if (props.extraJarsFirst) {
114
+ args['--user-jars-first'] = 'true';
115
+ }
116
+ return args;
117
+ }
118
+ /**
119
+ * Set the arguments for sparkUI with best practices enabled by default
120
+ *
121
+ * @returns An array of arguments for enabling sparkUI
122
+ */
123
+ setupSparkUI(role, sparkUiProps) {
124
+ (0, spark_ui_utils_1.validateSparkUiPrefix)(sparkUiProps.prefix);
125
+ const bucket = sparkUiProps.bucket ?? new aws_s3_1.Bucket(this, 'SparkUIBucket', { enforceSSL: true, encryption: aws_s3_1.BucketEncryption.S3_MANAGED });
126
+ bucket.grantReadWrite(role, (0, spark_ui_utils_1.cleanSparkUiPrefixForGrant)(sparkUiProps.prefix));
127
+ const args = {
128
+ '--enable-spark-ui': 'true',
129
+ '--spark-event-logs-path': bucket.s3UrlForObject(sparkUiProps.prefix).replace(/\/?$/, '/'), // path will always end with a slash
130
+ };
131
+ return {
132
+ location: {
133
+ prefix: sparkUiProps.prefix,
134
+ bucket,
135
+ },
136
+ args,
137
+ };
138
+ }
139
+ }
140
+ exports.ScalaSparkFlexEtlJob = ScalaSparkFlexEtlJob;
141
+ _a = JSII_RTTI_SYMBOL_1;
142
+ ScalaSparkFlexEtlJob[_a] = { fqn: "@aws-cdk/aws-glue-alpha.ScalaSparkFlexEtlJob", version: "2.178.0-alpha.0" };
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGEtc3BhcmstZmxleC1ldGwtam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NhbGEtc3BhcmstZmxleC1ldGwtam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJDQUEyQztBQUMzQywrQ0FBOEQ7QUFDOUQsbURBQThDO0FBQzlDLCtCQUEyQztBQUUzQyw0Q0FBNkY7QUFDN0YscURBQTJIO0FBRzNILDhFQUE4RTtBQXNFOUU7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFhLG9CQUFxQixTQUFRLFNBQUc7SUFjM0M7O09BRUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsWUFBWSxFQUFFLEtBQUssQ0FBQyxPQUFPO1NBQzVCLENBQUMsQ0FBQzs7Ozs7OytDQXBCTSxvQkFBb0I7Ozs7UUFxQjdCLG1DQUFtQztRQUNuQyxJQUFBLHdDQUFvQixFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVsQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ3RCLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQztZQUN6RCxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDakcsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUVoQywrQ0FBK0M7UUFDL0MsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNwRyxJQUFJ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T0FBTyxJQUFJLENBQUM7S0FDYjtJQUVEOzs7O09BSUc7SUFDSyxZQUFZLENBQUMsSUFBZSxFQUFFLFlBQTBCO1FBQzlELElBQUEsc0NBQXFCLEVBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLElBQUksSUFBSSxlQUFNLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLHlCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDdkksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBQSwyQ0FBMEIsRUFBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RSxNQUFNLElBQUksR0FBRztZQUNYLG1CQUFtQixFQUFFLE1BQU07WUFDM0IseUJBQXlCLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxvQ0FBb0M7U0FDakksQ0FBQztRQUVGLE9BQU87WUFDTCxRQUFRLEVBQUU7Z0JBQ1IsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO2dCQUMzQixNQUFNO2FBQ1A7WUFDRCxJQUFJO1NBQ0wsQ0FBQztLQUNIOztBQWpJSCxvREFrSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBCdWNrZXQsIEJ1Y2tldEVuY3J5cHRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ2ZuSm9iIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHsgSm9iLCBKb2JQcm9wZXJ0aWVzIH0gZnJvbSAnLi9qb2InO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBKb2JUeXBlLCBHbHVlVmVyc2lvbiwgSm9iTGFuZ3VhZ2UsIFdvcmtlclR5cGUsIEV4ZWN1dGlvbkNsYXNzIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNwYXJrVUlQcm9wcywgU3BhcmtVSUxvZ2dpbmdMb2NhdGlvbiwgdmFsaWRhdGVTcGFya1VpUHJlZml4LCBjbGVhblNwYXJrVWlQcmVmaXhGb3JHcmFudCB9IGZyb20gJy4vc3BhcmstdWktdXRpbHMnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29kZSB9IGZyb20gJy4uL2NvZGUnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5cbi8qKlxuICogRmxleCBKb2JzIGNsYXNzXG4gKlxuICogRmxleCBqb2JzIHN1cHBvcnRzIFB5dGhvbiBhbmQgU2NhbGEgbGFuZ3VhZ2UuXG4gKiBUaGUgZmxleGlibGUgZXhlY3V0aW9uIGNsYXNzIGlzIGFwcHJvcHJpYXRlIGZvciBub24tdXJnZW50IGpvYnMgc3VjaCBhc1xuICogcHJlLXByb2R1Y3Rpb24gam9icywgdGVzdGluZywgYW5kIG9uZS10aW1lIGRhdGEgbG9hZHMuXG4gKiBGbGV4aWJsZSBqb2IgcnVucyBhcmUgc3VwcG9ydGVkIGZvciBqb2JzIHVzaW5nIEFXUyBHbHVlIHZlcnNpb24gMy4wIG9yIGxhdGVyIGFuZCBHLjFYIG9yXG4gKiBHLjJYIHdvcmtlciB0eXBlcyBidXQgd2lsbCBkZWZhdWx0IHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBHbHVlIChjdXJyZW50bHkgR2x1ZSAzLjAuKVxuICpcbiAqIFNpbWlsYXIgdG8gRVRMLCB3ZeKAmWxsIGVuYWJsZSB0aGVzZSBmZWF0dXJlczog4oCUZW5hYmxlLW1ldHJpY3MsIOKAlGVuYWJsZS1zcGFyay11aSxcbiAqIOKAlGVuYWJsZS1jb250aW51b3VzLWNsb3Vkd2F0Y2gtbG9nXG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjYWxhU3BhcmtGbGV4RXRsSm9iUHJvcHMgZXh0ZW5kcyBKb2JQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIFNwYXJrIFVJIGRlYnVnZ2luZyBhbmQgbW9uaXRvcmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU3BhcmsgVUkgZGVidWdnaW5nIGFuZCBtb25pdG9yaW5nIGlzIGRpc2FibGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLXNwYXJrLXVpLWpvYnMuaHRtbFxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgc3BhcmtVST86IFNwYXJrVUlQcm9wcztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiBhIG5vdGlmaWNhdGlvbiAob3B0aW9uYWwpLlxuICAgKiBBZnRlciBhIGpvYiBydW4gc3RhcnRzLCB0aGUgbnVtYmVyIG9mIG1pbnV0ZXMgdG8gd2FpdCBiZWZvcmUgc2VuZGluZyBhIGpvYiBydW4gZGVsYXkgbm90aWZpY2F0aW9uLlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZ5RGVsYXlBZnRlcj86IGNkay5EdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBTY2FsYSBjbGFzcyBuYW1lIHRoYXQgc2VydmVzIGFzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGpvYi5cbiAgICpcbiAgICogQHNlZSBgLS1jbGFzc2AgaW4gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBKYXZhIC5qYXIgZmlsZXMgdGhhdCBBV1MgR2x1ZSBhZGRzIHRvIHRoZSBKYXZhIGNsYXNzcGF0aCBiZWZvcmUgZXhlY3V0aW5nIHlvdXIgc2NyaXB0LlxuICAgKiBPbmx5IGluZGl2aWR1YWwgZmlsZXMgYXJlIHN1cHBvcnRlZCwgZGlyZWN0b3JpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdIC0gbm8gZXh0cmEgamFycyBhcmUgYWRkZWQgdG8gdGhlIGNsYXNzcGF0aFxuICAgKlxuICAgKiBAc2VlIGAtLWV4dHJhLWphcnNgIGluIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFKYXJzPzogQ29kZVtdO1xuXG4gIC8qKlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gdHJ1ZSBwcmlvcml0aXplcyB0aGUgY3VzdG9tZXIncyBleHRyYSBKQVIgZmlsZXMgaW4gdGhlIGNsYXNzcGF0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgLSBwcmlvcml0eSBpcyBub3QgZ2l2ZW4gdG8gdXNlci1wcm92aWRlZCBqYXJzXG4gICAqXG4gICAqIEBzZWUgYC0tdXNlci1qYXJzLWZpcnN0YCBpbiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhSmFyc0ZpcnN0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBmaWxlcywgc3VjaCBhcyBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgQVdTIEdsdWUgY29waWVzIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB5b3VyIHNjcmlwdCBiZWZvcmUgZXhlY3V0aW5nIGl0LlxuICAgKiBPbmx5IGluZGl2aWR1YWwgZmlsZXMgYXJlIHN1cHBvcnRlZCwgZGlyZWN0b3JpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdIC0gbm8gZXh0cmEgZmlsZXMgYXJlIGNvcGllZCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnlcbiAgICpcbiAgICogQHNlZSBgLS1leHRyYS1maWxlc2AgaW4gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBleHRyYUZpbGVzPzogQ29kZVtdO1xufVxuXG4vKipcbiAqIFNwYXJrIEVUTCBKb2JzIGNsYXNzXG4gKlxuICogRVRMIGpvYnMgc3VwcG9ydCBweVNwYXJrIGFuZCBTY2FsYSBsYW5ndWFnZXMsIGZvciB3aGljaCB0aGVyZSBhcmUgc2VwYXJhdGVcbiAqIGJ1dCBzaW1pbGFyIGNvbnN0cnVjdG9ycy4gRVRMIGpvYnMgZGVmYXVsdCB0byB0aGUgRzIgd29ya2VyIHR5cGUsIGJ1dCB5b3VcbiAqIGNhbiBvdmVycmlkZSB0aGlzIGRlZmF1bHQgd2l0aCBvdGhlciBzdXBwb3J0ZWQgd29ya2VyIHR5cGUgdmFsdWVzXG4gKiAoRzEsIEcyLCBHNCBhbmQgRzgpLiBFVEwgam9icyBkZWZhdWx0cyB0byBHbHVlIHZlcnNpb24gNC4wLCB3aGljaCB5b3UgY2FuXG4gKiBvdmVycmlkZSB0byAzLjAuIFRoZSBmb2xsb3dpbmcgRVRMIGZlYXR1cmVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQ6XG4gKiDigJRlbmFibGUtbWV0cmljcywg4oCUZW5hYmxlLXNwYXJrLXVpLCDigJRlbmFibGUtY29udGludW91cy1jbG91ZHdhdGNoLWxvZy5cbiAqIFlvdSBjYW4gZmluZCBtb3JlIGRldGFpbHMgYWJvdXQgdmVyc2lvbiwgd29ya2VyIHR5cGUgYW5kIG90aGVyIGZlYXR1cmVzXG4gKiBpbiBHbHVlJ3MgcHVibGljIGRvY3VtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2FsYVNwYXJrRmxleEV0bEpvYiBleHRlbmRzIEpvYiB7XG4gIHB1YmxpYyByZWFkb25seSBqb2JBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGpvYk5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIFNwYXJrIFVJIGxvZ3MgbG9jYXRpb24gaWYgU3BhcmsgVUkgbW9uaXRvcmluZyBhbmQgZGVidWdnaW5nIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3Itc3BhcmstdWktam9icy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3BhcmtVSUxvZ2dpbmdMb2NhdGlvbj86IFNwYXJrVUlMb2dnaW5nTG9jYXRpb247XG5cbiAgLyoqXG4gICAqIFNjYWxhU3BhcmtGbGV4RXRsSm9iIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2NhbGFTcGFya0ZsZXhFdGxKb2JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5qb2JOYW1lLFxuICAgIH0pO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgLy8gU2V0IHVwIHJvbGUgYW5kIHBlcm1pc3Npb25zIGZvciBwcmluY2lwYWxcbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZ2x1ZS5hbWF6b25hd3MuY29tJyksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NHbHVlU2VydmljZVJvbGUnKV0sXG4gICAgfTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gRW5hYmxlIFNwYXJrVUkgYnkgZGVmYXVsdCBhcyBhIGJlc3QgcHJhY3RpY2VcbiAgICBjb25zdCBzcGFya1VJQXJncyA9IHByb3BzLnNwYXJrVUk/LmJ1Y2tldCA/IHRoaXMuc2V0dXBTcGFya1VJKHRoaXMucm9sZSwgcHJvcHMuc3BhcmtVSSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zcGFya1VJTG9nZ2luZ0xvY2F0aW9uID0gc3BhcmtVSUFyZ3M/LmxvY2F0aW9uO1xuXG4gICAgLy8gRW5hYmxlIENsb3VkV2F0Y2ggbWV0cmljcyBhbmQgY29udGludW91cyBsb2dnaW5nIGJ5IGRlZmF1bHQgYXMgYSBiZXN0IHByYWN0aWNlXG4gICAgY29uc3QgY29udGludW91c0xvZ2dpbmdBcmdzID0gdGhpcy5zZXR1cENvbnRpbnVvdXNMb2dnaW5nKHRoaXMucm9sZSwgcHJvcHMuY29udGludW91c0xvZ2dpbmcpO1xuICAgIGNvbnN0IHByb2ZpbGluZ01ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtbWV0cmljcyc6ICcnIH07XG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eU1ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtb2JzZXJ2YWJpbGl0eS1tZXRyaWNzJzogJ3RydWUnIH07XG5cbiAgICAvLyBHYXRoZXIgZXhlY3V0YWJsZSBhcmd1bWVudHNcbiAgICBjb25zdCBleGVjdWF0YmxlQXJncyA9IHRoaXMuZXhlY3V0YWJsZUFyZ3VtZW50cyhwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuY2xhc3NOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2xhc3NOYW1lIG11c3QgYmUgc2V0IGZvciBTY2FsYSBFVEwgSm9icycpO1xuICAgIH1cblxuICAgIC8vIENvbmJpbmUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGxpbmUgaXRlbVxuICAgIGNvbnN0IGRlZmF1bHRBcmd1bWVudHMgPSB7XG4gICAgICAuLi5leGVjdWF0YmxlQXJncyxcbiAgICAgIC4uLmNvbnRpbnVvdXNMb2dnaW5nQXJncyxcbiAgICAgIC4uLnByb2ZpbGluZ01ldHJpY3NBcmdzLFxuICAgICAgLi4ub2JzZXJ2YWJpbGl0eU1ldHJpY3NBcmdzLFxuICAgICAgLi4uc3BhcmtVSUFyZ3M/LmFyZ3MsXG4gICAgICAuLi50aGlzLmNoZWNrTm9SZXNlcnZlZEFyZ3MocHJvcHMuZGVmYXVsdEFyZ3VtZW50cyksXG4gICAgfTtcblxuICAgIGNvbnN0IGpvYlJlc291cmNlID0gbmV3IENmbkpvYih0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiBwcm9wcy5qb2JOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcm9sZTogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICBjb21tYW5kOiB7XG4gICAgICAgIG5hbWU6IEpvYlR5cGUuRVRMLFxuICAgICAgICBzY3JpcHRMb2NhdGlvbjogdGhpcy5jb2RlUzNPYmplY3RVcmwocHJvcHMuc2NyaXB0KSxcbiAgICAgIH0sXG4gICAgICBnbHVlVmVyc2lvbjogcHJvcHMuZ2x1ZVZlcnNpb24gPyBwcm9wcy5nbHVlVmVyc2lvbiA6IEdsdWVWZXJzaW9uLlYzXzAsXG4gICAgICB3b3JrZXJUeXBlOiBwcm9wcy53b3JrZXJUeXBlID8gcHJvcHMud29ya2VyVHlwZSA6IFdvcmtlclR5cGUuR18xWCxcbiAgICAgIG51bWJlck9mV29ya2VyczogcHJvcHMubnVtYmVyT2ZXb3JrZXJzID8gcHJvcHMubnVtYmVyT2ZXb3JrZXJzIDogMTAsXG4gICAgICBtYXhSZXRyaWVzOiBwcm9wcy5tYXhSZXRyaWVzLFxuICAgICAgZXhlY3V0aW9uUHJvcGVydHk6IHByb3BzLm1heENvbmN1cnJlbnRSdW5zID8geyBtYXhDb25jdXJyZW50UnVuczogcHJvcHMubWF4Q29uY3VycmVudFJ1bnMgfSA6IHVuZGVmaW5lZCxcbiAgICAgIG5vdGlmaWNhdGlvblByb3BlcnR5OiBwcm9wcy5ub3RpZnlEZWxheUFmdGVyID8geyBub3RpZnlEZWxheUFmdGVyOiBwcm9wcy5ub3RpZnlEZWxheUFmdGVyLnRvTWludXRlcygpIH0gOiB1bmRlZmluZWQsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0Py50b01pbnV0ZXMoKSxcbiAgICAgIGNvbm5lY3Rpb25zOiBwcm9wcy5jb25uZWN0aW9ucyA/IHsgY29ubmVjdGlvbnM6IHByb3BzLmNvbm5lY3Rpb25zLm1hcCgoY29ubmVjdGlvbikgPT4gY29ubmVjdGlvbi5jb25uZWN0aW9uTmFtZSkgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlY3VyaXR5Q29uZmlndXJhdGlvbjogcHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uPy5zZWN1cml0eUNvbmZpZ3VyYXRpb25OYW1lLFxuICAgICAgdGFnczogcHJvcHMudGFncyxcbiAgICAgIGV4ZWN1dGlvbkNsYXNzOiBFeGVjdXRpb25DbGFzcy5GTEVYLFxuICAgICAgam9iUnVuUXVldWluZ0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgZGVmYXVsdEFyZ3VtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKGpvYlJlc291cmNlLnJlZik7XG4gICAgdGhpcy5qb2JBcm4gPSB0aGlzLmJ1aWxkSm9iQXJuKHRoaXMsIHJlc291cmNlTmFtZSk7XG4gICAgdGhpcy5qb2JOYW1lID0gcmVzb3VyY2VOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZXhlY3V0YWJsZSBhcmd1bWVudHMgd2l0aCBiZXN0IHByYWN0aWNlcyBlbmFibGVkIGJ5IGRlZmF1bHRcbiAgICpcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYXJndW1lbnRzIGZvciBHbHVlIHRvIHVzZSBvbiBleGVjdXRpb25cbiAgICovXG4gIHByaXZhdGUgZXhlY3V0YWJsZUFyZ3VtZW50cyhwcm9wczogU2NhbGFTcGFya0ZsZXhFdGxKb2JQcm9wcykge1xuICAgIGNvbnN0IGFyZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBhcmdzWyctLWpvYi1sYW5ndWFnZSddID0gSm9iTGFuZ3VhZ2UuU0NBTEE7XG4gICAgYXJnc1snLS1jbGFzcyddID0gcHJvcHMuY2xhc3NOYW1lITtcblxuICAgIGlmIChwcm9wcy5leHRyYUphcnMgJiYgcHJvcHMuZXh0cmFKYXJzPy5sZW5ndGggPiAwKSB7XG4gICAgICBhcmdzWyctLWV4dHJhLWphcnMnXSA9IHByb3BzLmV4dHJhSmFycy5tYXAoY29kZSA9PiB0aGlzLmNvZGVTM09iamVjdFVybChjb2RlKSkuam9pbignLCcpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5leHRyYUZpbGVzICYmIHByb3BzLmV4dHJhRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXJnc1snLS1leHRyYS1maWxlcyddID0gcHJvcHMuZXh0cmFGaWxlcy5tYXAoY29kZSA9PiB0aGlzLmNvZGVTM09iamVjdFVybChjb2RlKSkuam9pbignLCcpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZXh0cmFKYXJzRmlyc3QpIHtcbiAgICAgIGFyZ3NbJy0tdXNlci1qYXJzLWZpcnN0J10gPSAndHJ1ZSc7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgYXJndW1lbnRzIGZvciBzcGFya1VJIHdpdGggYmVzdCBwcmFjdGljZXMgZW5hYmxlZCBieSBkZWZhdWx0XG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFyZ3VtZW50cyBmb3IgZW5hYmxpbmcgc3BhcmtVSVxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFNwYXJrVUkocm9sZTogaWFtLklSb2xlLCBzcGFya1VpUHJvcHM6IFNwYXJrVUlQcm9wcykge1xuICAgIHZhbGlkYXRlU3BhcmtVaVByZWZpeChzcGFya1VpUHJvcHMucHJlZml4KTtcbiAgICBjb25zdCBidWNrZXQgPSBzcGFya1VpUHJvcHMuYnVja2V0ID8/IG5ldyBCdWNrZXQodGhpcywgJ1NwYXJrVUlCdWNrZXQnLCB7IGVuZm9yY2VTU0w6IHRydWUsIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCB9KTtcbiAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUocm9sZSwgY2xlYW5TcGFya1VpUHJlZml4Rm9yR3JhbnQoc3BhcmtVaVByb3BzLnByZWZpeCkpO1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAnLS1lbmFibGUtc3BhcmstdWknOiAndHJ1ZScsXG4gICAgICAnLS1zcGFyay1ldmVudC1sb2dzLXBhdGgnOiBidWNrZXQuczNVcmxGb3JPYmplY3Qoc3BhcmtVaVByb3BzLnByZWZpeCkucmVwbGFjZSgvXFwvPyQvLCAnLycpLCAvLyBwYXRoIHdpbGwgYWx3YXlzIGVuZCB3aXRoIGEgc2xhc2hcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgIHByZWZpeDogc3BhcmtVaVByb3BzLnByZWZpeCxcbiAgICAgICAgYnVja2V0LFxuICAgICAgfSxcbiAgICAgIGFyZ3MsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,77 @@
1
+ import * as iam from 'aws-cdk-lib/aws-iam';
2
+ import { Job, JobProperties } from './job';
3
+ import { Construct } from 'constructs';
4
+ import { SparkUIProps, SparkUILoggingLocation } from './spark-ui-utils';
5
+ /**
6
+ * Properties for creating a Scala Spark ETL job
7
+ */
8
+ export interface ScalaSparkStreamingJobProps extends JobProperties {
9
+ /**
10
+ * Enables the Spark UI debugging and monitoring with the specified props.
11
+ *
12
+ * @default - Spark UI debugging and monitoring is disabled.
13
+ *
14
+ * @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
15
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
16
+ */
17
+ readonly sparkUI?: SparkUIProps;
18
+ /**
19
+ * Class name (required for Scala scripts)
20
+ * Package and class name for the entry point of Glue job execution for
21
+ * Java scripts
22
+ **/
23
+ readonly className: string;
24
+ /**
25
+ * Extra Jars S3 URL (optional)
26
+ * S3 URL where additional jar dependencies are located
27
+ * @default - no extra jar files
28
+ */
29
+ readonly extraJars?: string[];
30
+ /**
31
+ * Specifies whether job run queuing is enabled for the job runs for this job.
32
+ * A value of true means job run queuing is enabled for the job runs.
33
+ * If false or not populated, the job runs will not be considered for queueing.
34
+ * If this field does not match the value set in the job run, then the value from
35
+ * the job run field will be used. This property must be set to false for flex jobs.
36
+ * If this property is enabled, maxRetries must be set to zero.
37
+ *
38
+ * @default - no job run queuing
39
+ */
40
+ readonly jobRunQueuingEnabled?: boolean;
41
+ }
42
+ /**
43
+ * Scala Streaming Jobs class
44
+ *
45
+ * A Streaming job is similar to an ETL job, except that it performs ETL on data streams
46
+ * using the Apache Spark Structured Streaming framework.
47
+ * These jobs will default to use Python 3.9.
48
+ *
49
+ * Similar to ETL jobs, streaming job supports Scala and Python languages. Similar to ETL,
50
+ * it supports G1 and G2 worker type and 2.0, 3.0 and 4.0 version. We’ll default to G2 worker
51
+ * and 4.0 version for streaming jobs which developers can override.
52
+ * We will enable —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
53
+ */
54
+ export declare class ScalaSparkStreamingJob extends Job {
55
+ readonly jobArn: string;
56
+ readonly jobName: string;
57
+ readonly role: iam.IRole;
58
+ readonly grantPrincipal: iam.IPrincipal;
59
+ /**
60
+ * The Spark UI logs location if Spark UI monitoring and debugging is enabled.
61
+ *
62
+ * @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
63
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
64
+ */
65
+ readonly sparkUILoggingLocation?: SparkUILoggingLocation;
66
+ /**
67
+ * ScalaSparkStreamingJob constructor
68
+ */
69
+ constructor(scope: Construct, id: string, props: ScalaSparkStreamingJobProps);
70
+ /**
71
+ * Set the executable arguments with best practices enabled by default
72
+ *
73
+ * @returns An array of arguments for Glue to use on execution
74
+ */
75
+ private executableArguments;
76
+ private setupSparkUI;
77
+ }
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ScalaSparkStreamingJob = void 0;
5
+ const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
6
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
+ const aws_glue_1 = require("aws-cdk-lib/aws-glue");
8
+ const iam = require("aws-cdk-lib/aws-iam");
9
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
10
+ const job_1 = require("./job");
11
+ const constants_1 = require("../constants");
12
+ const spark_ui_utils_1 = require("./spark-ui-utils");
13
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
14
+ /**
15
+ * Scala Streaming Jobs class
16
+ *
17
+ * A Streaming job is similar to an ETL job, except that it performs ETL on data streams
18
+ * using the Apache Spark Structured Streaming framework.
19
+ * These jobs will default to use Python 3.9.
20
+ *
21
+ * Similar to ETL jobs, streaming job supports Scala and Python languages. Similar to ETL,
22
+ * it supports G1 and G2 worker type and 2.0, 3.0 and 4.0 version. We’ll default to G2 worker
23
+ * and 4.0 version for streaming jobs which developers can override.
24
+ * We will enable —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
25
+ */
26
+ class ScalaSparkStreamingJob extends job_1.Job {
27
+ /**
28
+ * ScalaSparkStreamingJob constructor
29
+ */
30
+ constructor(scope, id, props) {
31
+ super(scope, id, {
32
+ physicalName: props.jobName,
33
+ });
34
+ try {
35
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ScalaSparkStreamingJobProps(props);
36
+ }
37
+ catch (error) {
38
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
39
+ Error.captureStackTrace(error, ScalaSparkStreamingJob);
40
+ }
41
+ throw error;
42
+ }
43
+ // Enhanced CDK Analytics Telemetry
44
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
45
+ // Set up role and permissions for principal
46
+ this.role = props.role, {
47
+ assumedBy: new iam.ServicePrincipal('glue.amazonaws.com'),
48
+ managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSGlueServiceRole')],
49
+ };
50
+ this.grantPrincipal = this.role;
51
+ // Enable SparkUI by default as a best practice
52
+ const sparkUIArgs = props.sparkUI?.bucket ? this.setupSparkUI(this.role, props.sparkUI) : undefined;
53
+ this.sparkUILoggingLocation = sparkUIArgs?.location;
54
+ // Enable CloudWatch metrics and continuous logging by default as a best practice
55
+ const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
56
+ const profilingMetricsArgs = { '--enable-metrics': '' };
57
+ const observabilityMetricsArgs = { '--enable-observability-metrics': 'true' };
58
+ // Gather executable arguments
59
+ const executableArgs = this.executableArguments(props);
60
+ // Mandatory className argument
61
+ if (props.className === undefined) {
62
+ throw new Error('className must be set for Scala ETL Jobs');
63
+ }
64
+ // Conbine command line arguments into a single line item
65
+ const defaultArguments = {
66
+ ...executableArgs,
67
+ ...continuousLoggingArgs,
68
+ ...profilingMetricsArgs,
69
+ ...observabilityMetricsArgs,
70
+ ...sparkUIArgs?.args,
71
+ ...this.checkNoReservedArgs(props.defaultArguments),
72
+ };
73
+ if ((!props.workerType && props.numberOfWorkers !== undefined) || (props.workerType && props.numberOfWorkers === undefined)) {
74
+ throw new Error('Both workerType and numberOfWorkers must be set');
75
+ }
76
+ const jobResource = new aws_glue_1.CfnJob(this, 'Resource', {
77
+ name: props.jobName,
78
+ description: props.description,
79
+ role: this.role.roleArn,
80
+ command: {
81
+ name: constants_1.JobType.STREAMING,
82
+ scriptLocation: this.codeS3ObjectUrl(props.script),
83
+ },
84
+ glueVersion: props.glueVersion ? props.glueVersion : constants_1.GlueVersion.V4_0,
85
+ workerType: props.workerType ? props.workerType : constants_1.WorkerType.G_1X,
86
+ numberOfWorkers: props.numberOfWorkers ? props.numberOfWorkers : 10,
87
+ maxRetries: props.jobRunQueuingEnabled ? 0 : props.maxRetries,
88
+ jobRunQueuingEnabled: props.jobRunQueuingEnabled ? props.jobRunQueuingEnabled : false,
89
+ executionProperty: props.maxConcurrentRuns ? { maxConcurrentRuns: props.maxConcurrentRuns } : undefined,
90
+ timeout: props.timeout?.toMinutes(),
91
+ connections: props.connections ? { connections: props.connections.map((connection) => connection.connectionName) } : undefined,
92
+ securityConfiguration: props.securityConfiguration?.securityConfigurationName,
93
+ tags: props.tags,
94
+ defaultArguments,
95
+ });
96
+ const resourceName = this.getResourceNameAttribute(jobResource.ref);
97
+ this.jobArn = this.buildJobArn(this, resourceName);
98
+ this.jobName = resourceName;
99
+ }
100
+ /**
101
+ * Set the executable arguments with best practices enabled by default
102
+ *
103
+ * @returns An array of arguments for Glue to use on execution
104
+ */
105
+ executableArguments(props) {
106
+ const args = {};
107
+ args['--job-language'] = constants_1.JobLanguage.SCALA;
108
+ args['--class'] = props.className;
109
+ return args;
110
+ }
111
+ setupSparkUI(role, sparkUiProps) {
112
+ (0, spark_ui_utils_1.validateSparkUiPrefix)(sparkUiProps.prefix);
113
+ const bucket = sparkUiProps.bucket ?? new aws_s3_1.Bucket(this, 'SparkUIBucket', { enforceSSL: true, encryption: aws_s3_1.BucketEncryption.S3_MANAGED });
114
+ bucket.grantReadWrite(role, (0, spark_ui_utils_1.cleanSparkUiPrefixForGrant)(sparkUiProps.prefix));
115
+ const args = {
116
+ '--enable-spark-ui': 'true',
117
+ '--spark-event-logs-path': bucket.s3UrlForObject(sparkUiProps.prefix).replace(/\/?$/, '/'), // path will always end with a slash
118
+ };
119
+ return {
120
+ location: {
121
+ prefix: sparkUiProps.prefix,
122
+ bucket,
123
+ },
124
+ args,
125
+ };
126
+ }
127
+ }
128
+ exports.ScalaSparkStreamingJob = ScalaSparkStreamingJob;
129
+ _a = JSII_RTTI_SYMBOL_1;
130
+ ScalaSparkStreamingJob[_a] = { fqn: "@aws-cdk/aws-glue-alpha.ScalaSparkStreamingJob", version: "2.178.0-alpha.0" };
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGEtc3Bhcmstc3RyZWFtaW5nLWpvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNjYWxhLXNwYXJrLXN0cmVhbWluZy1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQThDO0FBQzlDLDJDQUEyQztBQUMzQywrQ0FBOEQ7QUFDOUQsK0JBQTJDO0FBRTNDLDRDQUE2RTtBQUM3RSxxREFBMkg7QUFDM0gsOEVBQThFO0FBMkM5RTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsU0FBRztJQWM3Qzs7T0FFRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0M7UUFDMUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDNUIsQ0FBQyxDQUFDOzs7Ozs7K0NBcEJNLHNCQUFzQjs7OztRQXFCL0IsbUNBQW1DO1FBQ25DLElBQUEsd0NBQW9CLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxDLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDdEIsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDO1lBQ3pELGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNqRyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWhDLCtDQUErQztRQUMvQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3BHLElB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RSxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLG9DQUFvQztTQUNqSSxDQUFDO1FBRUYsT0FBTztZQUNMLFFBQVEsRUFBRTtnQkFDUixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07Z0JBQzNCLE1BQU07YUFDUDtZQUNELElBQUk7U0FDTCxDQUFDO0tBQ0g7O0FBckhILHdEQXNIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbkpvYiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1nbHVlJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEJ1Y2tldCwgQnVja2V0RW5jcnlwdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBKb2IsIEpvYlByb3BlcnRpZXMgfSBmcm9tICcuL2pvYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEpvYlR5cGUsIEdsdWVWZXJzaW9uLCBKb2JMYW5ndWFnZSwgV29ya2VyVHlwZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTcGFya1VJUHJvcHMsIFNwYXJrVUlMb2dnaW5nTG9jYXRpb24sIHZhbGlkYXRlU3BhcmtVaVByZWZpeCwgY2xlYW5TcGFya1VpUHJlZml4Rm9yR3JhbnQgfSBmcm9tICcuL3NwYXJrLXVpLXV0aWxzJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgU2NhbGEgU3BhcmsgRVRMIGpvYlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjYWxhU3BhcmtTdHJlYW1pbmdKb2JQcm9wcyBleHRlbmRzIEpvYlByb3BlcnRpZXMge1xuICAvKipcbiAgICogRW5hYmxlcyB0aGUgU3BhcmsgVUkgZGVidWdnaW5nIGFuZCBtb25pdG9yaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTcGFyayBVSSBkZWJ1Z2dpbmcgYW5kIG1vbml0b3JpbmcgaXMgZGlzYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3Itc3BhcmstdWktam9icy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBzcGFya1VJPzogU3BhcmtVSVByb3BzO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBuYW1lIChyZXF1aXJlZCBmb3IgU2NhbGEgc2NyaXB0cylcbiAgICogUGFja2FnZSBhbmQgY2xhc3MgbmFtZSBmb3IgdGhlIGVudHJ5IHBvaW50IG9mIEdsdWUgam9iIGV4ZWN1dGlvbiBmb3JcbiAgICogSmF2YSBzY3JpcHRzXG4gICAqKi9cbiAgcmVhZG9ubHkgY2xhc3NOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4dHJhIEphcnMgUzMgVVJMIChvcHRpb25hbClcbiAgICogUzMgVVJMIHdoZXJlIGFkZGl0aW9uYWwgamFyIGRlcGVuZGVuY2llcyBhcmUgbG9jYXRlZFxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIGphciBmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFKYXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGpvYiBydW4gcXVldWluZyBpcyBlbmFibGVkIGZvciB0aGUgam9iIHJ1bnMgZm9yIHRoaXMgam9iLlxuICAgKiBBIHZhbHVlIG9mIHRydWUgbWVhbnMgam9iIHJ1biBxdWV1aW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBqb2IgcnVucy5cbiAgICogSWYgZmFsc2Ugb3Igbm90IHBvcHVsYXRlZCwgdGhlIGpvYiBydW5zIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgZm9yIHF1ZXVlaW5nLlxuICAgKiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBzZXQgaW4gdGhlIGpvYiBydW4sIHRoZW4gdGhlIHZhbHVlIGZyb21cbiAgICogdGhlIGpvYiBydW4gZmllbGQgd2lsbCBiZSB1c2VkLiBUaGlzIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGZhbHNlIGZvciBmbGV4IGpvYnMuXG4gICAqIElmIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCwgbWF4UmV0cmllcyBtdXN0IGJlIHNldCB0byB6ZXJvLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGpvYiBydW4gcXVldWluZ1xuICAgKi9cbiAgcmVhZG9ubHkgam9iUnVuUXVldWluZ0VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNjYWxhIFN0cmVhbWluZyBKb2JzIGNsYXNzXG4gKlxuICogQSBTdHJlYW1pbmcgam9iIGlzIHNpbWlsYXIgdG8gYW4gRVRMIGpvYiwgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgRVRMIG9uIGRhdGEgc3RyZWFtc1xuICogdXNpbmcgdGhlIEFwYWNoZSBTcGFyayBTdHJ1Y3R1cmVkIFN0cmVhbWluZyBmcmFtZXdvcmsuXG4gKiBUaGVzZSBqb2JzIHdpbGwgZGVmYXVsdCB0byB1c2UgUHl0aG9uIDMuOS5cbiAqXG4gKiBTaW1pbGFyIHRvIEVUTCBqb2JzLCBzdHJlYW1pbmcgam9iIHN1cHBvcnRzIFNjYWxhIGFuZCBQeXRob24gbGFuZ3VhZ2VzLiBTaW1pbGFyIHRvIEVUTCxcbiAqIGl0IHN1cHBvcnRzIEcxIGFuZCBHMiB3b3JrZXIgdHlwZSBhbmQgMi4wLCAzLjAgYW5kIDQuMCB2ZXJzaW9uLiBXZeKAmWxsIGRlZmF1bHQgdG8gRzIgd29ya2VyXG4gKiBhbmQgNC4wIHZlcnNpb24gZm9yIHN0cmVhbWluZyBqb2JzIHdoaWNoIGRldmVsb3BlcnMgY2FuIG92ZXJyaWRlLlxuICogV2Ugd2lsbCBlbmFibGUg4oCUZW5hYmxlLW1ldHJpY3MsIOKAlGVuYWJsZS1zcGFyay11aSwg4oCUZW5hYmxlLWNvbnRpbnVvdXMtY2xvdWR3YXRjaC1sb2cuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2FsYVNwYXJrU3RyZWFtaW5nSm9iIGV4dGVuZHMgSm9iIHtcbiAgcHVibGljIHJlYWRvbmx5IGpvYkFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgam9iTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBUaGUgU3BhcmsgVUkgbG9ncyBsb2NhdGlvbiBpZiBTcGFyayBVSSBtb25pdG9yaW5nIGFuZCBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvci1zcGFyay11aS1qb2JzLmh0bWxcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzcGFya1VJTG9nZ2luZ0xvY2F0aW9uPzogU3BhcmtVSUxvZ2dpbmdMb2NhdGlvbjtcblxuICAvKipcbiAgICogU2NhbGFTcGFya1N0cmVhbWluZ0pvYiBjb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNjYWxhU3BhcmtTdHJlYW1pbmdKb2JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5qb2JOYW1lLFxuICAgIH0pO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgLy8gU2V0IHVwIHJvbGUgYW5kIHBlcm1pc3Npb25zIGZvciBwcmluY2lwYWxcbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZ2x1ZS5hbWF6b25hd3MuY29tJyksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NHbHVlU2VydmljZVJvbGUnKV0sXG4gICAgfTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gRW5hYmxlIFNwYXJrVUkgYnkgZGVmYXVsdCBhcyBhIGJlc3QgcHJhY3RpY2VcbiAgICBjb25zdCBzcGFya1VJQXJncyA9IHByb3BzLnNwYXJrVUk/LmJ1Y2tldCA/IHRoaXMuc2V0dXBTcGFya1VJKHRoaXMucm9sZSwgcHJvcHMuc3BhcmtVSSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zcGFya1VJTG9nZ2luZ0xvY2F0aW9uID0gc3BhcmtVSUFyZ3M/LmxvY2F0aW9uO1xuXG4gICAgLy8gRW5hYmxlIENsb3VkV2F0Y2ggbWV0cmljcyBhbmQgY29udGludW91cyBsb2dnaW5nIGJ5IGRlZmF1bHQgYXMgYSBiZXN0IHByYWN0aWNlXG4gICAgY29uc3QgY29udGludW91c0xvZ2dpbmdBcmdzID0gdGhpcy5zZXR1cENvbnRpbnVvdXNMb2dnaW5nKHRoaXMucm9sZSwgcHJvcHMuY29udGludW91c0xvZ2dpbmcpO1xuICAgIGNvbnN0IHByb2ZpbGluZ01ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtbWV0cmljcyc6ICcnIH07XG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eU1ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtb2JzZXJ2YWJpbGl0eS1tZXRyaWNzJzogJ3RydWUnIH07XG5cbiAgICAvLyBHYXRoZXIgZXhlY3V0YWJsZSBhcmd1bWVudHNcbiAgICBjb25zdCBleGVjdXRhYmxlQXJncyA9IHRoaXMuZXhlY3V0YWJsZUFyZ3VtZW50cyhwcm9wcyk7XG5cbiAgICAvLyBNYW5kYXRvcnkgY2xhc3NOYW1lIGFyZ3VtZW50XG4gICAgaWYgKHByb3BzLmNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsYXNzTmFtZSBtdXN0IGJlIHNldCBmb3IgU2NhbGEgRVRMIEpvYnMnKTtcbiAgICB9XG5cbiAgICAvLyBDb25iaW5lIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBsaW5lIGl0ZW1cbiAgICBjb25zdCBkZWZhdWx0QXJndW1lbnRzID0ge1xuICAgICAgLi4uZXhlY3V0YWJsZUFyZ3MsXG4gICAgICAuLi5jb250aW51b3VzTG9nZ2luZ0FyZ3MsXG4gICAgICAuLi5wcm9maWxpbmdNZXRyaWNzQXJncyxcbiAgICAgIC4uLm9ic2VydmFiaWxpdHlNZXRyaWNzQXJncyxcbiAgICAgIC4uLnNwYXJrVUlBcmdzPy5hcmdzLFxuICAgICAgLi4udGhpcy5jaGVja05vUmVzZXJ2ZWRBcmdzKHByb3BzLmRlZmF1bHRBcmd1bWVudHMpLFxuICAgIH07XG5cbiAgICBpZiAoKCFwcm9wcy53b3JrZXJUeXBlICYmIHByb3BzLm51bWJlck9mV29ya2VycyAhPT0gdW5kZWZpbmVkKSB8fCAocHJvcHMud29ya2VyVHlwZSAmJiBwcm9wcy5udW1iZXJPZldvcmtlcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQm90aCB3b3JrZXJUeXBlIGFuZCBudW1iZXJPZldvcmtlcnMgbXVzdCBiZSBzZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JSZXNvdXJjZSA9IG5ldyBDZm5Kb2IodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogcHJvcHMuam9iTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJvbGU6IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgY29tbWFuZDoge1xuICAgICAgICBuYW1lOiBKb2JUeXBlLlNUUkVBTUlORyxcbiAgICAgICAgc2NyaXB0TG9jYXRpb246IHRoaXMuY29kZVMzT2JqZWN0VXJsKHByb3BzLnNjcmlwdCksXG4gICAgICB9LFxuICAgICAgZ2x1ZVZlcnNpb246IHByb3BzLmdsdWVWZXJzaW9uID8gcHJvcHMuZ2x1ZVZlcnNpb24gOiBHbHVlVmVyc2lvbi5WNF8wLFxuICAgICAgd29ya2VyVHlwZTogcHJvcHMud29ya2VyVHlwZSA/IHByb3BzLndvcmtlclR5cGUgOiBXb3JrZXJUeXBlLkdfMVgsXG4gICAgICBudW1iZXJPZldvcmtlcnM6IHByb3BzLm51bWJlck9mV29ya2VycyA/IHByb3BzLm51bWJlck9mV29ya2VycyA6IDEwLFxuICAgICAgbWF4UmV0cmllczogcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgPyAwIDogcHJvcHMubWF4UmV0cmllcyxcbiAgICAgIGpvYlJ1blF1ZXVpbmdFbmFibGVkOiBwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA/IHByb3BzLmpvYlJ1blF1ZXVpbmdFbmFibGVkIDogZmFsc2UsXG4gICAgICBleGVjdXRpb25Qcm9wZXJ0eTogcHJvcHMubWF4Q29uY3VycmVudFJ1bnMgPyB7IG1heENvbmN1cnJlbnRSdW5zOiBwcm9wcy5tYXhDb25jdXJyZW50UnVucyB9IDogdW5kZWZpbmVkLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dD8udG9NaW51dGVzKCksXG4gICAgICBjb25uZWN0aW9uczogcHJvcHMuY29ubmVjdGlvbnMgPyB7IGNvbm5lY3Rpb25zOiBwcm9wcy5jb25uZWN0aW9ucy5tYXAoKGNvbm5lY3Rpb24pID0+IGNvbm5lY3Rpb24uY29ubmVjdGlvbk5hbWUpIH0gOiB1bmRlZmluZWQsXG4gICAgICBzZWN1cml0eUNvbmZpZ3VyYXRpb246IHByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbj8uc2VjdXJpdHlDb25maWd1cmF0aW9uTmFtZSxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MsXG4gICAgICBkZWZhdWx0QXJndW1lbnRzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gdGhpcy5nZXRSZXNvdXJjZU5hbWVBdHRyaWJ1dGUoam9iUmVzb3VyY2UucmVmKTtcbiAgICB0aGlzLmpvYkFybiA9IHRoaXMuYnVpbGRKb2JBcm4odGhpcywgcmVzb3VyY2VOYW1lKTtcbiAgICB0aGlzLmpvYk5hbWUgPSByZXNvdXJjZU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBleGVjdXRhYmxlIGFyZ3VtZW50cyB3aXRoIGJlc3QgcHJhY3RpY2VzIGVuYWJsZWQgYnkgZGVmYXVsdFxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhcmd1bWVudHMgZm9yIEdsdWUgdG8gdXNlIG9uIGV4ZWN1dGlvblxuICAgKi9cbiAgcHJpdmF0ZSBleGVjdXRhYmxlQXJndW1lbnRzKHByb3BzOiBTY2FsYVNwYXJrU3RyZWFtaW5nSm9iUHJvcHMpIHtcbiAgICBjb25zdCBhcmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgYXJnc1snLS1qb2ItbGFuZ3VhZ2UnXSA9IEpvYkxhbmd1YWdlLlNDQUxBO1xuICAgIGFyZ3NbJy0tY2xhc3MnXSA9IHByb3BzLmNsYXNzTmFtZSE7XG5cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTcGFya1VJKHJvbGU6IGlhbS5JUm9sZSwgc3BhcmtVaVByb3BzOiBTcGFya1VJUHJvcHMpIHtcbiAgICB2YWxpZGF0ZVNwYXJrVWlQcmVmaXgoc3BhcmtVaVByb3BzLnByZWZpeCk7XG4gICAgY29uc3QgYnVja2V0ID0gc3BhcmtVaVByb3BzLmJ1Y2tldCA/PyBuZXcgQnVja2V0KHRoaXMsICdTcGFya1VJQnVja2V0JywgeyBlbmZvcmNlU1NMOiB0cnVlLCBlbmNyeXB0aW9uOiBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQgfSk7XG4gICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHJvbGUsIGNsZWFuU3BhcmtVaVByZWZpeEZvckdyYW50KHNwYXJrVWlQcm9wcy5wcmVmaXgpKTtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgJy0tZW5hYmxlLXNwYXJrLXVpJzogJ3RydWUnLFxuICAgICAgJy0tc3BhcmstZXZlbnQtbG9ncy1wYXRoJzogYnVja2V0LnMzVXJsRm9yT2JqZWN0KHNwYXJrVWlQcm9wcy5wcmVmaXgpLnJlcGxhY2UoL1xcLz8kLywgJy8nKSwgLy8gcGF0aCB3aWxsIGFsd2F5cyBlbmQgd2l0aCBhIHNsYXNoXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvbjoge1xuICAgICAgICBwcmVmaXg6IHNwYXJrVWlQcm9wcy5wcmVmaXgsXG4gICAgICAgIGJ1Y2tldCxcbiAgICAgIH0sXG4gICAgICBhcmdzLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,53 @@
1
+ import { IBucket } from 'aws-cdk-lib/aws-s3';
2
+ /**
3
+ * Properties for enabling Spark UI monitoring feature for Spark-based Glue jobs.
4
+ *
5
+ * @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
6
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
7
+ */
8
+ export interface SparkUIProps {
9
+ /**
10
+ * The bucket where the Glue job stores the logs.
11
+ *
12
+ * @default a new bucket will be created.
13
+ */
14
+ readonly bucket?: IBucket;
15
+ /**
16
+ * The path inside the bucket (objects prefix) where the Glue job stores the logs.
17
+ * Use format `'/foo/bar'`
18
+ *
19
+ * @default - the logs will be written at the root of the bucket
20
+ */
21
+ readonly prefix?: string;
22
+ /**
23
+ * Specifies whether job run queuing is enabled for the job runs for this job.
24
+ * A value of true means job run queuing is enabled for the job runs.
25
+ * If false or not populated, the job runs will not be considered for queueing.
26
+ * If this field does not match the value set in the job run, then the value from
27
+ * the job run field will be used. This property must be set to false for flex jobs.
28
+ * If this property is enabled, maxRetries must be set to zero.
29
+ *
30
+ * @default - no job run queuing
31
+ */
32
+ readonly jobRunQueuingEnabled?: boolean;
33
+ }
34
+ /**
35
+ * The Spark UI logging location.
36
+ *
37
+ * @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
38
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
39
+ */
40
+ export interface SparkUILoggingLocation {
41
+ /**
42
+ * The bucket where the Glue job stores the logs.
43
+ */
44
+ readonly bucket: IBucket;
45
+ /**
46
+ * The path inside the bucket (objects prefix) where the Glue job stores the logs.
47
+ *
48
+ * @default '/' - the logs will be written at the root of the bucket
49
+ */
50
+ readonly prefix?: string;
51
+ }
52
+ export declare function validateSparkUiPrefix(prefix?: string): void;
53
+ export declare function cleanSparkUiPrefixForGrant(prefix?: string): string | undefined;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateSparkUiPrefix = validateSparkUiPrefix;
4
+ exports.cleanSparkUiPrefixForGrant = cleanSparkUiPrefixForGrant;
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ const os_1 = require("os");
7
+ function validateSparkUiPrefix(prefix) {
8
+ if (!prefix || aws_cdk_lib_1.Token.isUnresolved(prefix)) {
9
+ // skip validation if prefix is not specified or is a token
10
+ return;
11
+ }
12
+ const errors = [];
13
+ if (!prefix.startsWith('/')) {
14
+ errors.push('Prefix must begin with \'/\'');
15
+ }
16
+ if (prefix.endsWith('/')) {
17
+ errors.push('Prefix must not end with \'/\'');
18
+ }
19
+ if (errors.length > 0) {
20
+ throw new Error(`Invalid prefix format (value: ${prefix})${os_1.EOL}${errors.join(os_1.EOL)}`);
21
+ }
22
+ }
23
+ function cleanSparkUiPrefixForGrant(prefix) {
24
+ return prefix !== undefined ? prefix.slice(1) + '/*' : undefined;
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcmstdWktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcGFyay11aS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTJEQSxzREFtQkM7QUFFRCxnRUFFQztBQWpGRCw2Q0FBb0M7QUFDcEMsMkJBQXlCO0FBeUR6QixTQUFnQixxQkFBcUIsQ0FBQyxNQUFlO0lBQ25ELElBQUksQ0FBQyxNQUFNLElBQUksbUJBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMxQywyREFBMkQ7UUFDM0QsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFFNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLE1BQU0sSUFBSSxRQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkYsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFnQiwwQkFBMEIsQ0FBQyxNQUFlO0lBQ3hELE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNuRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEVPTCB9IGZyb20gJ29zJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBlbmFibGluZyBTcGFyayBVSSBtb25pdG9yaW5nIGZlYXR1cmUgZm9yIFNwYXJrLWJhc2VkIEdsdWUgam9icy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLXNwYXJrLXVpLWpvYnMuaHRtbFxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGFya1VJUHJvcHMge1xuICAvKipcbiAgICogVGhlIGJ1Y2tldCB3aGVyZSB0aGUgR2x1ZSBqb2Igc3RvcmVzIHRoZSBsb2dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhIG5ldyBidWNrZXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0PzogSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIHBhdGggaW5zaWRlIHRoZSBidWNrZXQgKG9iamVjdHMgcHJlZml4KSB3aGVyZSB0aGUgR2x1ZSBqb2Igc3RvcmVzIHRoZSBsb2dzLlxuICAgKiBVc2UgZm9ybWF0IGAnL2Zvby9iYXInYFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBsb2dzIHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgcm9vdCBvZiB0aGUgYnVja2V0XG4gICAqL1xuICByZWFkb25seSBwcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGpvYiBydW4gcXVldWluZyBpcyBlbmFibGVkIGZvciB0aGUgam9iIHJ1bnMgZm9yIHRoaXMgam9iLlxuICAgKiBBIHZhbHVlIG9mIHRydWUgbWVhbnMgam9iIHJ1biBxdWV1aW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBqb2IgcnVucy5cbiAgICogSWYgZmFsc2Ugb3Igbm90IHBvcHVsYXRlZCwgdGhlIGpvYiBydW5zIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgZm9yIHF1ZXVlaW5nLlxuICAgKiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBzZXQgaW4gdGhlIGpvYiBydW4sIHRoZW4gdGhlIHZhbHVlIGZyb21cbiAgICogdGhlIGpvYiBydW4gZmllbGQgd2lsbCBiZSB1c2VkLiBUaGlzIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGZhbHNlIGZvciBmbGV4IGpvYnMuXG4gICAqIElmIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCwgbWF4UmV0cmllcyBtdXN0IGJlIHNldCB0byB6ZXJvLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGpvYiBydW4gcXVldWluZ1xuICAgKi9cbiAgcmVhZG9ubHkgam9iUnVuUXVldWluZ0VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBTcGFyayBVSSBsb2dnaW5nIGxvY2F0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3Itc3BhcmstdWktam9icy5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXJrVUlMb2dnaW5nTG9jYXRpb24ge1xuICAvKipcbiAgICogVGhlIGJ1Y2tldCB3aGVyZSB0aGUgR2x1ZSBqb2Igc3RvcmVzIHRoZSBsb2dzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0OiBJQnVja2V0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBpbnNpZGUgdGhlIGJ1Y2tldCAob2JqZWN0cyBwcmVmaXgpIHdoZXJlIHRoZSBHbHVlIGpvYiBzdG9yZXMgdGhlIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0ICcvJyAtIHRoZSBsb2dzIHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgcm9vdCBvZiB0aGUgYnVja2V0XG4gICAqL1xuICByZWFkb25seSBwcmVmaXg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNwYXJrVWlQcmVmaXgocHJlZml4Pzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghcHJlZml4IHx8IFRva2VuLmlzVW5yZXNvbHZlZChwcmVmaXgpKSB7XG4gICAgLy8gc2tpcCB2YWxpZGF0aW9uIGlmIHByZWZpeCBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIGEgdG9rZW5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKCFwcmVmaXguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgZXJyb3JzLnB1c2goJ1ByZWZpeCBtdXN0IGJlZ2luIHdpdGggXFwnL1xcJycpO1xuICB9XG5cbiAgaWYgKHByZWZpeC5lbmRzV2l0aCgnLycpKSB7XG4gICAgZXJyb3JzLnB1c2goJ1ByZWZpeCBtdXN0IG5vdCBlbmQgd2l0aCBcXCcvXFwnJyk7XG4gIH1cblxuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJlZml4IGZvcm1hdCAodmFsdWU6ICR7cHJlZml4fSkke0VPTH0ke2Vycm9ycy5qb2luKEVPTCl9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuU3BhcmtVaVByZWZpeEZvckdyYW50KHByZWZpeD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBwcmVmaXggIT09IHVuZGVmaW5lZCA/IHByZWZpeC5zbGljZSgxKSArICcvKicgOiB1bmRlZmluZWQ7XG59XG4iXX0=
package/lib/s3-table.d.ts CHANGED
@@ -35,10 +35,10 @@ export declare enum TableEncryption {
35
35
  }
36
36
  export interface S3TableProps extends TableBaseProps {
37
37
  /**
38
- * S3 bucket in which to store data.
39
- *
40
- * @default one is created for you
41
- */
38
+ * S3 bucket in which to store data.
39
+ *
40
+ * @default one is created for you
41
+ */
42
42
  readonly bucket?: s3.IBucket;
43
43
  /**
44
44
  * S3 prefix under which table objects are stored.