bauble_core 0.1.0

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.
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zip'
4
+ require_relative 'resource'
5
+
6
+ # Ruby function
7
+ module Bauble
8
+ module Resources
9
+ # a ruby lambda function
10
+ class RubyFunction < Resource
11
+ attr_accessor :handler, :name, :role, :code_dir, :function_url, :env_vars
12
+
13
+ def initialize(app, **kwargs)
14
+ super(app)
15
+ @name = kwargs[:name]
16
+ @handler = kwargs[:handler]
17
+ @code_dir = kwargs[:code_dir]
18
+ @role = kwargs[:role]
19
+ @function_url = kwargs.fetch(:function_url, false)
20
+ @env_vars = kwargs.fetch(:env_vars, {})
21
+ end
22
+
23
+ def bundle
24
+ return true unless @code_dir
25
+
26
+ # generate the asset directory path
27
+ assets_dir = File.join(@app.config.asset_dir, @app.bundle_hash)
28
+ FileUtils.mkdir_p(assets_dir)
29
+
30
+ # create the zipfile path
31
+ zipfile_name = File.join(assets_dir, "#{name}.zip")
32
+ FileUtils.rm_f(zipfile_name)
33
+
34
+ # create the zipfile
35
+ Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
36
+ # add the code directory to the zipfile
37
+ Dir.glob(File.join(@code_dir, '**', '*')).each do |file|
38
+ zipfile_path = File.join(File.basename(@code_dir), file.sub("#{code_dir}/", ''))
39
+ zipfile.add(zipfile_path, file)
40
+ end
41
+
42
+ %w[Gemfile Gemfile.lock].each do |gemfile|
43
+ gemfile_path = File.join(@app.config.root_dir, gemfile)
44
+ zipfile.add(gemfile, gemfile_path) if File.exist?(gemfile_path)
45
+ end
46
+ end
47
+ end
48
+
49
+ def synthesize
50
+ template = base_template
51
+ template.merge!(function_url_template_addon) if @function_url
52
+ template
53
+ end
54
+
55
+ private
56
+
57
+ def base_template
58
+ {
59
+ @name => {
60
+ 'type' => 'aws:lambda:Function',
61
+ 'name' => @name,
62
+ 'properties' => {
63
+ 'handler' => @handler,
64
+ 'runtime' => 'ruby3.2',
65
+ 'code' => {
66
+ 'fn::fileArchive' => code_archive
67
+ },
68
+ 'role' => "${#{@role.role_name}.arn}",
69
+ 'layers' => ['${gemLayer.arn}'],
70
+ 'environment' => {
71
+ 'variables' => @env_vars.merge(
72
+ {
73
+ 'GEM_PATH' => '/opt/ruby/3.2.0'
74
+ }
75
+ )
76
+ }
77
+ }
78
+ }
79
+ }
80
+ end
81
+
82
+ def code_archive
83
+ return "#{@app.config.asset_dir}/#{@app.bundle_hash}/#{@name}.zip" if @code_dir
84
+
85
+ "#{@app.config.asset_dir}/#{@app.bundle_hash}/shared_app_code"
86
+ end
87
+
88
+ def function_url_template_addon
89
+ {
90
+ 'function_url' => {
91
+ 'type' => 'aws:lambda:FunctionUrl',
92
+ 'name' => "#{@name}Url",
93
+ 'properties' => {
94
+ 'functionName' => "${#{@name}}",
95
+ 'authorizationType' => 'NONE'
96
+ }
97
+ }
98
+ }
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'resource'
4
+
5
+ # bauble bucket to upload assets
6
+ module Bauble
7
+ module Resources
8
+ # S3 bucket
9
+ class S3Bucket < Resource
10
+ attr_accessor :bucket_name, :force_destroy
11
+
12
+ def initialize(app, bucket_name: 'bauble-bucket', force_destroy: false)
13
+ super(app)
14
+ @bucket_name = bucket_name
15
+ @force_destroy = force_destroy
16
+ end
17
+
18
+ def synthesize
19
+ {
20
+ @bucket_name => {
21
+ 'type' => 'aws:s3:Bucket',
22
+ 'properties' => {
23
+ 'bucket' => @bucket_name,
24
+ 'forceDestroy' => @force_destroy
25
+ }
26
+ }
27
+ }
28
+ end
29
+
30
+ def bundle
31
+ true
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'resource'
4
+
5
+ # bauble resources to manage infrastructure
6
+ module Bauble
7
+ module Resources
8
+ # SQS Queue
9
+ class SQSQueue < Resource
10
+ attr_accessor :name, :visibility_timeout, :lambda_targets
11
+
12
+ def initialize(app, name:, visibility_timeout: 30)
13
+ super(app)
14
+ @name = name
15
+ @visibility_timeout = visibility_timeout
16
+ @lambda_targets = []
17
+ end
18
+
19
+ def synthesize
20
+ base_template = {
21
+ @name => {
22
+ 'type' => 'aws:sqs:Queue',
23
+ 'properties' => {
24
+ 'name' => @name,
25
+ 'visibilityTimeoutSeconds' => @visibility_timeout
26
+ }
27
+ }
28
+ }
29
+
30
+ @lambda_targets.each { |target| base_template.merge!(target) }
31
+
32
+ base_template
33
+ end
34
+
35
+ def bundle
36
+ true
37
+ end
38
+
39
+ # Function to add a Lambda function as a target to the SQS Queue
40
+ def add_target(function)
41
+ @lambda_targets << {
42
+ "#{@name}_to_#{function.name}" => {
43
+ 'type' => 'aws:lambda:EventSourceMapping',
44
+ 'properties' => {
45
+ 'eventSourceArn' => "${#{name}.arn}",
46
+ 'functionName' => "${#{function.name}.name}",
47
+ 'batchSize' => 10
48
+ }
49
+ }
50
+ }
51
+ function.role.add_policy_statement(
52
+ effect: 'Allow',
53
+ actions: ['sqs:ReceiveMessage', 'sqs:DeleteMessage', 'sqs:GetQueueAttributes'],
54
+ resources: ["${#{name}.arn}"]
55
+ )
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bauble
4
+ # Pulumi stack
5
+ class Stack
6
+ attr_accessor :name
7
+
8
+ def initialize(app, name)
9
+ @name = name
10
+ app.add_stack(self)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bauble
4
+ VERSION = '0.1.0'
5
+ end
data/lib/bauble.rb ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'bauble/version'
4
+ require_relative 'bauble/application'
5
+ require_relative 'bauble/resources/lambda_role'
6
+ require_relative 'bauble/resources/s3_bucket'
7
+ require_relative 'bauble/resources/ruby_function'
8
+ require_relative 'bauble/resources/gem_layer'
9
+ require_relative 'bauble/resources/event_bridge_rule'
10
+ require_relative 'bauble/resources/sqs_queue'
11
+ require_relative 'bauble/resources/api_gateway_v2'
12
+ require_relative 'bauble/stack'
13
+
14
+ module Bauble
15
+ class Error < StandardError; end
16
+ end
data/sig/bauble.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Bauble
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bauble_core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - James Hoegerl
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-10-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubyzip
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.3.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.3.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: thor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.2
55
+ description: |-
56
+ Bauble is a gem designed to simplify the deployment of your Ruby-based AWS Lambda functions. It
57
+ provides a streamlined and efficient process, ensuring that your functions are deployed quickly and correctly.
58
+ email:
59
+ - james-hoegerl@pluralsight.com
60
+ executables:
61
+ - bauble
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - CHANGELOG.md
66
+ - CODE_OF_CONDUCT.md
67
+ - LICENSE.txt
68
+ - README.md
69
+ - exe/bauble
70
+ - lib/bauble.rb
71
+ - lib/bauble/application.rb
72
+ - lib/bauble/cli/bundle_command_builder.rb
73
+ - lib/bauble/cli/cli.rb
74
+ - lib/bauble/cli/code_bundler.rb
75
+ - lib/bauble/cli/commands/destroy.rb
76
+ - lib/bauble/cli/commands/preview.rb
77
+ - lib/bauble/cli/commands/up.rb
78
+ - lib/bauble/cli/config.rb
79
+ - lib/bauble/cli/docker_command_builder.rb
80
+ - lib/bauble/cli/logger.rb
81
+ - lib/bauble/cli/pulumi.rb
82
+ - lib/bauble/resources/api_gateway_v2.rb
83
+ - lib/bauble/resources/event_bridge_rule.rb
84
+ - lib/bauble/resources/gem_layer.rb
85
+ - lib/bauble/resources/lambda_role.rb
86
+ - lib/bauble/resources/postgres_layer.rb
87
+ - lib/bauble/resources/resource.rb
88
+ - lib/bauble/resources/ruby_function.rb
89
+ - lib/bauble/resources/s3_bucket.rb
90
+ - lib/bauble/resources/sqs_queue.rb
91
+ - lib/bauble/stack.rb
92
+ - lib/bauble/version.rb
93
+ - sig/bauble.rbs
94
+ homepage: https://github.com/la-jamesh/bauble
95
+ licenses:
96
+ - MIT
97
+ metadata:
98
+ homepage_uri: https://github.com/la-jamesh/bauble
99
+ source_code_uri: https://github.com/la-jamesh/bauble
100
+ changelog_uri: https://github.com/la-jamesh/bauble
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 3.0.0
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubygems_version: 3.4.19
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: Deploy Ruby-based AWS Lambda functions easily.
120
+ test_files: []