lamma 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eae69d45b69cd3cd83146b3c06817af2480127cf
4
- data.tar.gz: a64f797d1929b28996a2930432d351fdd8c20704
3
+ metadata.gz: 48c666ef5bf2f86912462d63b6e29c20165c1bfd
4
+ data.tar.gz: bb28bc07806ce282888ceb94431b56d513fc42f1
5
5
  SHA512:
6
- metadata.gz: b9765159e9611f81d1f17ec70264745e167e93d95e3bcbd20b3e6dc3ecb026bf09351c37d1191202d2305a6e87752642bd5828885d16bdf3dce0b30970786e03
7
- data.tar.gz: ec416c51df347fda456cf1128c5e8976ecd4bf71a5ede669a48e853fbfeb61eca8b8b19eea37d515f4ae4a3b69dd0ac65ff083c60aedd8a16b3791a375348acc
6
+ metadata.gz: 3a53c581460c7981e90c9258f169b0180b7fd3d7b254b4448f7acbf939ce844ffebc45662c010e699c0641cabb11252fb1d0a205b299957335f5d1565d3acdbe
7
+ data.tar.gz: 8642d8f477ca8ac025c7b52be42504395a3f6a49bbbc1030c60f9e624f161eec960b9028ab24ecdd99387f7c96b04c6dc3d61e39ab0dbfa36c117d873e711fff
@@ -0,0 +1,21 @@
1
+ ---
2
+ engines:
3
+ duplication:
4
+ enabled: true
5
+ config:
6
+ languages:
7
+ - ruby
8
+ fixme:
9
+ enabled: true
10
+ rubocop:
11
+ enabled: true
12
+ ratings:
13
+ paths:
14
+ - "**.rb"
15
+ - "bin/*"
16
+ - "exe/*"
17
+ exclude_paths:
18
+ - lamma.gemspec
19
+ - "*.md"
20
+ - spec/**/*
21
+ - Rakefile
data/README.md CHANGED
@@ -35,42 +35,15 @@ export AWS_ACCESS_KEY_ID = [YOUR_AWS_ACCESS_KEY_ID]
35
35
  export AWS_SECRET_ACCESS_KEY = [YOUR_AWS_SECRET_ACCESS_KEY]
36
36
  ```
37
37
 
38
- ## Usage & Basic Workflow
39
-
40
- ### Create new Lambda Function
41
- ```
42
- lamma create my_function --runtime 'python2.7'
43
- ```
44
- ![create]()
45
-
46
- ### Deploy current code to Remote
47
-
48
- You have to be in a directory created by 'create' command with 'lamma.conf' file.
49
-
50
- Make some change on nodejs/python2.7 function and
51
-
52
- ```
53
- lamma deploy production(or development)
54
- ```
55
- ![create]()
56
- ![console]()
57
-
58
- ### Rollback last deploy
59
-
60
- ```
61
- lamma rollback production(or development)
62
- ```
63
- ![before]()
64
- ![after]()
65
-
66
- ### Recommended setting
67
- It is recommended to connect your lambda with an event source via PROD/DEV version aliases,
68
- so that you can keep the mapping before/after the deployment/rollback.
69
- ([see also](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html))
70
-
71
- End-to-end functionalities for
72
- - Managing event-source-mappings,
73
- - Creating IAM roles
74
-
75
- will be supported in future release.
76
-
38
+ # Todo
39
+ - [ ] Support Automatic IAM Role initialization
40
+ - [ ] Support dead letter queue configuration
41
+ - [ ] Support environment variables
42
+ - [ ] Support KMS encripted variable configuration
43
+ - [ ] Support VPC configuration
44
+ - [ ] Prepare init templates
45
+ - [x] python2.7
46
+ - [ ] node4.3
47
+ - [ ] node4.3 edge
48
+ - [ ] C#
49
+ - [ ] Java8
@@ -18,12 +18,15 @@ Gem::Specification.new do |spec|
18
18
  spec.bindir = "exe"
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
+ spec.metadata["yard.run"] = "yri" # use "yard" to build full HTML docs.
21
22
 
22
23
  spec.add_development_dependency "bundler", "~> 1.10"
23
24
  spec.add_development_dependency "rake", "~> 10.0"
24
25
  spec.add_development_dependency "rspec", "~> 3"
26
+ spec.add_development_dependency "yard", "~> 0.9"
25
27
 
26
28
  spec.add_dependency "aws-sdk", "~> 2"
27
29
  spec.add_dependency "thor", "~> 0.19"
28
30
  spec.add_dependency "rubyzip", "~> 1.2"
31
+ spec.add_dependency "inifile", "~> 3.0"
29
32
  end
@@ -28,7 +28,7 @@ module Lamma
28
28
  end
29
29
 
30
30
  def create_or_update
31
- if remote_exists?
31
+ if remote_exist?
32
32
  update
33
33
  else
34
34
  create
@@ -39,7 +39,7 @@ module Lamma
39
39
  @name.upcase
40
40
  end
41
41
 
42
- def remote_exists?
42
+ def remote_exist?
43
43
  begin
44
44
  lambda_client.get_alias({
45
45
  function_name: @function.name,
@@ -4,6 +4,7 @@ require 'thor'
4
4
  module Lamma
5
5
  class CLI < Thor
6
6
  class_option :verbose, aliases: '-v', type: :boolean
7
+ class_option :profile, aliases: '-p', type: :string
7
8
  map '--version' => :print_version
8
9
 
9
10
  desc 'list', 'List lambda functions in AWS'
@@ -44,6 +45,7 @@ module Lamma
44
45
 
45
46
  desc 'init FUNCTION_NAME', 'Initialize local function'
46
47
  method_option :runtime, aliases: '-r', type: :string, required: true
48
+ method_option :role_arn, aliases: %w(--role-arn -R), type: :string
47
49
  def init(function_name)
48
50
  require 'lamma/cli/init'
49
51
  Init.new(options, function_name, self).run
@@ -3,76 +3,70 @@ require 'yaml'
3
3
  require 'lamma'
4
4
  require 'lamma/function'
5
5
  require 'lamma/alias'
6
+ require 'lamma/shared_helpers'
6
7
 
7
8
  module Lamma
8
9
  class CLI::Deploy
10
+ include SharedHelpers
11
+
9
12
  attr_reader :options, :thor
10
13
 
11
14
  def initialize(options, thor)
12
15
  @options = options
13
16
  @thor = thor
14
- @conf_path = options['path'] || Lamma::DEFAULT_CONF_PATH
17
+ @conf_path = search_conf_path(options['path'] || Lamma::DEFAULT_CONF_PATH)
15
18
  end
16
19
 
17
20
  def run
18
- unless File.exists?(@conf_path)
21
+ unless File.exist?(@conf_path)
19
22
  abort("Config file #{@conf_path} is missing.")
20
23
  end
21
24
 
22
25
  f = Lamma::Function.new(@conf_path)
26
+ update_or_create_function(f)
23
27
 
24
- unless f.remote_exists?
25
- thor.say("Function #{function.name} doesn't seem to be exist on remote.", :yellow)
26
- y_or_n = thor.ask("Do you want me to create it? (y/n)", :yellow)
28
+ new_version = f.publish_version(options['message']).version
27
29
 
28
- if y_or_n =~ /^[yY]/
29
- f.create
30
- end
30
+ if options['alias']
31
+ update_or_create_alias(f, new_version)
31
32
  end
33
+ end
32
34
 
33
- f.update
34
- new_version = f.publish_version(options['message']).version
35
+ private
35
36
 
36
- if options['alias']
37
- a = Lamma::Alias.new(f, options['alias'], new_version)
37
+ def update_or_create_alias(f, new_version)
38
+ a = Lamma::Alias.new(f, options['alias'], new_version)
38
39
 
39
- if a.remote_exists? && a.remote_version
40
- last_version = a.remote_version
41
- a.update
42
- else
43
- last_version = new_version
40
+ if a.remote_exist? && a.remote_version
41
+ last_version = a.remote_version
42
+ a.update
43
+ else
44
+ last_version = new_version
44
45
 
45
- thor.say("Function alias #{a.name} doesn't seem to be exist on remote.", :yellow)
46
- y_or_n = thor.ask("Do you want me to create it? (y/n)", :yellow)
46
+ thor.say("Function alias #{a.name} doesn't seem to be exist on remote.", :yellow)
47
+ y_or_n = thor.ask("Do you want me to create it? (y/n)", :yellow)
47
48
 
48
- if y_or_n =~ /^[yY]/
49
- a.create
50
- else
51
- abort('Canceled')
52
- end
49
+ if y_or_n =~ /^[yY]/
50
+ a.create
51
+ else
52
+ abort('Canceled')
53
53
  end
54
-
55
- la = Lamma::Alias.new(f, "#{@options['alias']}_#{Lamma::LAST_DEPLOY_SUFFIX}", last_version)
56
- la.create_or_update
57
54
  end
55
+
56
+ la = Lamma::Alias.new(f, "#{@options['alias']}_#{Lamma::LAST_DEPLOY_SUFFIX}", last_version)
57
+ la.create_or_update
58
58
  end
59
59
 
60
- private
60
+ def update_or_create_function(f)
61
+ if f.remote_exist?
62
+ f.update
63
+ else
64
+ thor.say("Function #{f.name} doesn't seem to be exist on remote.", :yellow)
65
+ y_or_n = thor.ask("Do you want me to create it? (y/n)", :yellow)
61
66
 
62
- def create_function(function, config)
63
- begin
64
- function.create_function(config['runtime'], config['role'])
65
- rescue ArgumentError
66
- thor.say("ArgumentError occured. You might need to specify role arn \
67
- you want to pass to your function via 'lamma.conf' file or ENV['AWS_LAMBDA_IAM_ROLE'].", :red)
68
- return
69
- end
70
- thor.say("Done.", :blue)
71
- thor.say("Setting aliases.", :yellow)
72
- first_version = function.publish_version.version
73
- Lamma::Function::ENVIRONMENT_ALIAS_NAME_MAP.values.each do |alias_name|
74
- function.create_alias(alias_name, first_version)
75
- function.create_alias(alias_name << '_LAST', first_version)
67
+ if y_or_n =~ /^[yY]/
68
+ f.create
69
+ end
76
70
  end
77
71
  end
78
72
  end
@@ -1,16 +1,43 @@
1
+ require 'aws-sdk'
2
+ require 'uri'
3
+ require 'json'
1
4
  require 'pathname'
5
+
6
+ require 'lamma/logger'
2
7
  require 'lamma/runtime'
8
+ require 'lamma/shared_helpers'
3
9
 
4
10
  module Lamma
5
11
  class CLI::Init
6
12
  include Thor::Actions
7
- attr_reader :target, :thor, :options, :runtime
13
+ include Lamma::SharedHelpers
14
+
15
+ ROLE_ARN_PLACEHOLDER = 'YOUR_ROLE_ARN'
16
+
17
+ DEFAULT_LAMBDA_ASSUME_ROLE_POLICY =
18
+ {
19
+ 'Version': '2012-10-17',
20
+ 'Statement':
21
+ [
22
+ {
23
+ 'Effect': 'Allow',
24
+ 'Principal':
25
+ {
26
+ 'Service': 'lambda.amazonaws.com'
27
+ },
28
+ 'Action': 'sts:AssumeRole',
29
+ },
30
+ ],
31
+ }
32
+
33
+ attr_reader :target, :thor, :options, :runtime, :function_name
8
34
 
9
35
  def initialize(options, function_name, thor)
10
36
  @options = options
11
37
  @thor = thor
12
38
  runtime_str = options.fetch('runtime') { raise ArgumentError.new('runtime must be set.') }
13
39
  @runtime = Lamma::Runtime.new(runtime_str)
40
+ @function_name = function_name
14
41
  @target = Pathname.pwd.join(function_name)
15
42
  end
16
43
 
@@ -26,11 +53,27 @@ module Lamma
26
53
  [File.expand_path(path), File.join(target, tar_file)]
27
54
  end.to_h
28
55
 
29
- unless Dir.exists?(target)
56
+ unless Dir.exist?(target)
30
57
  FileUtils.makedirs(target)
31
58
  end
32
59
 
60
+ role_arn = options['role_arn']
61
+
62
+ unless role_arn
63
+ role_name = "#{function_name}-lamma-role"
64
+ thor.say("Looks like you didn't specified role arn for the function.", :yellow)
65
+ y_or_n = thor.ask("Do you want me to create default IAM role and configure it (#{role_name})? (y/n)", :yellow)
66
+
67
+ if y_or_n =~ /^[yY]/
68
+ role_arn = create_initial_role(role_name)
69
+ else
70
+ role_arn = 'YOUR_ROLE_ARN'
71
+ end
72
+ end
73
+
33
74
  templates.each do |src, dst|
75
+ thor.say_status(:create, dst)
76
+
34
77
  File.open(dst, "w") do |f|
35
78
  template = File.read(src)
36
79
  formatted = ERB.new(template).result(binding)
@@ -38,6 +81,8 @@ module Lamma
38
81
  end
39
82
  end
40
83
 
84
+
85
+ Lamma.logger.info "Initializing git repo in #{target}"
41
86
  Dir.chdir(target) do
42
87
  `git init`
43
88
  `git add .`
@@ -46,16 +91,48 @@ module Lamma
46
91
 
47
92
  private
48
93
 
49
- def default_region
50
- 'us-east-1'
94
+ def iam
95
+ Aws::IAM::Client.new
51
96
  end
52
97
 
53
- def default_account_id
54
- nil
55
- end
98
+ def create_initial_role(role_name)
99
+ begin
100
+ Lamma.logger.info("Creating role #{role_name}")
101
+ resp = iam.create_role({
102
+ assume_role_policy_document: DEFAULT_LAMBDA_ASSUME_ROLE_POLICY.to_json,
103
+ path: "/",
104
+ role_name: role_name
105
+ })
106
+ rescue Aws::IAM::Errors::EntityAlreadyExists
107
+ thor.say("Role #{role_name} seems to be created before", :yellow)
108
+ y_or_n = thor.ask("Do you want me to configure the role (#{role_name})? (y/n)", :yellow)
109
+
110
+ unless y_or_n =~ /^[yY]/
111
+ return ROLE_ARN_PLACEHOLDER
112
+ end
113
+ end
114
+
115
+ Lamma.logger.info("Checking attached role policies for #{role_name}")
116
+
117
+ g_resp = iam.get_role({
118
+ role_name: role_name
119
+ })
120
+ role_arn = g_resp.role.arn
121
+
122
+ unless iam.list_attached_role_policies({role_name: role_name }).attached_policies
123
+ .any?{|po| po.policy_name == 'AWSLambdaBasicExecutionRole'}
124
+ Lamma.logger.info('Could not find AWSLambdaBasicExecutionRole policy. Attatching.')
125
+
126
+ Lamma.logger.info("Attaching minimal policy (AWSLambdaBasicExecutionRole) to #{role_name}")
127
+ resp = iam.attach_role_policy({
128
+ policy_arn: 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole',
129
+ role_name: role_name
130
+ })
131
+
132
+ Lamma.logger.info("Done")
133
+ end
56
134
 
57
- def default_role_name
58
- nil
135
+ role_arn
59
136
  end
60
137
  end
61
138
  end
@@ -3,25 +3,28 @@ require 'yaml'
3
3
  require 'lamma'
4
4
  require 'lamma/function'
5
5
  require 'lamma/alias'
6
+ require 'lamma/shared_helpers'
6
7
 
7
8
  module Lamma
8
9
  class CLI::Rollback
10
+ include SharedHelpers
11
+
9
12
  attr_reader :options, :thor, :path
10
13
 
11
14
  def initialize(options, thor)
12
15
  @options = options
13
16
  @thor = thor
14
- @conf_path = options['path'] || Lamma::DEFAULT_CONF_PATH
17
+ @conf_path = search_conf_path(options['path'] || Lamma::DEFAULT_CONF_PATH)
15
18
  end
16
19
 
17
20
  def run
18
- unless File.exists?(@conf_path)
21
+ unless File.exist?(@conf_path)
19
22
  abort("Config file #{@conf_path} is missing.")
20
23
  end
21
24
 
22
25
  f = Lamma::Function.new(@conf_path)
23
26
 
24
- unless f.remote_exists?
27
+ unless f.remote_exist?
25
28
  abort("Remote function #{f.name} doesn't seem to be exists. You have to create or deploy it first")
26
29
  end
27
30
 
@@ -31,13 +34,13 @@ module Lamma
31
34
 
32
35
  a = Lamma::Alias.new(f, options['alias'])
33
36
 
34
- unless a.remote_exists?
37
+ unless a.remote_exist?
35
38
  abort("Alias #{a.name} doesn't exist. You have to deploy the function first.")
36
39
  end
37
40
 
38
41
  la = Lamma::Alias.new(f, "#{options['alias']}_#{Lamma::LAST_DEPLOY_SUFFIX}")
39
42
 
40
- unless la.remote_exists?
43
+ unless la.remote_exist?
41
44
  abort("Alias #{la.name} doesn't exist. You have to deploy the function first.")
42
45
  end
43
46
 
@@ -49,6 +52,8 @@ module Lamma
49
52
  end
50
53
 
51
54
  a.version = lv
55
+
56
+ Lamma.logger.info("Updating alias configuration")
52
57
  a.update
53
58
  end
54
59
 
@@ -10,7 +10,7 @@ module Lamma
10
10
  def run
11
11
  f = Lamma::Function.new(@function_name)
12
12
 
13
- unless f.remote_exists?
13
+ unless f.remote_exist?
14
14
  thor.say("Function #{f.name} doesn't exist in remote.")
15
15
  end
16
16
 
@@ -15,9 +15,9 @@ module Lamma
15
15
  end
16
16
 
17
17
  def zip_io
18
- return @zip_io if @zip_io
18
+ h = cached_build_hash
19
19
 
20
- if h = cached_build_hash
20
+ if h
21
21
  bp = File.join(build_path, h, BUILD_FILE_NAME)
22
22
  Lamma.logger.info "Using cached build: #{bp}"
23
23
  @zip_io = File.open(bp, 'rb')
@@ -26,37 +26,9 @@ module Lamma
26
26
  raise "Source path #{@source_path} doesn't exists"
27
27
  end
28
28
 
29
- # prebuild script
30
- if @prebuild
31
- Lamma.logger.info 'Running prebuild script...'
32
- raise unless system(@prebuild)
33
- elsif @function.runtime == Lamma::Runtime::PYTHON_27 \
34
- && File.exist?(File.join(@source_path, 'requirements.txt'))
35
- raise unless system("pip", "install", "-r", "requirements.txt", "-t", ".")
36
- # XXX: verbose?
37
- elsif [Lamma::Runtime::EDGE_NODE_43, Lamma::Runtime::NODE_43].include? @function.runtime \
38
- && File.exist?(File.join(@source_path, 'package.json'))
39
- raise unless system("npm", "install", "--production")
40
- end
29
+ prebuild
41
30
 
42
- io = Zip::OutputStream.write_buffer do |zio|
43
- active_paths.each do |path|
44
- next unless File.file?(path)
45
- File.open(path) do |source_io|
46
- zio.put_next_entry(path)
47
- data = source_io.read
48
- zio.write(data)
49
- end
50
- end
51
- end
52
-
53
- io.rewind
54
- if true # XXX: option save_builds?
55
- File.open(File.join(zipfile_path, BUILD_FILE_NAME), 'w').write(io.read)
56
- Lamma.logger.info("Saved the build: #{zipfile_path}")
57
- io.rewind
58
- end
59
- @zip_io = io
31
+ @zip_io = zip_and_save
60
32
  end
61
33
 
62
34
  @zip_io
@@ -70,6 +42,42 @@ module Lamma
70
42
 
71
43
  private
72
44
 
45
+ def zip_and_save
46
+ io = Zip::OutputStream.write_buffer do |zio|
47
+ active_paths.each do |path|
48
+ next unless File.file?(path)
49
+ File.open(path) do |source_io|
50
+ zio.put_next_entry(path)
51
+ data = source_io.read
52
+ zio.write(data)
53
+ end
54
+ end
55
+ end
56
+
57
+ io.rewind
58
+
59
+ if true # XXX: option save_builds?
60
+ File.open(File.join(zipfile_path, BUILD_FILE_NAME), 'w').write(io.read)
61
+ Lamma.logger.info("Saved the build: #{zipfile_path}")
62
+ io.rewind
63
+ end
64
+
65
+ io
66
+ end
67
+
68
+ def prebuild
69
+ if @prebuild
70
+ Lamma.logger.info 'Running prebuild script...'
71
+ raise unless system(@prebuild)
72
+ elsif @function.runtime == Lamma::Runtime::PYTHON_27 \
73
+ && File.exist?(File.join(@source_path, 'requirements.txt'))
74
+ raise unless system("pip", "install", "-r", "requirements.txt", "-t", ".")
75
+ elsif [Lamma::Runtime::EDGE_NODE_43, Lamma::Runtime::NODE_43].include?(@function.runtime) \
76
+ && File.exist?(File.join(@source_path, 'package.json'))
77
+ raise unless system("npm", "install", "--production")
78
+ end
79
+ end
80
+
73
81
  def cached_build_hash
74
82
  Dir.glob(File.join(build_path, "*/"))
75
83
  .map{|path| File.basename(path)}.each do |h|
@@ -0,0 +1,6 @@
1
+ require 'lamma'
2
+
3
+ module Lamma
4
+ class ValidationError < StandardError
5
+ end
6
+ end
@@ -1,3 +1,4 @@
1
+ require 'aws-sdk'
1
2
  require 'pathname'
2
3
  require 'yaml'
3
4
 
@@ -7,16 +8,24 @@ require 'lamma/code'
7
8
  require 'lamma/vpc_config'
8
9
  require 'lamma/dead_letter_config'
9
10
  require 'lamma/environment'
11
+ require 'lamma/error'
10
12
 
11
13
  module Lamma
12
14
  class Function
13
- attr_reader :name, :region
15
+ # @!attribute [r] name
16
+ # @return [String]
17
+ # @!attribute [r] region
18
+ # @return [String]
19
+ # @!attribute [r] conf
20
+ # @return [Hash]
21
+ # @!attribute [rw] publish
22
+ # @return [Bool]
23
+ attr_reader :name, :region, :conf
14
24
  attr_accessor :publish
15
25
 
26
+ # @param [String] yaml_path
16
27
  def initialize(yaml_path)
17
28
  path = Pathname.new(yaml_path)
18
- @id = path.basename.sub_ext('').to_s
19
- @root_path = path.parent
20
29
  yaml = YAML.load(path.open)
21
30
 
22
31
  @conf = yaml.fetch('function', {})
@@ -28,10 +37,11 @@ module Lamma
28
37
  @timeout = @conf.fetch('timeout', 3)
29
38
  @memory_size = @conf.fetch('memory_size', 128)
30
39
  # @dead_letter_config = dead_letter_config(@conf)
31
- @region = @conf.fetch('region') { raise ValidationError.new('region must be set.') }
40
+ @region = @conf.fetch('region') { raise Lamma::ValidationError.new('region must be set.') }
32
41
  @kms_key_arn = @conf.fetch('kms_key_arn', nil)
33
42
  end
34
43
 
44
+ # @return [Lamma::Code]
35
45
  def code
36
46
  @code ||= Code.new(self, @conf.fetch('code', {}))
37
47
  end
@@ -54,7 +64,7 @@ module Lamma
54
64
  kms_key_arn: @kms_key_arn
55
65
  })
56
66
 
57
- Lamma.logger.info(resp)
67
+ Lamma.logger.info("Created new function #{resp.function_arn}")
58
68
  end
59
69
 
60
70
  def update
@@ -87,7 +97,7 @@ module Lamma
87
97
  end
88
98
 
89
99
  def update_or_create
90
- if remote_exists?
100
+ if remote_exist?
91
101
  update
92
102
  else
93
103
  create
@@ -119,7 +129,7 @@ module Lamma
119
129
  resp
120
130
  end
121
131
 
122
- def remote_exists?
132
+ def remote_exist?
123
133
  begin
124
134
  lambda_client.get_function_configuration({
125
135
  function_name: @name,
@@ -129,14 +139,14 @@ module Lamma
129
139
  end
130
140
  end
131
141
 
132
- private
133
-
134
142
  def runtime
135
- runtime_str = @conf.fetch('runtime') { raise ValidationError.new('runtime must be set') }
143
+ runtime_str = @conf.fetch('runtime') { raise ArgumentError.new('runtime must be set') }
136
144
 
137
145
  @runtime ||= Lamma::Runtime.new(runtime_str)
138
146
  end
139
147
 
148
+ private
149
+
140
150
  def handler
141
151
  @conf.fetch('handler', default_handler)
142
152
  end
@@ -13,20 +13,21 @@ module Lamma
13
13
  PYTHON_27 = 40
14
14
 
15
15
  def initialize(str)
16
- @type = case str
17
- when /^c[s#](harp)?$/i
18
- ::Lamma::Runtime::C_SHARP
19
- when /^java([-_\.\s]*8?)?$/i
20
- ::Lamma::Runtime::JAVA_8
21
- when /^node([-_\.\s]*4(\.?3)?)?$/i
22
- ::Lamma::Runtime::NODE_43
23
- when /^edge[-_\.\s]*node(\s*4(\.?3)?)?$/i
24
- ::Lamma::Runtime::EDGE_NODE_43
25
- when /^python([-_\.\s]*2(\.?7)?)?$/i
26
- ::Lamma::Runtime::PYTHON_27
27
- else
28
- raise ArgumentError.new("invalid runtime. #{str}")
29
- end
16
+ @type =
17
+ case str
18
+ when /^c[s#](harp)?$/i
19
+ ::Lamma::Runtime::C_SHARP
20
+ when /^java([-_\.\s]*8?)?$/i
21
+ ::Lamma::Runtime::JAVA_8
22
+ when /^node([-_\.\s]*4(\.?3)?)?$/i
23
+ ::Lamma::Runtime::NODE_43
24
+ when /^edge[-_\.\s]*node(\s*4(\.?3)?)?$/i
25
+ ::Lamma::Runtime::EDGE_NODE_43
26
+ when /^python([-_\.\s]*2(\.?7)?)?$/i
27
+ ::Lamma::Runtime::PYTHON_27
28
+ else
29
+ raise ArgumentError.new("invalid runtime. #{str}")
30
+ end
30
31
  end
31
32
 
32
33
  NAME = {
@@ -0,0 +1,56 @@
1
+ require 'pathname'
2
+ require 'inifile'
3
+
4
+
5
+ module Lamma
6
+ module SharedHelpers
7
+ DEFAULT_PROFILE = 'default'
8
+
9
+ def ini_config(profile=DEFAULT_PROFILE)
10
+ load_inifile(File.expand_path(File.join('~', '.aws', 'config')), profile)
11
+ end
12
+
13
+ def ini_credentials(profile=DEFAULT_PROFILE)
14
+ load_inifile(File.expand_path(File.join('~', '.aws', 'credentials')), profile)
15
+ end
16
+
17
+ def region_or_raise(profile=DEFAULT_PROFILE)
18
+ region = ENV['AWS_REGION'] ||
19
+ ENV['AWS_DEFAULT_REGION'] ||
20
+ ini_config(profile)['region']
21
+
22
+ if region
23
+ return region
24
+ else
25
+ raise Exception.new("Region must be specified by either AWS_REGION, AWS_DEFAULT_REGION or ~/.aws/config file")
26
+ end
27
+ end
28
+
29
+ def search_conf_path(from)
30
+ bn = File.basename(File.expand_path(from))
31
+ dn = File.dirname(File.expand_path(from))
32
+ pn = Pathname(dn)
33
+
34
+ while pn != pn.parent
35
+ cp = File.join(pn, bn)
36
+ if File.exist?(cp)
37
+ return cp
38
+ end
39
+
40
+ pn = pn.parent
41
+ end
42
+
43
+ ''
44
+ end
45
+
46
+ private
47
+
48
+ def load_inifile(path, profile)
49
+ if File.exist?(path)
50
+ return IniFile.load(path)[profile]
51
+ else
52
+ {}
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,7 +1,8 @@
1
- funciton:
2
- name: hello
3
- role_arn: arn:aws:iam::<%= default_account_id || 'YOUR_ACCOUNT_ID'%>:role/<%= default_role_name || 'YOUR_ROLE_NAME'%>
1
+ function:
2
+ name: <%= function_name %>
3
+ role_arn: <%= role_arn %>
4
4
  description: Hello, world.
5
5
  timeout: 3
6
6
  memory_size: 128
7
- region: <%= default_region || 'us-east-1' %>
7
+ runtime: python2.7
8
+ region: <%= region_or_raise %>
@@ -1,3 +1,3 @@
1
1
  module Lamma
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lamma
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuichiro Someya
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-06 00:00:00.000000000 Z
11
+ date: 2017-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: aws-sdk
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: '1.2'
111
+ - !ruby/object:Gem::Dependency
112
+ name: inifile
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.0'
97
125
  description: Deploy toolset for Amazon Lambda functions..
98
126
  email:
99
127
  - ayemos.y@gmail.com
@@ -102,6 +130,7 @@ executables:
102
130
  extensions: []
103
131
  extra_rdoc_files: []
104
132
  files:
133
+ - ".codeclimate.yml"
105
134
  - ".gitignore"
106
135
  - ".rspec"
107
136
  - ".rubocop.yml"
@@ -127,10 +156,11 @@ files:
127
156
  - lib/lamma/code.rb
128
157
  - lib/lamma/dead_letter_config.rb
129
158
  - lib/lamma/environment.rb
130
- - lib/lamma/event_source_mapping.rb
159
+ - lib/lamma/error.rb
131
160
  - lib/lamma/function.rb
132
161
  - lib/lamma/logger.rb
133
162
  - lib/lamma/runtime.rb
163
+ - lib/lamma/shared_helpers.rb
134
164
  - lib/lamma/templates/python2_7/lambda_function.py.erb
135
165
  - lib/lamma/templates/python2_7/lamma.yml.erb
136
166
  - lib/lamma/version.rb
@@ -138,7 +168,8 @@ files:
138
168
  homepage: https://github.com/ayemos/Lamma
139
169
  licenses:
140
170
  - MIT
141
- metadata: {}
171
+ metadata:
172
+ yard.run: yri
142
173
  post_install_message:
143
174
  rdoc_options: []
144
175
  require_paths:
@@ -155,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
186
  version: '0'
156
187
  requirements: []
157
188
  rubyforge_project:
158
- rubygems_version: 2.5.2
189
+ rubygems_version: 2.4.5
159
190
  signing_key:
160
191
  specification_version: 4
161
192
  summary: Deploy toolset for Amazon Lambda functions.
@@ -1,7 +0,0 @@
1
- require 'lamma'
2
-
3
- module Lamma
4
- class EventSourceMapping
5
-
6
- end
7
- end