in lib/constructs/data-set-enrollment.ts [343:495]
constructor(scope: Construct, id: string, props: DataLakeEnrollmentWorkflowProps) {
super(scope, id);
this.Workflow = new glue.CfnWorkflow(this, "etlWorkflow", {
name: props.workfowName
});
this.sourceCrawler = props.srcCrawler;
if(props.WorkflowCronScheduleExpression == null){
this.StartTrigger = new glue.CfnTrigger(this,"startTrigger",{
actions: [
{
crawlerName: props.srcCrawler.name
}
],
type: "ON_DEMAND",
name: `startWorkflow-${this.Workflow.name}`,
workflowName: this.Workflow.name
});
}else{
this.StartTrigger = new glue.CfnTrigger(this,"startTrigger",{
actions: [
{
crawlerName: this.sourceCrawler.name
}
],
type: "SCHEDULED",
schedule: props.WorkflowCronScheduleExpression,
name: `startWorkflow-${this.Workflow.name}`,
workflowName: this.Workflow.name
});
}
this.SrcCrawlerCompleteTrigger = new glue.CfnTrigger(this,"srcCrawlerCompleteTrigger",{
predicate: {
conditions: [
{
crawlerName: props.srcCrawler.name,
crawlState: "SUCCEEDED",
logicalOperator: "EQUALS"
}
],
logical: "ANY"
},
name: `sourceDataCrawled-${this.Workflow.name}`,
actions: [
{
jobName: props.etlJob.name
}
],
workflowName: this.Workflow.name,
type: "CONDITIONAL",
startOnCreation: true
});
this.ETLCompleteTrigger = new glue.CfnTrigger(this,"etlCompleteTrigger",{
predicate: {
conditions: [
{
state: "SUCCEEDED",
logicalOperator: "EQUALS",
jobName: props.etlJob.name
}
],
logical: "ANY"
},
name: `EtlComplete-${this.Workflow.name}`,
actions: [
{
crawlerName: props.datalakeCrawler.name
}
],
workflowName: this.Workflow.name,
type: "CONDITIONAL"
});
this.StartTrigger.node.addDependency(this.Workflow);
this.SrcCrawlerCompleteTrigger.node.addDependency(this.Workflow);
this.ETLCompleteTrigger.node.addDependency(this.Workflow);
const activateTriggerRole = new iam.Role(this, 'activateTriggerRole', {
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com')
});
activateTriggerRole.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'));
activateTriggerRole.addToPolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: ['*'],
actions: ['glue:StartTrigger']
}));
const activateTriggerFunction = new lambda.SingletonFunction(this, 'activateTriggerSingleton', {
role: activateTriggerRole,
uuid: "ActivateGlueTriggerFunction",
code: new lambda.InlineCode(fs.readFileSync('./scripts/lambda.activategluetigger.py', { encoding: 'utf-8' })),
handler: 'index.main',
timeout: Duration.seconds(300),
runtime: lambda.Runtime.PYTHON_3_7,
memorySize: 1024
});
if(props.WorkflowCronScheduleExpression != null){
const CronTrigger_triggerActivationProvider = new cr.Provider(this, 'CronTrigger_triggerActivationProvider', {
onEventHandler: activateTriggerFunction,
});
const CronTrigger_triggerActivation = new CustomResource(this, 'CronTrigger-triggerActivation', {
serviceToken: CronTrigger_triggerActivationProvider.serviceToken,
properties: {
triggerId: this.StartTrigger.name
}
});
}
const srcCrawlerCompleteTrigger_triggerActivationProvider = new cr.Provider(this, 'srcCrawlerCompleteTrigger_triggerActivationProvider', {
onEventHandler: activateTriggerFunction,
});
const srcCrawlerCompleteTrigger_triggerActivation = new CustomResource(this, 'srcCrawlerCompleteTrigger_triggerActivation', {
serviceToken: srcCrawlerCompleteTrigger_triggerActivationProvider.serviceToken,
properties: {
triggerId: this.SrcCrawlerCompleteTrigger.name
}
});
const etlTrigger_triggerActivationProvider = new cr.Provider(this, 'etlTrigger_triggerActivationProvider', {
onEventHandler: activateTriggerFunction,
});
const etlTrigger_triggerActivation = new CustomResource(this, 'etlTrigger-triggerActivation', {
serviceToken: etlTrigger_triggerActivationProvider.serviceToken,
properties: {
triggerId: this.ETLCompleteTrigger.name
}
});
}