UNPKG

aws-cdk-lib

Version:

Version 2 of the AWS Cloud Development Kit library

2 lines (1 loc) 2.5 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.InstanceDrainHook=void 0;var fs=()=>{var tmp=require("fs");return fs=()=>tmp,tmp},path=()=>{var tmp=require("path");return path=()=>tmp,tmp},constructs_1=()=>{var tmp=require("constructs");return constructs_1=()=>tmp,tmp},autoscaling=()=>{var tmp=require("../../../aws-autoscaling");return autoscaling=()=>tmp,tmp},hooks=()=>{var tmp=require("../../../aws-autoscaling-hooktargets");return hooks=()=>tmp,tmp},iam=()=>{var tmp=require("../../../aws-iam");return iam=()=>tmp,tmp},lambda=()=>{var tmp=require("../../../aws-lambda");return lambda=()=>tmp,tmp},cdk=()=>{var tmp=require("../../../core");return cdk=()=>tmp,tmp};class InstanceDrainHook extends constructs_1().Construct{constructor(scope,id,props){super(scope,id);const drainTime=props.drainTime||cdk().Duration.minutes(5),fn=new(lambda()).Function(this,"Function",{code:lambda().Code.fromInline(fs().readFileSync(path().join(__dirname,"..","..","..","custom-resource-handlers","dist","aws-ecs","lambda-source","index.py"),{encoding:"utf-8"})),handler:"index.lambda_handler",runtime:lambda().Runtime.PYTHON_3_9,timeout:cdk().Duration.seconds(Math.min(drainTime.toSeconds()+10,900)),environment:{CLUSTER:props.cluster.clusterName}});props.autoScalingGroup.addLifecycleHook("DrainHook",{lifecycleTransition:autoscaling().LifecycleTransition.INSTANCE_TERMINATING,defaultResult:autoscaling().DefaultResult.CONTINUE,notificationTarget:new(hooks()).FunctionHook(fn,props.topicEncryptionKey),heartbeatTimeout:drainTime}),fn.addToRolePolicy(new(iam()).PolicyStatement({actions:["ec2:DescribeInstances","ec2:DescribeInstanceAttribute","ec2:DescribeInstanceStatus","ec2:DescribeHosts"],resources:["*"]})),fn.addToRolePolicy(new(iam()).PolicyStatement({actions:["autoscaling:CompleteLifecycleAction"],resources:[props.autoScalingGroup.autoScalingGroupArn]})),fn.addToRolePolicy(new(iam()).PolicyStatement({actions:["ecs:DescribeContainerInstances","ecs:DescribeTasks"],resources:["*"],conditions:{ArnEquals:{"ecs:cluster":props.cluster.clusterArn}}})),fn.addToRolePolicy(new(iam()).PolicyStatement({actions:["ecs:ListContainerInstances","ecs:SubmitContainerStateChange","ecs:SubmitTaskStateChange"],resources:[props.cluster.clusterArn]})),fn.addToRolePolicy(new(iam()).PolicyStatement({actions:["ecs:UpdateContainerInstancesState","ecs:ListTasks"],conditions:{ArnEquals:{"ecs:cluster":props.cluster.clusterArn}},resources:["*"]}))}}exports.InstanceDrainHook=InstanceDrainHook;