lamma 0.2.2 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
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