aws-ddk-core
Version:
The AWS DataOps Development Kit is an open source development framework for customers that build data workflows and modern data architecture on AWS.
129 lines • 17.6 kB
JavaScript
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EMRServerlessCluster = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const ec2 = require("aws-cdk-lib/aws-ec2");
const emr = require("aws-cdk-lib/aws-emrserverless");
const iam = require("aws-cdk-lib/aws-iam");
const constructs_1 = require("constructs");
const s3_factory_1 = require("./s3-factory");
const utils_1 = require("./utils");
class EMRServerlessCluster extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
const name = props.name ?? "DDKEmrServerlessCluster";
if (props.vpcId) {
this.vpc = ec2.Vpc.fromLookup(scope, "VPC", { vpcId: props.vpcId });
}
else if (props.vpcCidr) {
this.vpc = this.createVpc(scope, name, props.vpcCidr);
}
else {
throw new Error("One of 'vpcId' or 'vpcCidr' must be provided");
}
if (this.vpc) {
this.securityGroup =
props.securityGroup ??
new ec2.SecurityGroup(scope, "EMR Serverless Security Group", {
securityGroupName: `EMR Serverless Security Group`,
description: "Security group with a self-referencing inbound rule.",
vpc: this.vpc,
});
this.securityGroup.addIngressRule(this.securityGroup, ec2.Port.allTraffic(), "Self referencing rule");
}
if (props.s3Bucket) {
this.s3Bucket = props.s3Bucket;
}
else {
this.s3Bucket = s3_factory_1.S3Factory.bucket(this, "EMR Serverless Cluster Bucket", {
versioned: true,
});
}
this.role = new iam.Role(scope, "EMR Serverless Cluster Role", {
assumedBy: new iam.ServicePrincipal("emr-serverless.amazonaws.com"),
path: "/service-role/",
});
this.role.addManagedPolicy(new iam.ManagedPolicy(this, "MWAA Execution Policy", {
statements: [
new iam.PolicyStatement({
actions: ["s3:GetObject*", "s3:ListBucket"],
resources: ["arn:aws:s3:::*.elasticmapreduce", "arn:aws:s3:::*.elasticmapreduce/*"],
}),
new iam.PolicyStatement({
actions: ["s3:DeleteObject", "s3:PutObject", "s3:GetObject*", "s3:GetBucket*", "s3:List*"],
resources: [this.s3Bucket.bucketArn, `${this.s3Bucket.bucketArn}/*`],
}),
new iam.PolicyStatement({
actions: [
"glue:GetDatabase",
"glue:CreateDatabase",
"glue:GetDataBases",
"glue:CreateTable",
"glue:GetTable",
"glue:UpdateTable",
"glue:DeleteTable",
"glue:GetTables",
"glue:GetPartition",
"glue:GetPartitions",
"glue:CreatePartition",
"glue:BatchCreatePartition",
"glue:GetUserDefinedFunctions",
],
resources: ["*"],
}),
],
}));
if (props.additionalPolicyStatements) {
props.additionalPolicyStatements.forEach((statement) => {
this.role.addToPolicy(statement);
});
}
if (!props.networkConfiguration && this.vpc && this.securityGroup) {
this.networkConfiguration = {
securityGroupIds: [this.securityGroup.securityGroupId],
subnetIds: this.vpc.selectSubnets({ subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }).subnetIds,
};
}
else {
this.networkConfiguration = {};
}
const defaultProps = {
networkConfiguration: this.networkConfiguration,
};
const mergedProps = utils_1.overrideProps(defaultProps, props);
this.emrServerlessApplication = new emr.CfnApplication(this, "DDK EMR Serverless Application", {
...mergedProps,
});
}
createVpc(scope, resourceName, vpcCidr) {
const vpcCIDRMask = +vpcCidr.split("/")[1];
if (vpcCIDRMask > 20 || vpcCIDRMask < 16) {
throw new Error("Vpc Cidr Range must of size >=16 and <=20");
}
const subnetCIDRMask = vpcCIDRMask + 4;
const vpc = new ec2.Vpc(scope, "Vpc", {
ipAddresses: ec2.IpAddresses.cidr(vpcCidr),
enableDnsSupport: true,
enableDnsHostnames: true,
vpcName: resourceName,
subnetConfiguration: [
{
name: "Public",
subnetType: ec2.SubnetType.PUBLIC,
cidrMask: subnetCIDRMask,
},
{
name: "Private",
subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
cidrMask: subnetCIDRMask,
},
],
});
return vpc;
}
}
exports.EMRServerlessCluster = EMRServerlessCluster;
_a = JSII_RTTI_SYMBOL_1;
EMRServerlessCluster[_a] = { fqn: "aws-ddk-core.EMRServerlessCluster", version: "1.4.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1yLXNlcnZlcmxlc3MtY2x1c3Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL2Vtci1zZXJ2ZXJsZXNzLWNsdXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwyQ0FBMkM7QUFDM0MscURBQXFEO0FBQ3JELDJDQUEyQztBQUUzQywyQ0FBdUM7QUFFdkMsNkNBQXlDO0FBQ3pDLG1DQUF3QztBQXlCeEMsTUFBYSxvQkFBcUIsU0FBUSxzQkFBUztJQVFqRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSx5QkFBeUIsQ0FBQztRQUVyRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDckU7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3ZEO2FBQU07WUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7U0FDakU7UUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsYUFBYTtnQkFDaEIsS0FBSyxDQUFDLGFBQWE7b0JBQ25CLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsK0JBQStCLEVBQUU7d0JBQzVELGlCQUFpQixFQUFFLCtCQUErQjt3QkFDbEQsV0FBVyxFQUFFLHNEQUFzRDt3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RyxDQUFDO0lBQ2IsQ0FBQzs7QUEvSEgsb0RBZ0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgKiBhcyBlbXIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbXJzZXJ2ZXJsZXNzXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB7IFMzRmFjdG9yeSB9IGZyb20gXCIuL3MzLWZhY3RvcnlcIjtcbmltcG9ydCB7IG92ZXJyaWRlUHJvcHMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVNUlNlcnZlcmxlc3NDbHVzdGVyUHJvcHMgZXh0ZW5kcyBlbXIuQ2ZuQXBwbGljYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBFeGlzdGluZyB2cGMgaWRcbiAgICovXG4gIHJlYWRvbmx5IHZwY0lkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIElQIHJhbmdlIChDSURSIG5vdGF0aW9uKSBmb3IgdGhpcyBWUENcbiAgICovXG4gIHJlYWRvbmx5IHZwY0NpZHI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTMyBCdWNrZXRcbiAgICovXG4gIHJlYWRvbmx5IHMzQnVja2V0PzogczMuSUJ1Y2tldDtcbiAgLyoqXG4gICAqIFNlY3VyaXR5IEdyb3VwXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwPzogZWMyLlNlY3VyaXR5R3JvdXA7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHBvbGljeSBzdGF0ZW1lbnRzIHRvIGFkZCB0byB0aGUgZW1yIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxQb2xpY3lTdGF0ZW1lbnRzPzogaWFtLlBvbGljeVN0YXRlbWVudFtdO1xufVxuXG5leHBvcnQgY2xhc3MgRU1SU2VydmVybGVzc0NsdXN0ZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICByZWFkb25seSB2cGM/OiBlYzIuSVZwYztcbiAgcmVhZG9ubHkgczNCdWNrZXQ6IHMzLklCdWNrZXQ7XG4gIHJlYWRvbmx5IHJvbGU6IGlhbS5Sb2xlO1xuICByZWFkb25seSBlbXJTZXJ2ZXJsZXNzQXBwbGljYXRpb246IGVtci5DZm5BcHBsaWNhdGlvbjtcbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cD86IGVjMi5TZWN1cml0eUdyb3VwO1xuICByZWFkb25seSBuZXR3b3JrQ29uZmlndXJhdGlvbjogZW1yLkNmbkFwcGxpY2F0aW9uLk5ldHdvcmtDb25maWd1cmF0aW9uUHJvcGVydHk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVNUlNlcnZlcmxlc3NDbHVzdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgbmFtZSA9IHByb3BzLm5hbWUgPz8gXCJEREtFbXJTZXJ2ZXJsZXNzQ2x1c3RlclwiO1xuXG4gICAgaWYgKHByb3BzLnZwY0lkKSB7XG4gICAgICB0aGlzLnZwYyA9IGVjMi5WcGMuZnJvbUxvb2t1cChzY29wZSwgXCJWUENcIiwgeyB2cGNJZDogcHJvcHMudnBjSWQgfSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy52cGNDaWRyKSB7XG4gICAgICB0aGlzLnZwYyA9IHRoaXMuY3JlYXRlVnBjKHNjb3BlLCBuYW1lLCBwcm9wcy52cGNDaWRyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT25lIG9mICd2cGNJZCcgb3IgJ3ZwY0NpZHInIG11c3QgYmUgcHJvdmlkZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudnBjKSB7XG4gICAgICB0aGlzLnNlY3VyaXR5R3JvdXAgPVxuICAgICAgICBwcm9wcy5zZWN1cml0eUdyb3VwID8/XG4gICAgICAgIG5ldyBlYzIuU2VjdXJpdHlHcm91cChzY29wZSwgXCJFTVIgU2VydmVybGVzcyBTZWN1cml0eSBHcm91cFwiLCB7XG4gICAgICAgICAgc2VjdXJpdHlHcm91cE5hbWU6IGBFTVIgU2VydmVybGVzcyBTZWN1cml0eSBHcm91cGAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiU2VjdXJpdHkgZ3JvdXAgd2l0aCBhIHNlbGYtcmVmZXJlbmNpbmcgaW5ib3VuZCBydWxlLlwiLFxuICAgICAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5zZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKHRoaXMuc2VjdXJpdHlHcm91cCwgZWMyLlBvcnQuYWxsVHJhZmZpYygpLCBcIlNlbGYgcmVmZXJlbmNpbmcgcnVsZVwiKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnMzQnVja2V0KSB7XG4gICAgICB0aGlzLnMzQnVja2V0ID0gcHJvcHMuczNCdWNrZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuczNCdWNrZXQgPSBTM0ZhY3RvcnkuYnVja2V0KHRoaXMsIFwiRU1SIFNlcnZlcmxlc3MgQ2x1c3RlciBCdWNrZXRcIiwge1xuICAgICAgICB2ZXJzaW9uZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnJvbGUgPSBuZXcgaWFtLlJvbGUoc2NvcGUsIFwiRU1SIFNlcnZlcmxlc3MgQ2x1c3RlciBSb2xlXCIsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwiZW1yLXNlcnZlcmxlc3MuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIHBhdGg6IFwiL3NlcnZpY2Utcm9sZS9cIixcbiAgICB9KTtcbiAgICB0aGlzLnJvbGUuYWRkTWFuYWdlZFBvbGljeShcbiAgICAgIG5ldyBpYW0uTWFuYWdlZFBvbGljeSh0aGlzLCBcIk1XQUEgRXhlY3V0aW9uIFBvbGljeVwiLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJzMzpHZXRPYmplY3QqXCIsIFwiczM6TGlzdEJ1Y2tldFwiXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW1wiYXJuOmF3czpzMzo6OiouZWxhc3RpY21hcHJlZHVjZVwiLCBcImFybjphd3M6czM6OjoqLmVsYXN0aWNtYXByZWR1Y2UvKlwiXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJzMzpEZWxldGVPYmplY3RcIiwgXCJzMzpQdXRPYmplY3RcIiwgXCJzMzpHZXRPYmplY3QqXCIsIFwiczM6R2V0QnVja2V0KlwiLCBcInMzOkxpc3QqXCJdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy5zM0J1Y2tldC5idWNrZXRBcm4sIGAke3RoaXMuczNCdWNrZXQuYnVja2V0QXJufS8qYF0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICBcImdsdWU6R2V0RGF0YWJhc2VcIixcbiAgICAgICAgICAgICAgXCJnbHVlOkNyZWF0ZURhdGFiYXNlXCIsXG4gICAgICAgICAgICAgIFwiZ2x1ZTpHZXREYXRhQmFzZXNcIixcbiAgICAgICAgICAgICAgXCJnbHVlOkNyZWF0ZVRhYmxlXCIsXG4gICAgICAgICAgICAgIFwiZ2x1ZTpHZXRUYWJsZVwiLFxuICAgICAgICAgICAgICBcImdsdWU6VXBkYXRlVGFibGVcIixcbiAgICAgICAgICAgICAgXCJnbHVlOkRlbGV0ZVRhYmxlXCIsXG4gICAgICAgICAgICAgIFwiZ2x1ZTpHZXRUYWJsZXNcIixcbiAgICAgICAgICAgICAgXCJnbHVlOkdldFBhcnRpdGlvblwiLFxuICAgICAgICAgICAgICBcImdsdWU6R2V0UGFydGl0aW9uc1wiLFxuICAgICAgICAgICAgICBcImdsdWU6Q3JlYXRlUGFydGl0aW9uXCIsXG4gICAgICAgICAgICAgIFwiZ2x1ZTpCYXRjaENyZWF0ZVBhcnRpdGlvblwiLFxuICAgICAgICAgICAgICBcImdsdWU6R2V0VXNlckRlZmluZWRGdW5jdGlvbnNcIixcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgaWYgKHByb3BzLmFkZGl0aW9uYWxQb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICBwcm9wcy5hZGRpdGlvbmFsUG9saWN5U3RhdGVtZW50cy5mb3JFYWNoKChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgdGhpcy5yb2xlLmFkZFRvUG9saWN5KHN0YXRlbWVudCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3BzLm5ldHdvcmtDb25maWd1cmF0aW9uICYmIHRoaXMudnBjICYmIHRoaXMuc2VjdXJpdHlHcm91cCkge1xuICAgICAgdGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgc2VjdXJpdHlHcm91cElkczogW3RoaXMuc2VjdXJpdHlHcm91cC5zZWN1cml0eUdyb3VwSWRdLFxuICAgICAgICBzdWJuZXRJZHM6IHRoaXMudnBjLnNlbGVjdFN1Ym5ldHMoeyBzdWJuZXRUeXBlOiBlYzIuU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTIH0pLnN1Ym5ldElkcyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0UHJvcHM6IFBhcnRpYWw8ZW1yLkNmbkFwcGxpY2F0aW9uUHJvcHM+ID0ge1xuICAgICAgbmV0d29ya0NvbmZpZ3VyYXRpb246IHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IG1lcmdlZFByb3BzID0gb3ZlcnJpZGVQcm9wcyhkZWZhdWx0UHJvcHMsIHByb3BzKTtcblxuICAgIHRoaXMuZW1yU2VydmVybGVzc0FwcGxpY2F0aW9uID0gbmV3IGVtci5DZm5BcHBsaWNhdGlvbih0aGlzLCBcIkRESyBFTVIgU2VydmVybGVzcyBBcHBsaWNhdGlvblwiLCB7XG4gICAgICAuLi5tZXJnZWRQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBjcmVhdGVWcGMoc2NvcGU6IENvbnN0cnVjdCwgcmVzb3VyY2VOYW1lOiBzdHJpbmcsIHZwY0NpZHI6IHN0cmluZyk6IGVjMi5JVnBjIHtcbiAgICBjb25zdCB2cGNDSURSTWFzayA9ICt2cGNDaWRyLnNwbGl0KFwiL1wiKVsxXTtcbiAgICBpZiAodnBjQ0lEUk1hc2sgPiAyMCB8fCB2cGNDSURSTWFzayA8IDE2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWcGMgQ2lkciBSYW5nZSBtdXN0IG9mIHNpemUgPj0xNiBhbmQgPD0yMFwiKTtcbiAgICB9XG4gICAgY29uc3Qgc3VibmV0Q0lEUk1hc2sgPSB2cGNDSURSTWFzayArIDQ7XG4gICAgY29uc3QgdnBjID0gbmV3IGVjMi5WcGMoc2NvcGUsIFwiVnBjXCIsIHtcbiAgICAgIGlwQWRkcmVzc2VzOiBlYzIuSXBBZGRyZXNzZXMuY2lkcih2cGNDaWRyKSxcbiAgICAgIGVuYWJsZURuc1N1cHBvcnQ6IHRydWUsXG4gICAgICBlbmFibGVEbnNIb3N0bmFtZXM6IHRydWUsXG4gICAgICB2cGNOYW1lOiByZXNvdXJjZU5hbWUsXG4gICAgICBzdWJuZXRDb25maWd1cmF0aW9uOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIlB1YmxpY1wiLFxuICAgICAgICAgIHN1Ym5ldFR5cGU6IGVjMi5TdWJuZXRUeXBlLlBVQkxJQyxcbiAgICAgICAgICBjaWRyTWFzazogc3VibmV0Q0lEUk1hc2ssXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIlByaXZhdGVcIixcbiAgICAgICAgICBzdWJuZXRUeXBlOiBlYzIuU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTLFxuICAgICAgICAgIGNpZHJNYXNrOiBzdWJuZXRDSURSTWFzayxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdnBjO1xuICB9XG59XG4iXX0=
;