@aws-cdk/aws-glue-alpha 2.176.0-alpha.0 → 2.177.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 (53) hide show
  1. package/.jsii +5851 -3571
  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 -4
  7. package/lib/connection.js +3 -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 +2 -2
  12. package/lib/database.js +2 -2
  13. package/lib/external-table.js +1 -1
  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 +299 -0
  18. package/lib/jobs/pyspark-etl-job.d.ts +81 -0
  19. package/lib/jobs/pyspark-etl-job.js +127 -0
  20. package/lib/jobs/pyspark-flex-etl-job.d.ts +83 -0
  21. package/lib/jobs/pyspark-flex-etl-job.js +134 -0
  22. package/lib/jobs/pyspark-streaming-job.d.ts +82 -0
  23. package/lib/jobs/pyspark-streaming-job.js +128 -0
  24. package/lib/jobs/python-shell-job.d.ts +55 -0
  25. package/lib/jobs/python-shell-job.js +96 -0
  26. package/lib/jobs/ray-job.d.ts +44 -0
  27. package/lib/jobs/ray-job.js +87 -0
  28. package/lib/jobs/scala-spark-etl-job.d.ts +78 -0
  29. package/lib/jobs/scala-spark-etl-job.js +131 -0
  30. package/lib/jobs/scala-spark-flex-etl-job.d.ts +109 -0
  31. package/lib/jobs/scala-spark-flex-etl-job.js +140 -0
  32. package/lib/jobs/scala-spark-streaming-job.d.ts +77 -0
  33. package/lib/jobs/scala-spark-streaming-job.js +128 -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 +2 -2
  38. package/lib/schema.d.ts +1 -1
  39. package/lib/schema.js +2 -2
  40. package/lib/security-configuration.js +2 -2
  41. package/lib/storage-parameter.js +1 -1
  42. package/lib/table-base.js +2 -2
  43. package/lib/table-deprecated.js +1 -1
  44. package/lib/triggers/trigger-options.d.ts +205 -0
  45. package/lib/triggers/trigger-options.js +39 -0
  46. package/lib/triggers/workflow.d.ts +203 -0
  47. package/lib/triggers/workflow.js +368 -0
  48. package/package.json +8 -8
  49. package/rosetta/default.ts-fixture +1 -1
  50. package/lib/job-executable.d.ts +0 -384
  51. package/lib/job-executable.js +0 -348
  52. package/lib/job.d.ts +0 -574
  53. package/lib/job.js +0 -531
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PythonShellJob = 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 job_1 = require("./job");
10
+ const constants_1 = require("../constants");
11
+ /**
12
+ * Python Shell Jobs class
13
+ *
14
+ * A Python shell job runs Python scripts as a shell and supports a Python version that
15
+ * depends on the AWS Glue version you are using.
16
+ * This can be used to schedule and run tasks that don't require an Apache Spark environment.
17
+ */
18
+ class PythonShellJob extends job_1.Job {
19
+ /**
20
+ * PythonShellJob constructor
21
+ */
22
+ constructor(scope, id, props) {
23
+ super(scope, id, { physicalName: props.jobName });
24
+ try {
25
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_PythonShellJobProps(props);
26
+ }
27
+ catch (error) {
28
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
29
+ Error.captureStackTrace(error, PythonShellJob);
30
+ }
31
+ throw error;
32
+ }
33
+ // Set up role and permissions for principal
34
+ this.role = props.role, {
35
+ assumedBy: new iam.ServicePrincipal('glue.amazonaws.com'),
36
+ managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSGlueServiceRole')],
37
+ };
38
+ this.grantPrincipal = this.role;
39
+ // Enable CloudWatch metrics and continuous logging by default as a best practice
40
+ const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
41
+ const profilingMetricsArgs = { '--enable-metrics': '' };
42
+ const observabilityMetricsArgs = { '--enable-observability-metrics': 'true' };
43
+ // Gather executable arguments
44
+ const executableArgs = this.executableArguments(props);
45
+ // Combine command line arguments into a single line item
46
+ const defaultArguments = {
47
+ ...executableArgs,
48
+ ...continuousLoggingArgs,
49
+ ...profilingMetricsArgs,
50
+ ...observabilityMetricsArgs,
51
+ ...this.checkNoReservedArgs(props.defaultArguments),
52
+ };
53
+ const jobResource = new aws_glue_1.CfnJob(this, 'Resource', {
54
+ name: props.jobName,
55
+ description: props.description,
56
+ role: this.role.roleArn,
57
+ command: {
58
+ name: constants_1.JobType.PYTHON_SHELL,
59
+ scriptLocation: this.codeS3ObjectUrl(props.script),
60
+ pythonVersion: props.pythonVersion ? props.pythonVersion : constants_1.PythonVersion.THREE_NINE,
61
+ },
62
+ glueVersion: props.glueVersion ? props.glueVersion : constants_1.GlueVersion.V3_0,
63
+ maxCapacity: props.maxCapacity ? props.maxCapacity : constants_1.MaxCapacity.DPU_1_16TH,
64
+ maxRetries: props.jobRunQueuingEnabled ? 0 : props.maxRetries ? props.maxRetries : 0,
65
+ jobRunQueuingEnabled: props.jobRunQueuingEnabled ? props.jobRunQueuingEnabled : false,
66
+ executionProperty: props.maxConcurrentRuns ? { maxConcurrentRuns: props.maxConcurrentRuns } : undefined,
67
+ timeout: props.timeout?.toMinutes(),
68
+ connections: props.connections ? { connections: props.connections.map((connection) => connection.connectionName) } : undefined,
69
+ securityConfiguration: props.securityConfiguration?.securityConfigurationName,
70
+ tags: props.tags,
71
+ defaultArguments,
72
+ });
73
+ const resourceName = this.getResourceNameAttribute(jobResource.ref);
74
+ this.jobArn = this.buildJobArn(this, resourceName);
75
+ this.jobName = resourceName;
76
+ }
77
+ /**
78
+ * Set the executable arguments with best practices enabled by default
79
+ *
80
+ * @returns An array of arguments for Glue to use on execution
81
+ */
82
+ executableArguments(props) {
83
+ const args = {};
84
+ args['--job-language'] = constants_1.JobLanguage.PYTHON;
85
+ // If no Python version set (default 3.9) or the version is set to 3.9 then set library-set argument
86
+ if (!props.pythonVersion || props.pythonVersion == constants_1.PythonVersion.THREE_NINE) {
87
+ // Selecting this option includes common libraries for Python 3.9
88
+ args['library-set'] = 'analytics';
89
+ }
90
+ return args;
91
+ }
92
+ }
93
+ exports.PythonShellJob = PythonShellJob;
94
+ _a = JSII_RTTI_SYMBOL_1;
95
+ PythonShellJob[_a] = { fqn: "@aws-cdk/aws-glue-alpha.PythonShellJob", version: "2.177.0-alpha.0" };
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLXNoZWxsLWpvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInB5dGhvbi1zaGVsbC1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQThDO0FBQzlDLDJDQUEyQztBQUMzQywrQkFBMkM7QUFFM0MsNENBQTZGO0FBaUM3Rjs7Ozs7O0dBTUc7QUFDSCxNQUFhLGNBQWUsU0FBUSxTQUFHO0lBTXJDOztNQUVFO0lBQ0YsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzs7Ozs7OytDQVZ6QyxjQUFjOzs7O1FBWXZCLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDdEIsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDO1lBQ3pELGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNqRyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWhDLGlGQUFpRjtRQUNqRixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4RCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFFOUUsOEJBQThCO1FBQzlCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2RCx5REFB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QztRQUNwQyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7S0FDYjs7QUE5RUgsd0NBK0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuSm9iIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgSm9iLCBKb2JQcm9wZXJ0aWVzIH0gZnJvbSAnLi9qb2InO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBKb2JUeXBlLCBHbHVlVmVyc2lvbiwgUHl0aG9uVmVyc2lvbiwgTWF4Q2FwYWNpdHksIEpvYkxhbmd1YWdlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIFB5dGhvbiBTaGVsbCBqb2JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQeXRob25TaGVsbEpvYlByb3BzIGV4dGVuZHMgSm9iUHJvcGVydGllcyB7XG4gIC8qKlxuICAqIFB5dGhvbiBWZXJzaW9uXG4gICogVGhlIHZlcnNpb24gb2YgUHl0aG9uIHRvIHVzZSB0byBleGVjdXRlIHRoaXMgam9iXG4gICogQGRlZmF1bHQgMy45IGZvciBTaGVsbCBKb2JzXG4gICoqL1xuICByZWFkb25seSBweXRob25WZXJzaW9uPzogUHl0aG9uVmVyc2lvbjtcblxuICAvKipcbiAgICogVGhlIHRvdGFsIG51bWJlciBvZiBEUFUgdG8gYXNzaWduIHRvIHRoZSBQeXRob24gSm9iXG4gICAqXG4gICAqIEBkZWZhdWx0IDAuMDYyNVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q2FwYWNpdHk/OiBNYXhDYXBhY2l0eTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgam9iIHJ1biBxdWV1aW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBqb2IgcnVucyBmb3IgdGhpcyBqb2IuXG4gICAqIEEgdmFsdWUgb2YgdHJ1ZSBtZWFucyBqb2IgcnVuIHF1ZXVpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIGpvYiBydW5zLlxuICAgKiBJZiBmYWxzZSBvciBub3QgcG9wdWxhdGVkLCB0aGUgam9iIHJ1bnMgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBmb3IgcXVldWVpbmcuXG4gICAqIElmIHRoaXMgZmllbGQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlIHNldCBpbiB0aGUgam9iIHJ1biwgdGhlbiB0aGUgdmFsdWUgZnJvbVxuICAgKiB0aGUgam9iIHJ1biBmaWVsZCB3aWxsIGJlIHVzZWQuIFRoaXMgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gZmFsc2UgZm9yIGZsZXggam9icy5cbiAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBlbmFibGVkLCBtYXhSZXRyaWVzIG11c3QgYmUgc2V0IHRvIHplcm8uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBqb2JSdW5RdWV1aW5nRW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHl0aG9uIFNoZWxsIEpvYnMgY2xhc3NcbiAqXG4gKiBBIFB5dGhvbiBzaGVsbCBqb2IgcnVucyBQeXRob24gc2NyaXB0cyBhcyBhIHNoZWxsIGFuZCBzdXBwb3J0cyBhIFB5dGhvbiB2ZXJzaW9uIHRoYXRcbiAqIGRlcGVuZHMgb24gdGhlIEFXUyBHbHVlIHZlcnNpb24geW91IGFyZSB1c2luZy5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2NoZWR1bGUgYW5kIHJ1biB0YXNrcyB0aGF0IGRvbid0IHJlcXVpcmUgYW4gQXBhY2hlIFNwYXJrIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgY2xhc3MgUHl0aG9uU2hlbGxKb2IgZXh0ZW5kcyBKb2Ige1xuICBwdWJsaWMgcmVhZG9ubHkgam9iQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBqb2JOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICogUHl0aG9uU2hlbGxKb2IgY29uc3RydWN0b3JcbiAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFB5dGhvblNoZWxsSm9iUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHsgcGh5c2ljYWxOYW1lOiBwcm9wcy5qb2JOYW1lIH0pO1xuXG4gICAgLy8gU2V0IHVwIHJvbGUgYW5kIHBlcm1pc3Npb25zIGZvciBwcmluY2lwYWxcbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZ2x1ZS5hbWF6b25hd3MuY29tJyksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NHbHVlU2VydmljZVJvbGUnKV0sXG4gICAgfTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gRW5hYmxlIENsb3VkV2F0Y2ggbWV0cmljcyBhbmQgY29udGludW91cyBsb2dnaW5nIGJ5IGRlZmF1bHQgYXMgYSBiZXN0IHByYWN0aWNlXG4gICAgY29uc3QgY29udGludW91c0xvZ2dpbmdBcmdzID0gdGhpcy5zZXR1cENvbnRpbnVvdXNMb2dnaW5nKHRoaXMucm9sZSwgcHJvcHMuY29udGludW91c0xvZ2dpbmcpO1xuICAgIGNvbnN0IHByb2ZpbGluZ01ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtbWV0cmljcyc6ICcnIH07XG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eU1ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtb2JzZXJ2YWJpbGl0eS1tZXRyaWNzJzogJ3RydWUnIH07XG5cbiAgICAvLyBHYXRoZXIgZXhlY3V0YWJsZSBhcmd1bWVudHNcbiAgICBjb25zdCBleGVjdXRhYmxlQXJncyA9IHRoaXMuZXhlY3V0YWJsZUFyZ3VtZW50cyhwcm9wcyk7XG5cbiAgICAvLyBDb21iaW5lIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBsaW5lIGl0ZW1cbiAgICBjb25zdCBkZWZhdWx0QXJndW1lbnRzID0ge1xuICAgICAgLi4uZXhlY3V0YWJsZUFyZ3MsXG4gICAgICAuLi5jb250aW51b3VzTG9nZ2luZ0FyZ3MsXG4gICAgICAuLi5wcm9maWxpbmdNZXRyaWNzQXJncyxcbiAgICAgIC4uLm9ic2VydmFiaWxpdHlNZXRyaWNzQXJncyxcbiAgICAgIC4uLnRoaXMuY2hlY2tOb1Jlc2VydmVkQXJncyhwcm9wcy5kZWZhdWx0QXJndW1lbnRzKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgam9iUmVzb3VyY2UgPSBuZXcgQ2ZuSm9iKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHByb3BzLmpvYk5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICByb2xlOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgbmFtZTogSm9iVHlwZS5QWVRIT05fU0hFTEwsXG4gICAgICAgIHNjcmlwdExvY2F0aW9uOiB0aGlzLmNvZGVTM09iamVjdFVybChwcm9wcy5zY3JpcHQpLFxuICAgICAgICBweXRob25WZXJzaW9uOiBwcm9wcy5weXRob25WZXJzaW9uID8gcHJvcHMucHl0aG9uVmVyc2lvbiA6IFB5dGhvblZlcnNpb24uVEhSRUVfTklORSxcbiAgICAgIH0sXG4gICAgICBnbHVlVmVyc2lvbjogcHJvcHMuZ2x1ZVZlcnNpb24gPyBwcm9wcy5nbHVlVmVyc2lvbiA6IEdsdWVWZXJzaW9uLlYzXzAsXG4gICAgICBtYXhDYXBhY2l0eTogcHJvcHMubWF4Q2FwYWNpdHkgPyBwcm9wcy5tYXhDYXBhY2l0eSA6IE1heENhcGFjaXR5LkRQVV8xXzE2VEgsXG4gICAgICBtYXhSZXRyaWVzOiBwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA/IDAgOiBwcm9wcy5tYXhSZXRyaWVzID8gcHJvcHMubWF4UmV0cmllcyA6IDAsXG4gICAgICBqb2JSdW5RdWV1aW5nRW5hYmxlZDogcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgPyBwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA6IGZhbHNlLFxuICAgICAgZXhlY3V0aW9uUHJvcGVydHk6IHByb3BzLm1heENvbmN1cnJlbnRSdW5zID8geyBtYXhDb25jdXJyZW50UnVuczogcHJvcHMubWF4Q29uY3VycmVudFJ1bnMgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQ/LnRvTWludXRlcygpLFxuICAgICAgY29ubmVjdGlvbnM6IHByb3BzLmNvbm5lY3Rpb25zID8geyBjb25uZWN0aW9uczogcHJvcHMuY29ubmVjdGlvbnMubWFwKChjb25uZWN0aW9uKSA9PiBjb25uZWN0aW9uLmNvbm5lY3Rpb25OYW1lKSB9IDogdW5kZWZpbmVkLFxuICAgICAgc2VjdXJpdHlDb25maWd1cmF0aW9uOiBwcm9wcy5zZWN1cml0eUNvbmZpZ3VyYXRpb24/LnNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWUsXG4gICAgICB0YWdzOiBwcm9wcy50YWdzLFxuICAgICAgZGVmYXVsdEFyZ3VtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKGpvYlJlc291cmNlLnJlZik7XG4gICAgdGhpcy5qb2JBcm4gPSB0aGlzLmJ1aWxkSm9iQXJuKHRoaXMsIHJlc291cmNlTmFtZSk7XG4gICAgdGhpcy5qb2JOYW1lID0gcmVzb3VyY2VOYW1lO1xuICB9XG5cbiAgLyoqXG4gICogU2V0IHRoZSBleGVjdXRhYmxlIGFyZ3VtZW50cyB3aXRoIGJlc3QgcHJhY3RpY2VzIGVuYWJsZWQgYnkgZGVmYXVsdFxuICAqXG4gICogQHJldHVybnMgQW4gYXJyYXkgb2YgYXJndW1lbnRzIGZvciBHbHVlIHRvIHVzZSBvbiBleGVjdXRpb25cbiAgKi9cbiAgcHJpdmF0ZSBleGVjdXRhYmxlQXJndW1lbnRzKHByb3BzOiBQeXRob25TaGVsbEpvYlByb3BzKSB7XG4gICAgY29uc3QgYXJnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIGFyZ3NbJy0tam9iLWxhbmd1YWdlJ10gPSBKb2JMYW5ndWFnZS5QWVRIT047XG5cbiAgICAvLyBJZiBubyBQeXRob24gdmVyc2lvbiBzZXQgKGRlZmF1bHQgMy45KSBvciB0aGUgdmVyc2lvbiBpcyBzZXQgdG8gMy45IHRoZW4gc2V0IGxpYnJhcnktc2V0IGFyZ3VtZW50XG4gICAgaWYgKCFwcm9wcy5weXRob25WZXJzaW9uIHx8IHByb3BzLnB5dGhvblZlcnNpb24gPT0gUHl0aG9uVmVyc2lvbi5USFJFRV9OSU5FKSB7XG4gICAgICAvLyBTZWxlY3RpbmcgdGhpcyBvcHRpb24gaW5jbHVkZXMgY29tbW9uIGxpYnJhcmllcyBmb3IgUHl0aG9uIDMuOVxuICAgICAgYXJnc1snbGlicmFyeS1zZXQnXSA9ICdhbmFseXRpY3MnO1xuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,44 @@
1
+ import * as iam from 'aws-cdk-lib/aws-iam';
2
+ import { Job, JobProperties } from './job';
3
+ import { Construct } from 'constructs';
4
+ import { Runtime } from '../constants';
5
+ /**
6
+ * Properties for creating a Ray Glue job
7
+ */
8
+ export interface RayJobProps extends JobProperties {
9
+ /**
10
+ * Sets the Ray runtime environment version
11
+ *
12
+ * @default - Runtime version will default to Ray2.4
13
+ */
14
+ readonly runtime?: Runtime;
15
+ /**
16
+ * Specifies whether job run queuing is enabled for the job runs for this job.
17
+ * A value of true means job run queuing is enabled for the job runs.
18
+ * If false or not populated, the job runs will not be considered for queueing.
19
+ * If this field does not match the value set in the job run, then the value from
20
+ * the job run field will be used. This property must be set to false for flex jobs.
21
+ * If this property is enabled, maxRetries must be set to zero.
22
+ *
23
+ * @default - no job run queuing
24
+ */
25
+ readonly jobRunQueuingEnabled?: boolean;
26
+ }
27
+ /**
28
+ * Ray Jobs class
29
+ *
30
+ * Glue Ray jobs use worker type Z.2X and Glue version 4.0.
31
+ * These are not overrideable since these are the only configuration that
32
+ * Glue Ray jobs currently support. The runtime defaults to Ray2.4 and min
33
+ * workers defaults to 3.
34
+ */
35
+ export declare class RayJob extends Job {
36
+ readonly jobArn: string;
37
+ readonly jobName: string;
38
+ readonly role: iam.IRole;
39
+ readonly grantPrincipal: iam.IPrincipal;
40
+ /**
41
+ * RayJob constructor
42
+ */
43
+ constructor(scope: Construct, id: string, props: RayJobProps);
44
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.RayJob = 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 job_1 = require("./job");
10
+ const constants_1 = require("../constants");
11
+ /**
12
+ * Ray Jobs class
13
+ *
14
+ * Glue Ray jobs use worker type Z.2X and Glue version 4.0.
15
+ * These are not overrideable since these are the only configuration that
16
+ * Glue Ray jobs currently support. The runtime defaults to Ray2.4 and min
17
+ * workers defaults to 3.
18
+ */
19
+ class RayJob extends job_1.Job {
20
+ /**
21
+ * RayJob constructor
22
+ */
23
+ constructor(scope, id, props) {
24
+ super(scope, id, {
25
+ physicalName: props.jobName,
26
+ });
27
+ try {
28
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_RayJobProps(props);
29
+ }
30
+ catch (error) {
31
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
32
+ Error.captureStackTrace(error, RayJob);
33
+ }
34
+ throw error;
35
+ }
36
+ this.jobName = props.jobName ?? '';
37
+ // Set up role and permissions for principal
38
+ this.role = props.role, {
39
+ assumedBy: new iam.ServicePrincipal('glue.amazonaws.com'),
40
+ managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSGlueServiceRole')],
41
+ };
42
+ this.grantPrincipal = this.role;
43
+ // Enable CloudWatch metrics and continuous logging by default as a best practice
44
+ const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
45
+ const profilingMetricsArgs = { '--enable-metrics': '' };
46
+ const observabilityMetricsArgs = { '--enable-observability-metrics': 'true' };
47
+ // Combine command line arguments into a single line item
48
+ const defaultArguments = {
49
+ ...this.checkNoReservedArgs(props.defaultArguments),
50
+ ...continuousLoggingArgs,
51
+ ...profilingMetricsArgs,
52
+ ...observabilityMetricsArgs,
53
+ };
54
+ if (props.workerType && props.workerType !== constants_1.WorkerType.Z_2X) {
55
+ throw new Error('Ray jobs only support Z.2X worker type');
56
+ }
57
+ ;
58
+ const jobResource = new aws_glue_1.CfnJob(this, 'Resource', {
59
+ name: props.jobName,
60
+ description: props.description,
61
+ role: this.role.roleArn,
62
+ command: {
63
+ name: constants_1.JobType.RAY,
64
+ scriptLocation: this.codeS3ObjectUrl(props.script),
65
+ runtime: props.runtime ? props.runtime : constants_1.Runtime.RAY_TWO_FOUR,
66
+ },
67
+ glueVersion: constants_1.GlueVersion.V4_0,
68
+ workerType: props.workerType ? props.workerType : constants_1.WorkerType.Z_2X,
69
+ numberOfWorkers: props.numberOfWorkers ? props.numberOfWorkers : 3,
70
+ maxRetries: props.jobRunQueuingEnabled ? 0 : props.maxRetries,
71
+ jobRunQueuingEnabled: props.jobRunQueuingEnabled ? props.jobRunQueuingEnabled : false,
72
+ executionProperty: props.maxConcurrentRuns ? { maxConcurrentRuns: props.maxConcurrentRuns } : undefined,
73
+ timeout: props.timeout?.toMinutes(),
74
+ connections: props.connections ? { connections: props.connections.map((connection) => connection.connectionName) } : undefined,
75
+ securityConfiguration: props.securityConfiguration?.securityConfigurationName,
76
+ tags: props.tags,
77
+ defaultArguments,
78
+ });
79
+ const resourceName = this.getResourceNameAttribute(jobResource.ref);
80
+ this.jobArn = this.buildJobArn(this, resourceName);
81
+ this.jobName = resourceName;
82
+ }
83
+ }
84
+ exports.RayJob = RayJob;
85
+ _a = JSII_RTTI_SYMBOL_1;
86
+ RayJob[_a] = { fqn: "@aws-cdk/aws-glue-alpha.RayJob", version: "2.177.0-alpha.0" };
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF5LWpvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJheS1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQThDO0FBQzlDLDJDQUEyQztBQUMzQywrQkFBMkM7QUFFM0MsNENBQXlFO0FBMEJ6RTs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxNQUFPLFNBQVEsU0FBRztJQU03Qjs7T0FFRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0I7UUFDMUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDNUIsQ0FBQyxDQUFDOzs7Ozs7K0NBWk0sTUFBTTs7OztRQWNmLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFbkMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRTtZQUN0QixTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUM7WUFDekQsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ2pHLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFaEMsaUZBQWlGO1FBQ2pGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUYsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3hELE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUU5RSx5REFBeUQ7UUFDekQsTUFBTSxnQkFBZ0IsR0FBRztZQUN2QixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7WUFDbkQsR0FBRyxxQkFBcUI7WUFDeEIsR0FBRyxvQkFBb0I7WUFDdkIsR0FBRyx3QkFBd0I7U0FDNUIsQ0FBQztRQUVGLElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLHNCQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFBQSxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxpQkFBTSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDL0MsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ25CLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQ3ZCLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsbUJBQU8sQ0FBQyxHQUFHO2dCQUNqQixjQUFjLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUNsRCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQU8sQ0FBQyxZQUFZO2FBQzlEO1lBQ0QsV0FBVyxFQUFFLHVCQUFXLENBQUMsSUFBSTtZQUM3QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsc0JBQVUsQ0FBQyxJQUFJO1lBQ2pFLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFBLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLFVBQVUsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVU7WUFDN0Qsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDckYsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3ZHLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRTtZQUNuQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzlILHFCQUFxQixFQUFFLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSx5QkFBeUI7WUFDN0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLGdCQUFnQjtTQUNqQixDQUFDLENBQUM7UUFFSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7S0FDN0I7O0FBakVILHdCQWtFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbkpvYiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1nbHVlJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEpvYiwgSm9iUHJvcGVydGllcyB9IGZyb20gJy4vam9iJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSm9iVHlwZSwgR2x1ZVZlcnNpb24sIFdvcmtlclR5cGUsIFJ1bnRpbWUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgUmF5IEdsdWUgam9iXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF5Sm9iUHJvcHMgZXh0ZW5kcyBKb2JQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIFNldHMgdGhlIFJheSBydW50aW1lIGVudmlyb25tZW50IHZlcnNpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBSdW50aW1lIHZlcnNpb24gd2lsbCBkZWZhdWx0IHRvIFJheTIuNFxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZT86IFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGpvYiBydW4gcXVldWluZyBpcyBlbmFibGVkIGZvciB0aGUgam9iIHJ1bnMgZm9yIHRoaXMgam9iLlxuICAgKiBBIHZhbHVlIG9mIHRydWUgbWVhbnMgam9iIHJ1biBxdWV1aW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBqb2IgcnVucy5cbiAgICogSWYgZmFsc2Ugb3Igbm90IHBvcHVsYXRlZCwgdGhlIGpvYiBydW5zIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgZm9yIHF1ZXVlaW5nLlxuICAgKiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBzZXQgaW4gdGhlIGpvYiBydW4sIHRoZW4gdGhlIHZhbHVlIGZyb21cbiAgICogdGhlIGpvYiBydW4gZmllbGQgd2lsbCBiZSB1c2VkLiBUaGlzIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGZhbHNlIGZvciBmbGV4IGpvYnMuXG4gICAqIElmIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCwgbWF4UmV0cmllcyBtdXN0IGJlIHNldCB0byB6ZXJvLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGpvYiBydW4gcXVldWluZ1xuICAgKi9cbiAgcmVhZG9ubHkgam9iUnVuUXVldWluZ0VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJheSBKb2JzIGNsYXNzXG4gKlxuICogR2x1ZSBSYXkgam9icyB1c2Ugd29ya2VyIHR5cGUgWi4yWCBhbmQgR2x1ZSB2ZXJzaW9uIDQuMC5cbiAqIFRoZXNlIGFyZSBub3Qgb3ZlcnJpZGVhYmxlIHNpbmNlIHRoZXNlIGFyZSB0aGUgb25seSBjb25maWd1cmF0aW9uIHRoYXRcbiAqIEdsdWUgUmF5IGpvYnMgY3VycmVudGx5IHN1cHBvcnQuIFRoZSBydW50aW1lIGRlZmF1bHRzIHRvIFJheTIuNCBhbmQgbWluXG4gKiB3b3JrZXJzIGRlZmF1bHRzIHRvIDMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSYXlKb2IgZXh0ZW5kcyBKb2Ige1xuICBwdWJsaWMgcmVhZG9ubHkgam9iQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBqb2JOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFJheUpvYiBjb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJheUpvYlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLmpvYk5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmpvYk5hbWUgPSBwcm9wcy5qb2JOYW1lID8/ICcnO1xuXG4gICAgLy8gU2V0IHVwIHJvbGUgYW5kIHBlcm1pc3Npb25zIGZvciBwcmluY2lwYWxcbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZ2x1ZS5hbWF6b25hd3MuY29tJyksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NHbHVlU2VydmljZVJvbGUnKV0sXG4gICAgfTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gRW5hYmxlIENsb3VkV2F0Y2ggbWV0cmljcyBhbmQgY29udGludW91cyBsb2dnaW5nIGJ5IGRlZmF1bHQgYXMgYSBiZXN0IHByYWN0aWNlXG4gICAgY29uc3QgY29udGludW91c0xvZ2dpbmdBcmdzID0gdGhpcy5zZXR1cENvbnRpbnVvdXNMb2dnaW5nKHRoaXMucm9sZSwgcHJvcHMuY29udGludW91c0xvZ2dpbmcpO1xuICAgIGNvbnN0IHByb2ZpbGluZ01ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtbWV0cmljcyc6ICcnIH07XG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eU1ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtb2JzZXJ2YWJpbGl0eS1tZXRyaWNzJzogJ3RydWUnIH07XG5cbiAgICAvLyBDb21iaW5lIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBsaW5lIGl0ZW1cbiAgICBjb25zdCBkZWZhdWx0QXJndW1lbnRzID0ge1xuICAgICAgLi4udGhpcy5jaGVja05vUmVzZXJ2ZWRBcmdzKHByb3BzLmRlZmF1bHRBcmd1bWVudHMpLFxuICAgICAgLi4uY29udGludW91c0xvZ2dpbmdBcmdzLFxuICAgICAgLi4ucHJvZmlsaW5nTWV0cmljc0FyZ3MsXG4gICAgICAuLi5vYnNlcnZhYmlsaXR5TWV0cmljc0FyZ3MsXG4gICAgfTtcblxuICAgIGlmIChwcm9wcy53b3JrZXJUeXBlICYmIHByb3BzLndvcmtlclR5cGUgIT09IFdvcmtlclR5cGUuWl8yWCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYXkgam9icyBvbmx5IHN1cHBvcnQgWi4yWCB3b3JrZXIgdHlwZScpO1xuICAgIH07XG5cbiAgICBjb25zdCBqb2JSZXNvdXJjZSA9IG5ldyBDZm5Kb2IodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogcHJvcHMuam9iTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJvbGU6IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgY29tbWFuZDoge1xuICAgICAgICBuYW1lOiBKb2JUeXBlLlJBWSxcbiAgICAgICAgc2NyaXB0TG9jYXRpb246IHRoaXMuY29kZVMzT2JqZWN0VXJsKHByb3BzLnNjcmlwdCksXG4gICAgICAgIHJ1bnRpbWU6IHByb3BzLnJ1bnRpbWUgPyBwcm9wcy5ydW50aW1lIDogUnVudGltZS5SQVlfVFdPX0ZPVVIsXG4gICAgICB9LFxuICAgICAgZ2x1ZVZlcnNpb246IEdsdWVWZXJzaW9uLlY0XzAsXG4gICAgICB3b3JrZXJUeXBlOiBwcm9wcy53b3JrZXJUeXBlID8gcHJvcHMud29ya2VyVHlwZSA6IFdvcmtlclR5cGUuWl8yWCxcbiAgICAgIG51bWJlck9mV29ya2VyczogcHJvcHMubnVtYmVyT2ZXb3JrZXJzID8gcHJvcHMubnVtYmVyT2ZXb3JrZXJzOiAzLFxuICAgICAgbWF4UmV0cmllczogcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgPyAwIDogcHJvcHMubWF4UmV0cmllcyxcbiAgICAgIGpvYlJ1blF1ZXVpbmdFbmFibGVkOiBwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA/IHByb3BzLmpvYlJ1blF1ZXVpbmdFbmFibGVkIDogZmFsc2UsXG4gICAgICBleGVjdXRpb25Qcm9wZXJ0eTogcHJvcHMubWF4Q29uY3VycmVudFJ1bnMgPyB7IG1heENvbmN1cnJlbnRSdW5zOiBwcm9wcy5tYXhDb25jdXJyZW50UnVucyB9IDogdW5kZWZpbmVkLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dD8udG9NaW51dGVzKCksXG4gICAgICBjb25uZWN0aW9uczogcHJvcHMuY29ubmVjdGlvbnMgPyB7IGNvbm5lY3Rpb25zOiBwcm9wcy5jb25uZWN0aW9ucy5tYXAoKGNvbm5lY3Rpb24pID0+IGNvbm5lY3Rpb24uY29ubmVjdGlvbk5hbWUpIH0gOiB1bmRlZmluZWQsXG4gICAgICBzZWN1cml0eUNvbmZpZ3VyYXRpb246IHByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbj8uc2VjdXJpdHlDb25maWd1cmF0aW9uTmFtZSxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MsXG4gICAgICBkZWZhdWx0QXJndW1lbnRzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gdGhpcy5nZXRSZXNvdXJjZU5hbWVBdHRyaWJ1dGUoam9iUmVzb3VyY2UucmVmKTtcbiAgICB0aGlzLmpvYkFybiA9IHRoaXMuYnVpbGRKb2JBcm4odGhpcywgcmVzb3VyY2VOYW1lKTtcbiAgICB0aGlzLmpvYk5hbWUgPSByZXNvdXJjZU5hbWU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,78 @@
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
+ import { Code } from '../code';
6
+ /**
7
+ * Properties for creating a Scala Spark ETL job
8
+ */
9
+ export interface ScalaSparkEtlJobProps extends JobProperties {
10
+ /**
11
+ * Enables the Spark UI debugging and monitoring with the specified props.
12
+ *
13
+ * @default - Spark UI debugging and monitoring is disabled.
14
+ *
15
+ * @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
16
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
17
+ */
18
+ readonly sparkUI?: SparkUIProps;
19
+ /**
20
+ * Class name (required for Scala scripts)
21
+ * Package and class name for the entry point of Glue job execution for
22
+ * Java scripts
23
+ **/
24
+ readonly className: string;
25
+ /**
26
+ * Extra Jars S3 URL (optional)
27
+ * S3 URL where additional jar dependencies are located
28
+ * @default - no extra jar files
29
+ */
30
+ readonly extraJars?: Code[];
31
+ /**
32
+ * Specifies whether job run queuing is enabled for the job runs for this job.
33
+ * A value of true means job run queuing is enabled for the job runs.
34
+ * If false or not populated, the job runs will not be considered for queueing.
35
+ * If this field does not match the value set in the job run, then the value from
36
+ * the job run field will be used. This property must be set to false for flex jobs.
37
+ * If this property is enabled, maxRetries must be set to zero.
38
+ *
39
+ * @default - no job run queuing
40
+ */
41
+ readonly jobRunQueuingEnabled?: boolean;
42
+ }
43
+ /**
44
+ * Spark ETL Jobs class
45
+ *
46
+ * ETL jobs support pySpark and Scala languages, for which there are separate
47
+ * but similar constructors. ETL jobs default to the G2 worker type, but you
48
+ * can override this default with other supported worker type values
49
+ * (G1, G2, G4 and G8). ETL jobs defaults to Glue version 4.0, which you can
50
+ * override to 3.0. The following ETL features are enabled by default:
51
+ * —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
52
+ * You can find more details about version, worker type and other features
53
+ * in Glue's public documentation.
54
+ */
55
+ export declare class ScalaSparkEtlJob extends Job {
56
+ readonly jobArn: string;
57
+ readonly jobName: string;
58
+ readonly role: iam.IRole;
59
+ readonly grantPrincipal: iam.IPrincipal;
60
+ /**
61
+ * The Spark UI logs location if Spark UI monitoring and debugging is enabled.
62
+ *
63
+ * @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
64
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
65
+ */
66
+ readonly sparkUILoggingLocation?: SparkUILoggingLocation;
67
+ /**
68
+ * ScalaSparkEtlJob constructor
69
+ */
70
+ constructor(scope: Construct, id: string, props: ScalaSparkEtlJobProps);
71
+ /**
72
+ * Set the executable arguments with best practices enabled by default
73
+ *
74
+ * @returns An array of arguments for Glue to use on execution
75
+ */
76
+ private executableArguments;
77
+ private setupSparkUI;
78
+ }
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ScalaSparkEtlJob = 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
+ /**
14
+ * Spark ETL Jobs class
15
+ *
16
+ * ETL jobs support pySpark and Scala languages, for which there are separate
17
+ * but similar constructors. ETL jobs default to the G2 worker type, but you
18
+ * can override this default with other supported worker type values
19
+ * (G1, G2, G4 and G8). ETL jobs defaults to Glue version 4.0, which you can
20
+ * override to 3.0. The following ETL features are enabled by default:
21
+ * —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
22
+ * You can find more details about version, worker type and other features
23
+ * in Glue's public documentation.
24
+ */
25
+ class ScalaSparkEtlJob extends job_1.Job {
26
+ /**
27
+ * ScalaSparkEtlJob constructor
28
+ */
29
+ constructor(scope, id, props) {
30
+ super(scope, id, {
31
+ physicalName: props.jobName,
32
+ });
33
+ try {
34
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ScalaSparkEtlJobProps(props);
35
+ }
36
+ catch (error) {
37
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
38
+ Error.captureStackTrace(error, ScalaSparkEtlJob);
39
+ }
40
+ throw error;
41
+ }
42
+ // Set up role and permissions for principal
43
+ this.role = props.role, {
44
+ assumedBy: new iam.ServicePrincipal('glue.amazonaws.com'),
45
+ managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSGlueServiceRole')],
46
+ };
47
+ this.grantPrincipal = this.role;
48
+ // Enable SparkUI by default as a best practice
49
+ const sparkUIArgs = props.sparkUI?.bucket ? this.setupSparkUI(this.role, props.sparkUI) : undefined;
50
+ this.sparkUILoggingLocation = sparkUIArgs?.location;
51
+ // Enable CloudWatch metrics and continuous logging by default as a best practice
52
+ const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
53
+ const profilingMetricsArgs = { '--enable-metrics': '' };
54
+ const observabilityMetricsArgs = { '--enable-observability-metrics': 'true' };
55
+ // Gather executable arguments
56
+ const execuatbleArgs = this.executableArguments(props);
57
+ // Mandatory className argument
58
+ if (props.className === undefined) {
59
+ throw new Error('className must be set for Scala ETL Jobs');
60
+ }
61
+ // Conbine command line arguments into a single line item
62
+ const defaultArguments = {
63
+ ...execuatbleArgs,
64
+ ...continuousLoggingArgs,
65
+ ...profilingMetricsArgs,
66
+ ...observabilityMetricsArgs,
67
+ ...sparkUIArgs?.args,
68
+ ...this.checkNoReservedArgs(props.defaultArguments),
69
+ };
70
+ if ((!props.workerType && props.numberOfWorkers !== undefined) || (props.workerType && props.numberOfWorkers === undefined)) {
71
+ throw new Error('Both workerType and numberOfWorkers must be set');
72
+ }
73
+ const jobResource = new aws_glue_1.CfnJob(this, 'Resource', {
74
+ name: props.jobName,
75
+ description: props.description,
76
+ role: this.role.roleArn,
77
+ command: {
78
+ name: constants_1.JobType.ETL,
79
+ scriptLocation: this.codeS3ObjectUrl(props.script),
80
+ },
81
+ glueVersion: props.glueVersion ? props.glueVersion : constants_1.GlueVersion.V4_0,
82
+ workerType: props.workerType ? props.workerType : constants_1.WorkerType.G_1X,
83
+ numberOfWorkers: props.numberOfWorkers ? props.numberOfWorkers : 10,
84
+ maxRetries: props.jobRunQueuingEnabled ? 0 : props.maxRetries,
85
+ jobRunQueuingEnabled: props.jobRunQueuingEnabled ? props.jobRunQueuingEnabled : false,
86
+ executionProperty: props.maxConcurrentRuns ? { maxConcurrentRuns: props.maxConcurrentRuns } : undefined,
87
+ timeout: props.timeout?.toMinutes(),
88
+ connections: props.connections ? { connections: props.connections.map((connection) => connection.connectionName) } : undefined,
89
+ securityConfiguration: props.securityConfiguration?.securityConfigurationName,
90
+ tags: props.tags,
91
+ defaultArguments,
92
+ });
93
+ const resourceName = this.getResourceNameAttribute(jobResource.ref);
94
+ this.jobArn = this.buildJobArn(this, resourceName);
95
+ this.jobName = resourceName;
96
+ }
97
+ /**
98
+ * Set the executable arguments with best practices enabled by default
99
+ *
100
+ * @returns An array of arguments for Glue to use on execution
101
+ */
102
+ executableArguments(props) {
103
+ const args = {};
104
+ args['--job-language'] = constants_1.JobLanguage.SCALA;
105
+ args['--class'] = props.className;
106
+ if (props.extraJars && props.extraJars?.length > 0) {
107
+ args['--extra-jars'] = props.extraJars.map(code => this.codeS3ObjectUrl(code)).join(',');
108
+ }
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.ScalaSparkEtlJob = ScalaSparkEtlJob;
129
+ _a = JSII_RTTI_SYMBOL_1;
130
+ ScalaSparkEtlJob[_a] = { fqn: "@aws-cdk/aws-glue-alpha.ScalaSparkEtlJob", version: "2.177.0-alpha.0" };
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGEtc3BhcmstZXRsLWpvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNjYWxhLXNwYXJrLWV0bC1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkNBQTJDO0FBQzNDLCtDQUE4RDtBQUM5RCxtREFBOEM7QUFDOUMsK0JBQTJDO0FBRTNDLDRDQUE2RTtBQUM3RSxxREFBMkg7QUE0QzNIOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxTQUFHO0lBY3ZDOztPQUVHO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTztTQUM1QixDQUFDLENBQUM7Ozs7OzsrQ0FwQk0sZ0JBQWdCOzs7O1FBc0J6Qiw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ3RCLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQztZQUN6RCxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDakcsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUVoQywrQ0FBK0M7UUFDL0MsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNwRyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsV0FBVyxFQUFFLFFBQVEsQ0FBQztRQUVwRCxpRkFBaUY7UUFDakYsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMs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QUFDO1FBQ3ZJLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUEsMkNBQTBCLEVBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0UsTUFBTSxJQUFJLEdBQUc7WUFDWCxtQkFBbUIsRUFBRSxNQUFNO1lBQzNCLHlCQUF5QixFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsb0NBQW9DO1NBQ2pJLENBQUM7UUFFRixPQUFPO1lBQ0wsUUFBUSxFQUFFO2dCQUNSLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtnQkFDM0IsTUFBTTthQUNQO1lBQ0QsSUFBSTtTQUNMLENBQUM7S0FDSDs7QUF4SEgsNENBeUhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQnVja2V0LCBCdWNrZXRFbmNyeXB0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENmbkpvYiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1nbHVlJztcbmltcG9ydCB7IEpvYiwgSm9iUHJvcGVydGllcyB9IGZyb20gJy4vam9iJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSm9iVHlwZSwgR2x1ZVZlcnNpb24sIEpvYkxhbmd1YWdlLCBXb3JrZXJUeXBlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFNwYXJrVUlQcm9wcywgU3BhcmtVSUxvZ2dpbmdMb2NhdGlvbiwgdmFsaWRhdGVTcGFya1VpUHJlZml4LCBjbGVhblNwYXJrVWlQcmVmaXhGb3JHcmFudCB9IGZyb20gJy4vc3BhcmstdWktdXRpbHMnO1xuaW1wb3J0IHsgQ29kZSB9IGZyb20gJy4uL2NvZGUnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgU2NhbGEgU3BhcmsgRVRMIGpvYlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjYWxhU3BhcmtFdGxKb2JQcm9wcyBleHRlbmRzIEpvYlByb3BlcnRpZXMge1xuICAvKipcbiAgICogRW5hYmxlcyB0aGUgU3BhcmsgVUkgZGVidWdnaW5nIGFuZCBtb25pdG9yaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTcGFyayBVSSBkZWJ1Z2dpbmcgYW5kIG1vbml0b3JpbmcgaXMgZGlzYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL21vbml0b3Itc3BhcmstdWktam9icy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBzcGFya1VJPzogU3BhcmtVSVByb3BzO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBuYW1lIChyZXF1aXJlZCBmb3IgU2NhbGEgc2NyaXB0cylcbiAgICogUGFja2FnZSBhbmQgY2xhc3MgbmFtZSBmb3IgdGhlIGVudHJ5IHBvaW50IG9mIEdsdWUgam9iIGV4ZWN1dGlvbiBmb3JcbiAgICogSmF2YSBzY3JpcHRzXG4gICoqL1xuICByZWFkb25seSBjbGFzc05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogRXh0cmEgSmFycyBTMyBVUkwgKG9wdGlvbmFsKVxuICAgKiBTMyBVUkwgd2hlcmUgYWRkaXRpb25hbCBqYXIgZGVwZW5kZW5jaWVzIGFyZSBsb2NhdGVkXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgamFyIGZpbGVzXG4gICAqL1xuICByZWFkb25seSBleHRyYUphcnM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGpvYiBydW4gcXVldWluZyBpcyBlbmFibGVkIGZvciB0aGUgam9iIHJ1bnMgZm9yIHRoaXMgam9iLlxuICAgKiBBIHZhbHVlIG9mIHRydWUgbWVhbnMgam9iIHJ1biBxdWV1aW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBqb2IgcnVucy5cbiAgICogSWYgZmFsc2Ugb3Igbm90IHBvcHVsYXRlZCwgdGhlIGpvYiBydW5zIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgZm9yIHF1ZXVlaW5nLlxuICAgKiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBzZXQgaW4gdGhlIGpvYiBydW4sIHRoZW4gdGhlIHZhbHVlIGZyb21cbiAgICogdGhlIGpvYiBydW4gZmllbGQgd2lsbCBiZSB1c2VkLiBUaGlzIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGZhbHNlIGZvciBmbGV4IGpvYnMuXG4gICAqIElmIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCwgbWF4UmV0cmllcyBtdXN0IGJlIHNldCB0byB6ZXJvLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGpvYiBydW4gcXVldWluZ1xuICAgKi9cbiAgcmVhZG9ubHkgam9iUnVuUXVldWluZ0VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNwYXJrIEVUTCBKb2JzIGNsYXNzXG4gKlxuICogRVRMIGpvYnMgc3VwcG9ydCBweVNwYXJrIGFuZCBTY2FsYSBsYW5ndWFnZXMsIGZvciB3aGljaCB0aGVyZSBhcmUgc2VwYXJhdGVcbiAqIGJ1dCBzaW1pbGFyIGNvbnN0cnVjdG9ycy4gRVRMIGpvYnMgZGVmYXVsdCB0byB0aGUgRzIgd29ya2VyIHR5cGUsIGJ1dCB5b3VcbiAqIGNhbiBvdmVycmlkZSB0aGlzIGRlZmF1bHQgd2l0aCBvdGhlciBzdXBwb3J0ZWQgd29ya2VyIHR5cGUgdmFsdWVzXG4gKiAoRzEsIEcyLCBHNCBhbmQgRzgpLiBFVEwgam9icyBkZWZhdWx0cyB0byBHbHVlIHZlcnNpb24gNC4wLCB3aGljaCB5b3UgY2FuXG4gKiBvdmVycmlkZSB0byAzLjAuIFRoZSBmb2xsb3dpbmcgRVRMIGZlYXR1cmVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQ6XG4gKiDigJRlbmFibGUtbWV0cmljcywg4oCUZW5hYmxlLXNwYXJrLXVpLCDigJRlbmFibGUtY29udGludW91cy1jbG91ZHdhdGNoLWxvZy5cbiAqIFlvdSBjYW4gZmluZCBtb3JlIGRldGFpbHMgYWJvdXQgdmVyc2lvbiwgd29ya2VyIHR5cGUgYW5kIG90aGVyIGZlYXR1cmVzXG4gKiBpbiBHbHVlJ3MgcHVibGljIGRvY3VtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2FsYVNwYXJrRXRsSm9iIGV4dGVuZHMgSm9iIHtcbiAgcHVibGljIHJlYWRvbmx5IGpvYkFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgam9iTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcm9sZTogaWFtLklSb2xlO1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBUaGUgU3BhcmsgVUkgbG9ncyBsb2NhdGlvbiBpZiBTcGFyayBVSSBtb25pdG9yaW5nIGFuZCBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvbW9uaXRvci1zcGFyay11aS1qb2JzLmh0bWxcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzcGFya1VJTG9nZ2luZ0xvY2F0aW9uPzogU3BhcmtVSUxvZ2dpbmdMb2NhdGlvbjtcblxuICAvKipcbiAgICogU2NhbGFTcGFya0V0bEpvYiBjb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNjYWxhU3BhcmtFdGxKb2JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5qb2JOYW1lLFxuICAgIH0pO1xuXG4gICAgLy8gU2V0IHVwIHJvbGUgYW5kIHBlcm1pc3Npb25zIGZvciBwcmluY2lwYWxcbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZ2x1ZS5hbWF6b25hd3MuY29tJyksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NHbHVlU2VydmljZVJvbGUnKV0sXG4gICAgfTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gRW5hYmxlIFNwYXJrVUkgYnkgZGVmYXVsdCBhcyBhIGJlc3QgcHJhY3RpY2VcbiAgICBjb25zdCBzcGFya1VJQXJncyA9IHByb3BzLnNwYXJrVUk/LmJ1Y2tldCA/IHRoaXMuc2V0dXBTcGFya1VJKHRoaXMucm9sZSwgcHJvcHMuc3BhcmtVSSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zcGFya1VJTG9nZ2luZ0xvY2F0aW9uID0gc3BhcmtVSUFyZ3M/LmxvY2F0aW9uO1xuXG4gICAgLy8gRW5hYmxlIENsb3VkV2F0Y2ggbWV0cmljcyBhbmQgY29udGludW91cyBsb2dnaW5nIGJ5IGRlZmF1bHQgYXMgYSBiZXN0IHByYWN0aWNlXG4gICAgY29uc3QgY29udGludW91c0xvZ2dpbmdBcmdzID0gdGhpcy5zZXR1cENvbnRpbnVvdXNMb2dnaW5nKHRoaXMucm9sZSwgcHJvcHMuY29udGludW91c0xvZ2dpbmcpO1xuICAgIGNvbnN0IHByb2ZpbGluZ01ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtbWV0cmljcyc6ICcnIH07XG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eU1ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtb2JzZXJ2YWJpbGl0eS1tZXRyaWNzJzogJ3RydWUnIH07XG5cbiAgICAvLyBHYXRoZXIgZXhlY3V0YWJsZSBhcmd1bWVudHNcbiAgICBjb25zdCBleGVjdWF0YmxlQXJncyA9IHRoaXMuZXhlY3V0YWJsZUFyZ3VtZW50cyhwcm9wcyk7XG5cbiAgICAvLyBNYW5kYXRvcnkgY2xhc3NOYW1lIGFyZ3VtZW50XG4gICAgaWYgKHByb3BzLmNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsYXNzTmFtZSBtdXN0IGJlIHNldCBmb3IgU2NhbGEgRVRMIEpvYnMnKTtcbiAgICB9XG5cbiAgICAvLyBDb25iaW5lIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBsaW5lIGl0ZW1cbiAgICBjb25zdCBkZWZhdWx0QXJndW1lbnRzID0ge1xuICAgICAgLi4uZXhlY3VhdGJsZUFyZ3MsXG4gICAgICAuLi5jb250aW51b3VzTG9nZ2luZ0FyZ3MsXG4gICAgICAuLi5wcm9maWxpbmdNZXRyaWNzQXJncyxcbiAgICAgIC4uLm9ic2VydmFiaWxpdHlNZXRyaWNzQXJncyxcbiAgICAgIC4uLnNwYXJrVUlBcmdzPy5hcmdzLFxuICAgICAgLi4udGhpcy5jaGVja05vUmVzZXJ2ZWRBcmdzKHByb3BzLmRlZmF1bHRBcmd1bWVudHMpLFxuICAgIH07XG5cbiAgICBpZiAoKCFwcm9wcy53b3JrZXJUeXBlICYmIHByb3BzLm51bWJlck9mV29ya2VycyAhPT0gdW5kZWZpbmVkKSB8fCAocHJvcHMud29ya2VyVHlwZSAmJiBwcm9wcy5udW1iZXJPZldvcmtlcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQm90aCB3b3JrZXJUeXBlIGFuZCBudW1iZXJPZldvcmtlcnMgbXVzdCBiZSBzZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JSZXNvdXJjZSA9IG5ldyBDZm5Kb2IodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogcHJvcHMuam9iTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJvbGU6IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgY29tbWFuZDoge1xuICAgICAgICBuYW1lOiBKb2JUeXBlLkVUTCxcbiAgICAgICAgc2NyaXB0TG9jYXRpb246IHRoaXMuY29kZVMzT2JqZWN0VXJsKHByb3BzLnNjcmlwdCksXG4gICAgICB9LFxuICAgICAgZ2x1ZVZlcnNpb246IHByb3BzLmdsdWVWZXJzaW9uID8gcHJvcHMuZ2x1ZVZlcnNpb24gOiBHbHVlVmVyc2lvbi5WNF8wLFxuICAgICAgd29ya2VyVHlwZTogcHJvcHMud29ya2VyVHlwZSA/IHByb3BzLndvcmtlclR5cGUgOiBXb3JrZXJUeXBlLkdfMVgsXG4gICAgICBudW1iZXJPZldvcmtlcnM6IHByb3BzLm51bWJlck9mV29ya2VycyA/IHByb3BzLm51bWJlck9mV29ya2VycyA6IDEwLFxuICAgICAgbWF4UmV0cmllczogcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgPyAwIDogcHJvcHMubWF4UmV0cmllcyxcbiAgICAgIGpvYlJ1blF1ZXVpbmdFbmFibGVkOiBwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA/IHByb3BzLmpvYlJ1blF1ZXVpbmdFbmFibGVkIDogZmFsc2UsXG4gICAgICBleGVjdXRpb25Qcm9wZXJ0eTogcHJvcHMubWF4Q29uY3VycmVudFJ1bnMgPyB7IG1heENvbmN1cnJlbnRSdW5zOiBwcm9wcy5tYXhDb25jdXJyZW50UnVucyB9IDogdW5kZWZpbmVkLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dD8udG9NaW51dGVzKCksXG4gICAgICBjb25uZWN0aW9uczogcHJvcHMuY29ubmVjdGlvbnMgPyB7IGNvbm5lY3Rpb25zOiBwcm9wcy5jb25uZWN0aW9ucy5tYXAoKGNvbm5lY3Rpb24pID0+IGNvbm5lY3Rpb24uY29ubmVjdGlvbk5hbWUpIH0gOiB1bmRlZmluZWQsXG4gICAgICBzZWN1cml0eUNvbmZpZ3VyYXRpb246IHByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbj8uc2VjdXJpdHlDb25maWd1cmF0aW9uTmFtZSxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MsXG4gICAgICBkZWZhdWx0QXJndW1lbnRzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gdGhpcy5nZXRSZXNvdXJjZU5hbWVBdHRyaWJ1dGUoam9iUmVzb3VyY2UucmVmKTtcbiAgICB0aGlzLmpvYkFybiA9IHRoaXMuYnVpbGRKb2JBcm4odGhpcywgcmVzb3VyY2VOYW1lKTtcbiAgICB0aGlzLmpvYk5hbWUgPSByZXNvdXJjZU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBleGVjdXRhYmxlIGFyZ3VtZW50cyB3aXRoIGJlc3QgcHJhY3RpY2VzIGVuYWJsZWQgYnkgZGVmYXVsdFxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhcmd1bWVudHMgZm9yIEdsdWUgdG8gdXNlIG9uIGV4ZWN1dGlvblxuICAgKi9cbiAgcHJpdmF0ZSBleGVjdXRhYmxlQXJndW1lbnRzKHByb3BzOiBTY2FsYVNwYXJrRXRsSm9iUHJvcHMpIHtcbiAgICBjb25zdCBhcmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgYXJnc1snLS1qb2ItbGFuZ3VhZ2UnXSA9IEpvYkxhbmd1YWdlLlNDQUxBO1xuICAgIGFyZ3NbJy0tY2xhc3MnXSA9IHByb3BzLmNsYXNzTmFtZSE7XG5cbiAgICBpZiAocHJvcHMuZXh0cmFKYXJzICYmIHByb3BzLmV4dHJhSmFycz8ubGVuZ3RoID4gMCkge1xuICAgICAgYXJnc1snLS1leHRyYS1qYXJzJ10gPSBwcm9wcy5leHRyYUphcnMubWFwKGNvZGUgPT4gdGhpcy5jb2RlUzNPYmplY3RVcmwoY29kZSkpLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTcGFya1VJKHJvbGU6IGlhbS5JUm9sZSwgc3BhcmtVaVByb3BzOiBTcGFya1VJUHJvcHMpIHtcblxuICAgIHZhbGlkYXRlU3BhcmtVaVByZWZpeChzcGFya1VpUHJvcHMucHJlZml4KTtcbiAgICBjb25zdCBidWNrZXQgPSBzcGFya1VpUHJvcHMuYnVja2V0ID8/IG5ldyBCdWNrZXQodGhpcywgJ1NwYXJrVUlCdWNrZXQnLCB7IGVuZm9yY2VTU0w6IHRydWUsIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCB9KTtcbiAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUocm9sZSwgY2xlYW5TcGFya1VpUHJlZml4Rm9yR3JhbnQoc3BhcmtVaVByb3BzLnByZWZpeCkpO1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAnLS1lbmFibGUtc3BhcmstdWknOiAndHJ1ZScsXG4gICAgICAnLS1zcGFyay1ldmVudC1sb2dzLXBhdGgnOiBidWNrZXQuczNVcmxGb3JPYmplY3Qoc3BhcmtVaVByb3BzLnByZWZpeCkucmVwbGFjZSgvXFwvPyQvLCAnLycpLCAvLyBwYXRoIHdpbGwgYWx3YXlzIGVuZCB3aXRoIGEgc2xhc2hcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgIHByZWZpeDogc3BhcmtVaVByb3BzLnByZWZpeCxcbiAgICAgICAgYnVja2V0LFxuICAgICAgfSxcbiAgICAgIGFyZ3MsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,109 @@
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
+ import * as cdk from 'aws-cdk-lib/core';
6
+ import { Code } from '../code';
7
+ /**
8
+ * Flex Jobs class
9
+ *
10
+ * Flex jobs supports Python and Scala language.
11
+ * The flexible execution class is appropriate for non-urgent jobs such as
12
+ * pre-production jobs, testing, and one-time data loads.
13
+ * Flexible job runs are supported for jobs using AWS Glue version 3.0 or later and G.1X or
14
+ * G.2X worker types but will default to the latest version of Glue (currently Glue 3.0.)
15
+ *
16
+ * Similar to ETL, we’ll enable these features: —enable-metrics, —enable-spark-ui,
17
+ * —enable-continuous-cloudwatch-log
18
+ *
19
+ */
20
+ export interface ScalaSparkFlexEtlJobProps extends JobProperties {
21
+ /**
22
+ * Enables the Spark UI debugging and monitoring with the specified props.
23
+ *
24
+ * @default - Spark UI debugging and monitoring is disabled.
25
+ *
26
+ * @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
27
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
28
+ */
29
+ readonly sparkUI?: SparkUIProps;
30
+ /**
31
+ * Specifies configuration properties of a notification (optional).
32
+ * After a job run starts, the number of minutes to wait before sending a job run delay notification.
33
+ * @default - undefined
34
+ */
35
+ readonly notifyDelayAfter?: cdk.Duration;
36
+ /**
37
+ * The fully qualified Scala class name that serves as the entry point for the job.
38
+ *
39
+ * @see `--class` in https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
40
+ */
41
+ readonly className: string;
42
+ /**
43
+ * Additional Java .jar files that AWS Glue adds to the Java classpath before executing your script.
44
+ * Only individual files are supported, directories are not supported.
45
+ *
46
+ * @default [] - no extra jars are added to the classpath
47
+ *
48
+ * @see `--extra-jars` in https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
49
+ */
50
+ readonly extraJars?: Code[];
51
+ /**
52
+ * Setting this value to true prioritizes the customer's extra JAR files in the classpath.
53
+ *
54
+ * @default false - priority is not given to user-provided jars
55
+ *
56
+ * @see `--user-jars-first` in https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
57
+ */
58
+ readonly extraJarsFirst?: boolean;
59
+ /**
60
+ * Additional files, such as configuration files that AWS Glue copies to the working directory of your script before executing it.
61
+ * Only individual files are supported, directories are not supported.
62
+ *
63
+ * @default [] - no extra files are copied to the working directory
64
+ *
65
+ * @see `--extra-files` in https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
66
+ */
67
+ readonly extraFiles?: Code[];
68
+ }
69
+ /**
70
+ * Spark ETL Jobs class
71
+ *
72
+ * ETL jobs support pySpark and Scala languages, for which there are separate
73
+ * but similar constructors. ETL jobs default to the G2 worker type, but you
74
+ * can override this default with other supported worker type values
75
+ * (G1, G2, G4 and G8). ETL jobs defaults to Glue version 4.0, which you can
76
+ * override to 3.0. The following ETL features are enabled by default:
77
+ * —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
78
+ * You can find more details about version, worker type and other features
79
+ * in Glue's public documentation.
80
+ */
81
+ export declare class ScalaSparkFlexEtlJob extends Job {
82
+ readonly jobArn: string;
83
+ readonly jobName: string;
84
+ readonly role: iam.IRole;
85
+ readonly grantPrincipal: iam.IPrincipal;
86
+ /**
87
+ * The Spark UI logs location if Spark UI monitoring and debugging is enabled.
88
+ *
89
+ * @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
90
+ * @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
91
+ */
92
+ readonly sparkUILoggingLocation?: SparkUILoggingLocation;
93
+ /**
94
+ * ScalaSparkFlexEtlJob constructor
95
+ */
96
+ constructor(scope: Construct, id: string, props: ScalaSparkFlexEtlJobProps);
97
+ /**
98
+ * Set the executable arguments with best practices enabled by default
99
+ *
100
+ * @returns An array of arguments for Glue to use on execution
101
+ */
102
+ private executableArguments;
103
+ /**
104
+ * Set the arguments for sparkUI with best practices enabled by default
105
+ *
106
+ * @returns An array of arguments for enabling sparkUI
107
+ */
108
+ private setupSparkUI;
109
+ }