Class: Aws::Rails::Middleware::ElasticBeanstalkSQSD

Inherits:
Object
  • Object
show all
Defined in:
lib/aws/rails/middleware/elastic_beanstalk_sqsd.rb

Overview

Middleware to handle requests from the SQS Daemon present on Elastic Beanstalk worker environments.

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ ElasticBeanstalkSQSD

Returns a new instance of ElasticBeanstalkSQSD.



8
9
10
11
12
13
14
15
# File 'lib/aws/rails/middleware/elastic_beanstalk_sqsd.rb', line 8

def initialize(app)
  @app = app
  @logger = ::Rails.logger

  return unless ENV['AWS_PROCESS_BEANSTALK_WORKER_JOBS_ASYNC']

  @executor = init_executor
end

Instance Method Details

#call(env) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/aws/rails/middleware/elastic_beanstalk_sqsd.rb', line 17

def call(env)
  request = ::ActionDispatch::Request.new(env)

  # Pass through unless user agent is the SQS Daemon
  return @app.call(env) unless from_sqs_daemon?(request)

  @logger.debug('aws-sdk-rails middleware detected call from Elastic Beanstalk SQS Daemon.')

  # Only accept requests from this user agent if it is from localhost or a docker host in case of forgery.
  unless request.local? || sent_from_docker_host?(request)
    @logger.warn('SQSD request detected from untrusted address; returning 403 forbidden.')
    return forbidden_response
  end

  # Execute job or periodic task based on HTTP request context
  execute(request)
end

#shutdown(timeout = nil) ⇒ Object



35
36
37
38
39
40
41
42
# File 'lib/aws/rails/middleware/elastic_beanstalk_sqsd.rb', line 35

def shutdown(timeout = nil)
  return unless @executor

  @logger.info("Shutting down SQS EBS background job executor. Timeout: #{timeout}")
  @executor.shutdown
  clean_shutdown = @executor.wait_for_termination(timeout)
  @logger.info("SQS EBS background executor shutdown complete. Clean: #{clean_shutdown}")
end