Class: DPL::Provider::Lambda

Inherits:
DPL::Provider show all
Defined in:
lib/dpl/provider/lambda.rb

Instance Attribute Summary

Attributes inherited from DPL::Provider

#context, #options

Instance Method Summary collapse

Methods inherited from DPL::Provider

apt_get, #check_app, #commit_msg, context, #create_key, #default_text_charset, #default_text_charset?, #deploy, #detect_encoding?, #encoding_for, #error, experimental, #initialize, #log, new, npm_g, #option, pip, requires, #run, #setup_git_credentials, #setup_git_ssh, #sha, shell, #user_agent, #warn

Constructor Details

This class inherits a constructor from DPL::Provider

Instance Method Details

#check_authObject



102
103
104
# File 'lib/dpl/provider/lambda.rb', line 102

def check_auth
  log "Using Access Key: #{option(:access_key_id)[-4..-1].rjust(20, '*')}"
end

#cleanupObject



138
139
# File 'lib/dpl/provider/lambda.rb', line 138

def cleanup
end

#create_zip(dest_file_path, src_directory_path, files) ⇒ Object



88
89
90
91
92
93
94
95
96
# File 'lib/dpl/provider/lambda.rb', line 88

def create_zip(dest_file_path, src_directory_path, files)
  Zip::File.open(dest_file_path, Zip::File::CREATE) do |zipfile|
    files.each do |file|
      zipfile.add(file.sub(src_directory_path + File::SEPARATOR, ''), file)
    end
  end

  dest_file_path
end

#deafult_memory_sizeObject



126
127
128
# File 'lib/dpl/provider/lambda.rb', line 126

def deafult_memory_size
  128
end

#default_descriptionObject



122
123
124
# File 'lib/dpl/provider/lambda.rb', line 122

def default_description
  "Deploy build #{context.env['TRAVIS_BUILD_NUMBER']} to AWS Lambda via Travis CI"
end

#default_modeObject



114
115
116
# File 'lib/dpl/provider/lambda.rb', line 114

def default_mode
  'event'
end

#default_module_nameObject



130
131
132
# File 'lib/dpl/provider/lambda.rb', line 130

def default_module_name
  'index'
end

#default_runtimeObject



110
111
112
# File 'lib/dpl/provider/lambda.rb', line 110

def default_runtime
  'nodejs'
end

#default_timeoutObject



118
119
120
# File 'lib/dpl/provider/lambda.rb', line 118

def default_timeout
  3 # seconds
end

#function_zipObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/dpl/provider/lambda.rb', line 54

def function_zip
  target_zip_path = File.absolute_path(options[:zip] || Dir.pwd)
  dest_file_path = output_file_path

  if File.directory?(target_zip_path)
    zip_directory(dest_file_path, target_zip_path)
  elsif File.file?(target_zip_path)
    zip_file(dest_file_path, target_zip_path)
  else
    error('Invalid zip option. If set, must be path to directory, js file, or a zip file.')
  end

  File.new(dest_file_path)
end

#handlerObject



47
48
49
50
51
52
# File 'lib/dpl/provider/lambda.rb', line 47

def handler
  module_name = options[:module_name] || default_module_name
  handler_name = option(:handler_name)

  "#{module_name}.#{handler_name}"
end

#lambdaObject



11
12
13
# File 'lib/dpl/provider/lambda.rb', line 11

def lambda
  @lambda ||= ::Aws::LambdaPreview::Client.new(lambda_options)
end

#lambda_optionsObject



15
16
17
18
19
20
# File 'lib/dpl/provider/lambda.rb', line 15

def lambda_options
  {
    region:      options[:region] || 'us-east-1',
    credentials: ::Aws::Credentials.new(option(:access_key_id), option(:secret_access_key))
  }
end

#needs_key?Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/dpl/provider/lambda.rb', line 98

def needs_key?
  false
end

#output_file_pathObject



106
107
108
# File 'lib/dpl/provider/lambda.rb', line 106

def output_file_path
  @output_file_path ||= '/tmp/' + random_chars(8) + '-lambda.zip'
end

#push_appObject



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/dpl/provider/lambda.rb', line 22

def push_app
  # Options defined at
  #   https://docs.aws.amazon.com/sdkforruby/api/Aws/LambdaPreview/Client.html
  #   https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html
  response = lambda.upload_function({
    function_name:  options[:name]           || option(:function_name),
    description:    options[:description]    || default_description,
    timeout:        options[:timeout]        || default_timeout,
    memory_size:    options[:memory_size]    || deafult_memory_size,
    role:           option(:role),
    handler:        handler,
    function_zip:   function_zip,
    runtime:        options[:runtime]        || default_runtime,
    mode:           default_mode,
  })

  log "Uploaded lambda: #{response.function_name}."
rescue ::Aws::LambdaPreview::Errors::ServiceException => exception
  error(exception.message)
rescue ::Aws::LambdaPreview::Errors::InvalidParameterValueException => exception
  error(exception.message)
rescue ::Aws::LambdaPreview::Errors::ResourceNotFoundException => exception
  error(exception.message)
end

#random_chars(count = 8) ⇒ Object



134
135
136
# File 'lib/dpl/provider/lambda.rb', line 134

def random_chars(count=8)
  (36**(count-1) + rand(36**count - 36**(count-1))).to_s(36)
end

#uncleanupObject



141
142
# File 'lib/dpl/provider/lambda.rb', line 141

def uncleanup
end

#zip_directory(dest_file_path, target_directory_path) ⇒ Object



83
84
85
86
# File 'lib/dpl/provider/lambda.rb', line 83

def zip_directory(dest_file_path, target_directory_path)
  files = Dir[File.join(target_directory_path, '**', '**')]
  create_zip(dest_file_path, target_directory_path, files)
end

#zip_file(dest_file_path, target_file_path) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/dpl/provider/lambda.rb', line 69

def zip_file(dest_file_path, target_file_path)
  if File.extname(target_file_path) == '.zip'
    # Just copy it to the destination right away, since it is already a zip.
    FileUtils.cp(target_file_path, dest_file_path)
    dest_file_path
  else
    # Zip up the file.
    src_directory_path = File.dirname(target_file_path)
    files = [ target_file_path ]

    create_zip(dest_file_path, src_directory_path, files)
  end
end