scout-camp 0.1.11 → 0.1.13
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 +4 -4
- data/.vimproject +12 -5
- data/VERSION +1 -1
- data/lib/scout/aws/s3.rb +37 -10
- data/scout-camp.gemspec +8 -4
- data/scout_commands/terraform/lambda_task +5 -2
- data/share/aws/lambda_function.rb +15 -4
- data/share/terraform/aws/event_bridge/data.tf +10 -0
- data/share/terraform/aws/event_bridge/main.tf +85 -0
- data/share/terraform/aws/event_bridge/variables.tf +19 -0
- data/share/terraform/aws/fargate/output.tf +10 -0
- data/test/scout/aws/test_s3.rb +9 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b67e89dae365eb1464f34a19d600247a18d9698de5a8337d5cda677b1623396a
|
4
|
+
data.tar.gz: f5f37fce02c5a92ef3d370fd4f1e0367955bcaffc993ba5a963dca94f4ec255c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50d5d0ee70db54470257f49ad6b5595beb0b1d5be73df1471088fc336800a075b2d723082834f6dc6252abf1867b95323b84a3e09dd975c6be1ed2a129e2e46a
|
7
|
+
data.tar.gz: 6908c7789074017d48612f538878657dab8165a286ac8468fd5c243549ff1cbe599ef2868e2d5f88ef8df4f859c57aaa95c3fcd9b9603729fd662756c7faefc5
|
data/.vimproject
CHANGED
@@ -47,10 +47,22 @@ scout-camp=/$PWD filter="*" {
|
|
47
47
|
share=share {
|
48
48
|
terraform=terraform {
|
49
49
|
aws=aws {
|
50
|
+
event_bridge=event_bridge{
|
51
|
+
main.tf
|
52
|
+
data.tf
|
53
|
+
variables.tf
|
54
|
+
}
|
55
|
+
|
56
|
+
lambda=lambda {
|
57
|
+
main.tf
|
58
|
+
variables.tf
|
59
|
+
}
|
60
|
+
|
50
61
|
fargate=fargate{
|
51
62
|
main.tf
|
52
63
|
variables.tf
|
53
64
|
locals.tf
|
65
|
+
output.tf
|
54
66
|
}
|
55
67
|
|
56
68
|
efs_host=efs_host{
|
@@ -82,11 +94,6 @@ scout-camp=/$PWD filter="*" {
|
|
82
94
|
variables.tf
|
83
95
|
}
|
84
96
|
|
85
|
-
lambda=lambda {
|
86
|
-
main.tf
|
87
|
-
variables.tf
|
88
|
-
}
|
89
|
-
|
90
97
|
container_lambda=container_lambda{
|
91
98
|
main.tf
|
92
99
|
data.tf
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.13
|
data/lib/scout/aws/s3.rb
CHANGED
@@ -65,8 +65,26 @@ module Open
|
|
65
65
|
|
66
66
|
def self.touch(uri)
|
67
67
|
if self.exists?(uri)
|
68
|
-
else
|
69
68
|
self.cp(uri, uri)
|
69
|
+
else
|
70
|
+
self.write(uri, '')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.size(uri)
|
75
|
+
begin
|
76
|
+
bucket, key = parse_s3_uri(uri)
|
77
|
+
|
78
|
+
s3 = Aws::S3::Client.new
|
79
|
+
|
80
|
+
resp = s3.head_object(bucket: bucket, key: key)
|
81
|
+
return resp.content_length
|
82
|
+
rescue Aws::S3::Errors::NotFound
|
83
|
+
puts "Object not found: #{bucket_name}/#{object_key}"
|
84
|
+
return nil
|
85
|
+
rescue => e
|
86
|
+
puts "Error retrieving object size: #{e.message}"
|
87
|
+
return nil
|
70
88
|
end
|
71
89
|
end
|
72
90
|
|
@@ -159,20 +177,29 @@ module Open
|
|
159
177
|
|
160
178
|
def self.cp(source, target)
|
161
179
|
if is_s3?(target)
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
180
|
+
if is_s3?(source)
|
181
|
+
source_bucket, source_key = parse_s3_uri(source)
|
182
|
+
target_bucket, target_key = parse_s3_uri(target)
|
183
|
+
|
184
|
+
s3 = Aws::S3::Client.new
|
185
|
+
s3.copy_object({
|
186
|
+
copy_source: "#{source_bucket}/#{source_key}",
|
187
|
+
bucket: target_bucket,
|
188
|
+
key: target_key
|
189
|
+
})
|
190
|
+
else
|
191
|
+
self.write(target, Open.get_stream(source))
|
192
|
+
end
|
171
193
|
else
|
172
194
|
Open.sensible_write(target, get_stream(source))
|
173
195
|
end
|
174
196
|
end
|
175
197
|
|
198
|
+
def self.mv(source, target)
|
199
|
+
self.cp(source, target)
|
200
|
+
Open.rm_rf source
|
201
|
+
end
|
202
|
+
|
176
203
|
def self.file_exists?(uri)
|
177
204
|
bucket, key = parse_s3_uri(uri)
|
178
205
|
return false if key.empty? # Can't check existence of bucket this way
|
data/scout-camp.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: scout-camp 0.1.
|
5
|
+
# stub: scout-camp 0.1.13 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "scout-camp".freeze
|
9
|
-
s.version = "0.1.
|
9
|
+
s.version = "0.1.13".freeze
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Miguel Vazquez".freeze]
|
14
|
-
s.date = "
|
14
|
+
s.date = "1980-01-02"
|
15
15
|
s.description = "Functionalities to deploy and use scouts in remote servers like AWS".freeze
|
16
16
|
s.email = "mikisvaz@gmail.com".freeze
|
17
17
|
s.executables = ["scout-camp".freeze]
|
@@ -72,8 +72,12 @@ Gem::Specification.new do |s|
|
|
72
72
|
"share/terraform/aws/efs_host/main.tf",
|
73
73
|
"share/terraform/aws/efs_host/output.tf",
|
74
74
|
"share/terraform/aws/efs_host/variables.tf",
|
75
|
+
"share/terraform/aws/event_bridge/data.tf",
|
76
|
+
"share/terraform/aws/event_bridge/main.tf",
|
77
|
+
"share/terraform/aws/event_bridge/variables.tf",
|
75
78
|
"share/terraform/aws/fargate/locals.tf",
|
76
79
|
"share/terraform/aws/fargate/main.tf",
|
80
|
+
"share/terraform/aws/fargate/output.tf",
|
77
81
|
"share/terraform/aws/fargate/variables.tf",
|
78
82
|
"share/terraform/aws/host/locals.tf",
|
79
83
|
"share/terraform/aws/host/main.tf",
|
@@ -112,7 +116,7 @@ Gem::Specification.new do |s|
|
|
112
116
|
]
|
113
117
|
s.homepage = "http://github.com/mikisvaz/scout-camp".freeze
|
114
118
|
s.licenses = ["MIT".freeze]
|
115
|
-
s.rubygems_version = "3.6.
|
119
|
+
s.rubygems_version = "3.6.7".freeze
|
116
120
|
s.summary = "Deploy you scouts".freeze
|
117
121
|
|
118
122
|
s.specification_version = 4
|
@@ -14,6 +14,7 @@ $ #{$0} [<options>] <workflow> <task> [<other|->]*
|
|
14
14
|
--prefix* Prefix, defaults to Scout
|
15
15
|
--queue Queue job
|
16
16
|
--clean Clean job
|
17
|
+
--info Return job info
|
17
18
|
--recursive_clean Clean job recursively
|
18
19
|
EOF
|
19
20
|
workflow, task_name = ARGV
|
@@ -27,9 +28,9 @@ if workflow.nil? && options[:help]
|
|
27
28
|
exit 0
|
28
29
|
end
|
29
30
|
|
30
|
-
raise
|
31
|
+
raise ParameterException, "No workflow specified" if workflow.nil?
|
31
32
|
|
32
|
-
prefix, clean, recursive_clean, queue = IndiferentHash.process_options options, :prefix, :clean, :recursive_clean, :queue,
|
33
|
+
prefix, clean, recursive_clean, queue, info = IndiferentHash.process_options options, :prefix, :clean, :recursive_clean, :queue, :info,
|
33
34
|
prefix: "Scout"
|
34
35
|
|
35
36
|
require 'aws-sdk-lambda'
|
@@ -116,6 +117,8 @@ res = case task_name
|
|
116
117
|
exit 0
|
117
118
|
end
|
118
119
|
|
120
|
+
payload["info"] = true if info
|
121
|
+
|
119
122
|
aws_lambda(lambda_handler, payload)
|
120
123
|
end
|
121
124
|
|
@@ -7,8 +7,13 @@ def lambda_handler(event:, context:)
|
|
7
7
|
require 'scout/workflow'
|
8
8
|
require 'scout/aws/s3'
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
TmpFile.tmpdir = Path.setup('/tmp')
|
11
|
+
Open.sensible_write_dir = Path.setup('/tmp/sensible_write')
|
12
|
+
|
13
|
+
Log.info "Payload: #{Log.fingerprint(event)}"
|
14
|
+
|
15
|
+
workflow, task_name, jobname, inputs, clean, queue, info = IndiferentHash.process_options event,
|
16
|
+
:workflow, :task_name, :jobname, :inputs, :clean, :queue, :info
|
12
17
|
|
13
18
|
raise ParameterException, "No workflow specified" if workflow.nil?
|
14
19
|
|
@@ -21,6 +26,8 @@ def lambda_handler(event:, context:)
|
|
21
26
|
raise ParameterException, "No task_name specified" if task_name.nil?
|
22
27
|
return workflow.task_info(inputs["task_name"])
|
23
28
|
else
|
29
|
+
Workflow.job_cache.clear
|
30
|
+
|
24
31
|
job = workflow.job(task_name, jobname, inputs)
|
25
32
|
|
26
33
|
case clean
|
@@ -30,7 +37,11 @@ def lambda_handler(event:, context:)
|
|
30
37
|
job.recursive_clean
|
31
38
|
end
|
32
39
|
|
33
|
-
if
|
40
|
+
if info
|
41
|
+
info = job.info.dup
|
42
|
+
info["path"] = job.path
|
43
|
+
info
|
44
|
+
elsif job.done?
|
34
45
|
job.load
|
35
46
|
elsif job.error?
|
36
47
|
raise job.exception
|
@@ -41,7 +52,7 @@ def lambda_handler(event:, context:)
|
|
41
52
|
}
|
42
53
|
elsif queue
|
43
54
|
save_inputs = Scout.var.queue[workflow.to_s][task_name][job.name].find :bucket
|
44
|
-
job.
|
55
|
+
job.save_input_bundle(save_inputs) unless save_inputs.exists?
|
45
56
|
{
|
46
57
|
statusCode: 202,
|
47
58
|
body: job.path
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# IAM Role for EventBridge to trigger ECS task
|
2
|
+
resource "aws_iam_role" "eventbridge_invoke_ecs" {
|
3
|
+
name = "eventbridge_invoke_ecs"
|
4
|
+
|
5
|
+
assume_role_policy = jsonencode({
|
6
|
+
Version = "2012-10-17",
|
7
|
+
Statement = [
|
8
|
+
{
|
9
|
+
Effect = "Allow",
|
10
|
+
Principal = {
|
11
|
+
Service = "events.amazonaws.com"
|
12
|
+
},
|
13
|
+
Action = "sts:AssumeRole"
|
14
|
+
}
|
15
|
+
]
|
16
|
+
})
|
17
|
+
}
|
18
|
+
|
19
|
+
# Permissions for EventBridge to run the task
|
20
|
+
resource "aws_iam_role_policy" "ecs_task_invoke_policy" {
|
21
|
+
role = aws_iam_role.eventbridge_invoke_ecs.name
|
22
|
+
|
23
|
+
policy = jsonencode({
|
24
|
+
Version = "2012-10-17",
|
25
|
+
Statement = [
|
26
|
+
{
|
27
|
+
Effect = "Allow",
|
28
|
+
Action = [
|
29
|
+
"ecs:RunTask"
|
30
|
+
],
|
31
|
+
Resource = "*"
|
32
|
+
},
|
33
|
+
{
|
34
|
+
Effect = "Allow",
|
35
|
+
Action = [
|
36
|
+
"iam:PassRole"
|
37
|
+
],
|
38
|
+
Resource = "*"
|
39
|
+
}
|
40
|
+
]
|
41
|
+
})
|
42
|
+
}
|
43
|
+
|
44
|
+
# EventBridge rule triggered on S3 put event
|
45
|
+
resource "aws_cloudwatch_event_rule" "s3_put_event" {
|
46
|
+
name = "s3-put-to-uploads"
|
47
|
+
description = "Triggers Fargate task on S3 file upload"
|
48
|
+
event_pattern = jsonencode({
|
49
|
+
source = ["aws.s3"],
|
50
|
+
"detail-type" = ["Object Created"],
|
51
|
+
detail = {
|
52
|
+
bucket = {
|
53
|
+
name = [var.bucket]
|
54
|
+
},
|
55
|
+
object = {
|
56
|
+
key = [{
|
57
|
+
prefix = var.directory
|
58
|
+
}]
|
59
|
+
}
|
60
|
+
}
|
61
|
+
})
|
62
|
+
}
|
63
|
+
|
64
|
+
# Target: ECS Fargate task
|
65
|
+
resource "aws_cloudwatch_event_target" "run_fargate" {
|
66
|
+
rule = aws_cloudwatch_event_rule.s3_put_event.name
|
67
|
+
arn = var.cluster_arn # Replace with your ECS Cluster ARN
|
68
|
+
role_arn = aws_iam_role.eventbridge_invoke_ecs.arn
|
69
|
+
|
70
|
+
ecs_target {
|
71
|
+
task_definition_arn = var.task_arn
|
72
|
+
launch_type = "FARGATE"
|
73
|
+
network_configuration {
|
74
|
+
assign_public_ip = true
|
75
|
+
subnets = data.aws_subnets.default.ids
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
# Allow S3 to send events to EventBridge
|
81
|
+
#resource "aws_s3_bucket_notification" "s3_event" {
|
82
|
+
# bucket = var.bucket_name
|
83
|
+
#
|
84
|
+
# eventbridge = true
|
85
|
+
#}
|
data/test/scout/aws/test_s3.rb
CHANGED
@@ -21,6 +21,15 @@ class TestS3 < Test::Unit::TestCase
|
|
21
21
|
Open.rm uri
|
22
22
|
end
|
23
23
|
|
24
|
+
def test_touch_size
|
25
|
+
uri = "s3://herlab/tmp/foo.txt"
|
26
|
+
|
27
|
+
Open.rm uri
|
28
|
+
Open.touch uri
|
29
|
+
assert_equal 0, Open.size(uri)
|
30
|
+
Open.rm uri
|
31
|
+
end
|
32
|
+
|
24
33
|
def test_write_io
|
25
34
|
uri = "s3://herlab/tmp/foo.txt"
|
26
35
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scout-camp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Vazquez
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: scout-essentials
|
@@ -84,8 +84,12 @@ files:
|
|
84
84
|
- share/terraform/aws/efs_host/main.tf
|
85
85
|
- share/terraform/aws/efs_host/output.tf
|
86
86
|
- share/terraform/aws/efs_host/variables.tf
|
87
|
+
- share/terraform/aws/event_bridge/data.tf
|
88
|
+
- share/terraform/aws/event_bridge/main.tf
|
89
|
+
- share/terraform/aws/event_bridge/variables.tf
|
87
90
|
- share/terraform/aws/fargate/locals.tf
|
88
91
|
- share/terraform/aws/fargate/main.tf
|
92
|
+
- share/terraform/aws/fargate/output.tf
|
89
93
|
- share/terraform/aws/fargate/variables.tf
|
90
94
|
- share/terraform/aws/host/locals.tf
|
91
95
|
- share/terraform/aws/host/main.tf
|
@@ -139,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
139
143
|
- !ruby/object:Gem::Version
|
140
144
|
version: '0'
|
141
145
|
requirements: []
|
142
|
-
rubygems_version: 3.6.
|
146
|
+
rubygems_version: 3.6.7
|
143
147
|
specification_version: 4
|
144
148
|
summary: Deploy you scouts
|
145
149
|
test_files: []
|