lambda_convert 0.0.5 → 0.0.6

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -0
  3. data/lib/lambda_convert/cli.rb +79 -54
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ab417e94470f8f933b2d90b7010d3050cbdf608d
4
- data.tar.gz: c2748ee3e263683c0b7aadf00d4a2da2e5b5883d
3
+ metadata.gz: 6c605d6308b66aa522b51fe09121ea05a1e962eb
4
+ data.tar.gz: 375b23a2819be672e58bb8894fc7c0df5fc3c10a
5
5
  SHA512:
6
- metadata.gz: 30120d3f06649b62c0bdf9b3bcf44ca68fbf4a4d6efcc7a14b198187f054ff86d2a101a7eb1fec24a4ec84726812ca26b2425649344a6a587681ec3ffda0b6b3
7
- data.tar.gz: 68052dd61c6afdc2da6d303105169eb302376b0d871d2ffcda3bdf2fdd8ccec4ad872578cb85fbcfb2651893b8b595c4a5047bf90e8ab53b145eaf77bfc5c403
6
+ metadata.gz: a55edfd1babe87ff83d2a9cc763e9a47501b63af31d7c1028f04479f222bffe1a566ae614af7ff896668e8c1cb1838e8586e7e521f138da47851f5263464c197
7
+ data.tar.gz: 5f557c99c83614749f0b189e56764fc1640359a343f1a649e2943546086e5691e978cce192597e3b723437b2781110f96d702e8e3ccf9c3eab3db5687aaf2049
data/README.md CHANGED
@@ -27,3 +27,7 @@ To eliminate the big image file uploading issue and the security risk, the idea
27
27
  - **CONVERT_S3_KEY_PREFIX** - AWS S3 temporary file uploading prefix, default value is `_convert_tmp/`
28
28
  - **CONVERT_LAMBDA_FUNCTION** - Name of the AWS Lambda function to invoke, default value is `image-convert-prod`
29
29
  - **CONVERT_DISABLE_FALLBACK** - By default, this command line tool fallbacks to local `convert` command if remote operation fails. Set this value to 1 to disable the fallback behavior.
30
+
31
+ ## The AWS Lambda function
32
+
33
+ The AWS Lambda function for running ImageMagick can be found here at https://github.com/envoy/envoy-convert
@@ -1,5 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'json'
3
+ require 'securerandom'
3
4
  require 'English'
4
5
 
5
6
  require 'aws-sdk'
@@ -9,95 +10,119 @@ module LambdaConvert
9
10
  module CLI
10
11
  class <<self
11
12
  attr_accessor :logger
12
- end
13
13
 
14
- def self.lambda_convert
15
- s3_region = ENV['CONVERT_S3_REGION'] || ENV['AWS_REGION']
16
- lambda_region = ENV['CONVERT_LAMBDA_REGION'] || ENV['AWS_REGION']
17
- aws_credentials = Aws::Credentials.new(
18
- ENV['CONVERT_ACCESS_KEY'] || ENV['AWS_ACCESS_KEY_ID'],
19
- ENV['CONVERT_SECRET_ACCESS_KEY'] || ENV['AWS_SECRET_ACCESS_KEY']
20
- )
21
- s3_bucket = ENV['CONVERT_S3_BUCKET']
22
- s3_key_prefix = ENV['CONVERT_S3_KEY_PREFIX'] || '_convert_tmp/'
23
- lambda_function = ENV['CONVERT_LAMBDA_FUNCTION'] || 'image-convert-prod'
14
+ def aws_credentials
15
+ Aws::Credentials.new(
16
+ ENV['CONVERT_ACCESS_KEY'] || ENV['AWS_ACCESS_KEY_ID'],
17
+ ENV['CONVERT_SECRET_ACCESS_KEY'] || ENV['AWS_SECRET_ACCESS_KEY']
18
+ )
19
+ end
24
20
 
25
- s3 = Aws::S3::Client.new(
26
- region: s3_region,
27
- credentials: aws_credentials
28
- )
29
- aws_lambda = Aws::Lambda::Client.new(
30
- region: lambda_region,
31
- credentials: aws_credentials
32
- )
21
+ def lambda_region
22
+ ENV['CONVERT_LAMBDA_REGION'] || ENV['AWS_REGION']
23
+ end
33
24
 
34
- abort('Invalid arguments') if ARGV.count < 2
25
+ def lambda_function
26
+ ENV['CONVERT_LAMBDA_FUNCTION'] || 'image-convert-prod'
27
+ end
35
28
 
36
- input_file, input_selecting = LambdaConvert::Utils.parse_input_path(
37
- ARGV[0]
38
- )
39
- # Notice: there is also special output file syntax for convert command,
40
- # but we are not supporting them now, as we probably won't use it
41
- output_file = ARGV[-1]
29
+ def s3_region
30
+ ENV['CONVERT_S3_REGION'] || ENV['AWS_REGION']
31
+ end
42
32
 
43
- input_key = "#{s3_key_prefix}#{SecureRandom.uuid}"
44
- output_key = "#{s3_key_prefix}#{SecureRandom.uuid}"
33
+ def s3_bucket
34
+ ENV['CONVERT_S3_BUCKET']
35
+ end
45
36
 
37
+ def s3_key_prefix
38
+ ENV['CONVERT_S3_KEY_PREFIX'] || '_convert_tmp/'
39
+ end
40
+
41
+ def s3_client
42
+ @s3_client ||= Aws::S3::Client.new(
43
+ region: s3_region,
44
+ credentials: aws_credentials
45
+ )
46
+ end
47
+
48
+ def lambda_client
49
+ @aws_lambda ||= Aws::Lambda::Client.new(
50
+ region: lambda_region,
51
+ credentials: aws_credentials
52
+ )
53
+ end
54
+ end
55
+
56
+ def self.upload_file(input_file, input_key)
46
57
  logger.info("Uploading file to s3://#{s3_bucket}/#{input_key}")
47
58
  File.open(input_file, 'rb') do |file|
48
- s3.put_object(bucket: s3_bucket, key: input_key, body: file)
59
+ s3_client.put_object(bucket: s3_bucket, key: input_key, body: file)
49
60
  end
61
+ end
62
+
63
+ def self.invoke_lambda(input_key, input_selecting, args, output_key)
50
64
  source = '{source}'
51
65
  source += "[#{input_selecting}]" unless input_selecting.nil?
52
66
  instruction = {
53
67
  schema: 'envoy-convert-instruction',
54
68
  original: input_key,
55
69
  bucket: s3_bucket,
56
- write_options: {
57
- acl: 'private'
58
- },
70
+ write_options: {},
59
71
  key: output_key,
60
- args: [source] + ARGV[1..-2] + ['{dest}']
72
+ args: [source] + args + ['{dest}']
61
73
  }
62
74
  logger.info("Invoking lambda with instruction #{instruction}")
63
75
 
64
- resp = aws_lambda.invoke(
76
+ resp = lambda_client.invoke(
65
77
  function_name: lambda_function,
66
78
  invocation_type: 'RequestResponse',
67
79
  payload: JSON.dump(instruction)
68
80
  )
69
81
  logger.info("Get response of invoke #{resp}")
70
82
  raise 'Failed to run convert on Lambda' if resp.status_code != 200
83
+ end
71
84
 
85
+ def self.download_file(output_key, output_file)
72
86
  logger.info(
73
87
  "Downloading file from s3://#{s3_bucket}/#{output_key} to " \
74
88
  "#{output_file}"
75
89
  )
76
- s3.get_object(
90
+ s3_client.get_object(
77
91
  response_target: output_file,
78
92
  bucket: s3_bucket,
79
93
  key: output_key
80
94
  )
95
+ end
96
+
97
+ def self.delete_files(keys)
98
+ logger.info("Delete files #{keys} from #{s3_bucket}")
99
+ s3_client.delete_objects(
100
+ bucket: s3_bucket,
101
+ delete: {
102
+ objects: keys.map { |key| { key: key } },
103
+ quiet: true
104
+ }
105
+ )
106
+ end
107
+
108
+ def self.lambda_convert
109
+ input_file, input_selecting = LambdaConvert::Utils.parse_input_path(
110
+ ARGV[0]
111
+ )
112
+ # Notice: there is also special output file syntax for convert command,
113
+ # but we are not supporting them now, as we probably won't use it
114
+ output_file = ARGV[-1]
115
+ input_key = "#{s3_key_prefix}#{SecureRandom.uuid}"
116
+ output_key = "#{s3_key_prefix}#{SecureRandom.uuid}"
117
+
118
+ upload_file(input_file, input_key)
119
+ invoke_lambda(input_key, input_selecting, ARGV[1..-2], output_key)
120
+ download_file(output_key, output_file)
121
+
81
122
  logger.info('Done')
82
123
  ensure
83
- if !s3.nil? && !input_key.nil? && !output_key.nil?
84
- logger.info(
85
- "Delete files #{input_key} and #{output_key} from #{s3_bucket}"
86
- )
87
- s3.delete_objects(
88
- bucket: s3_bucket,
89
- delete: {
90
- objects: [
91
- {
92
- key: input_key
93
- },
94
- {
95
- key: output_key
96
- }
97
- ],
98
- quiet: true
99
- }
100
- )
124
+ if !input_key.nil? && !output_key.nil?
125
+ delete_files([input_key, output_key])
101
126
  end
102
127
  end
103
128
 
@@ -117,9 +142,9 @@ module LambdaConvert
117
142
 
118
143
  def self.main
119
144
  abort('Recursive call') if ENV['CONVERT_RECURSIVE_FLAG'] == '1'
145
+ abort('Invalid arguments') if ARGV.count < 2
120
146
  lambda_convert
121
147
  rescue StandardError => e
122
-
123
148
  logger.warn("Failed to convert via lambda, error=#{e}")
124
149
  fallback_disabled = (ENV['CONVERT_DISABLE_FALLBACK'].to_i != 0) || false
125
150
  if fallback_disabled
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lambda_convert
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fang-Pen Lin