AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Gracefully drain k8s nodes when instances are terminated (uksb-1pf6fjp67) Parameters: AutoScalingGroup: Type: String EksCluster: Type: String Globals: Function: Timeout: 300 Resources: LifecycleHook: Type: AWS::AutoScaling::LifecycleHook Properties: AutoScalingGroupName: !Ref AutoScalingGroup HeartbeatTimeout: 450 LifecycleTransition: autoscaling:EC2_INSTANCE_TERMINATING DrainerRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Path: / Policies: - PolicyName: DrainerPolicies PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - autoscaling:CompleteLifecycleAction - ec2:DescribeInstances - eks:DescribeCluster - sts:GetCallerIdentity Resource: '*' ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole DrainerFunction: Type: AWS::Serverless::Function Properties: CodeUri: drainer/ Handler: handler.lambda_handler Runtime: python3.7 MemorySize: 256 Environment: Variables: CLUSTER_NAME: !Ref EksCluster Role: !GetAtt DrainerRole.Arn Events: TerminationEvent: Type: CloudWatchEvent Properties: Pattern: source: - aws.autoscaling detail-type: - EC2 Instance-terminate Lifecycle Action detail: AutoScalingGroupName: - !Ref AutoScalingGroup Permission: Type: AWS::Lambda::Permission Properties: Action: lambda:InvokeFunction FunctionName: !GetAtt DrainerFunction.Arn Principal: events.amazonaws.com Outputs: DrainerRole: Description: Draining function role ARN Value: !GetAtt DrainerRole.Arn