aws-ssm-env 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,67 @@
1
+ require 'aws-ssm-env/fetchers/factory'
2
+ require 'aws-ssm-env/naming_strategies/factory'
3
+
4
+ module AwsSsmEnv
5
+ # このgemのエントリポイントとなるクラス。メイン処理を行う。
6
+ # AWS EC2 Parameters Storeからパラメータを取得してENVに書き込む。
7
+ #
8
+ # @author Ryohei Sonoda
9
+ # @since 0.1.0
10
+ class Loader
11
+ # メイン処理。引数の詳細は AwsSsmEnv#load を参照。
12
+ def self.load(**args)
13
+ new(args).load
14
+ end
15
+
16
+ def initialize(**args)
17
+ parse_options(args)
18
+ if @logger
19
+ @logger.debug("#{self.class.name} overwrite: #{@overwrite}")
20
+ @logger.debug("#{self.class.name} fetcher: #{@fetcher}")
21
+ @logger.debug("#{self.class.name} naming_strategy: #{@naming_strategy}")
22
+ end
23
+ end
24
+
25
+ def load
26
+ @fetcher.each do |parameter|
27
+ var_name = @naming_strategy.parse_name(parameter)
28
+ @logger.debug("#{self.class.name} #{parameter.name} parameter value into ENV['#{var_name}']") if @logger
29
+ send(@applier, var_name, parameter.value)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def parse_options(**options)
36
+ @logger = options[:logger]
37
+ @fetcher = AwsSsmEnv::FetcherFactory.create_fetcher(options)
38
+ @naming_strategy = AwsSsmEnv::NamingStrategyFactory.create_naming_strategy(options)
39
+ @overwrite = overwrite?(options)
40
+ if @overwrite
41
+ @applier = :apply!
42
+ else
43
+ @applier = :apply
44
+ end
45
+ end
46
+
47
+ # overwriteフラグが指定されているかどうかを返す。
48
+ def overwrite?(overwrite: nil, **)
49
+ if overwrite.nil?
50
+ false
51
+ else
52
+ overwrite.to_s.downcase == 'true'
53
+ end
54
+ end
55
+
56
+ def apply(name, value)
57
+ if ENV[name]
58
+ return
59
+ end
60
+ apply!(name, value)
61
+ end
62
+
63
+ def apply!(name, value)
64
+ ENV[name] = value
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,19 @@
1
+ require 'aws-ssm-env/naming_strategy'
2
+
3
+ module AwsSsmEnv
4
+ # 環境変数名にパラメータ名の階層表現のbasenameを利用するようにするNamingStrategy実装クラス。
5
+ # AwsSsmEnv#load で`naming`を指定しなかった場合にはこのクラスのインスタンスが利用される。
6
+ # 例えば、`/path/to/ENV_NAME`というパラメータ名であればENV['ENV_NAME']にパラメータ値がインジェクションされる。
7
+ #
8
+ # @author Ryohei Sonoda
9
+ # @since 0.1.0
10
+ class BasenameNamingStrategy < NamingStrategy
11
+ # @see AwsSsmEnv::NamingStrategy#parse_name
12
+ #
13
+ # パラメータ名の最後の階層を変数名として返す。
14
+ # @return [String] 環境変数名
15
+ def parse_name(parameter)
16
+ File.basename(parameter.name)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,68 @@
1
+ require 'aws-ssm-env/naming_strategy'
2
+
3
+ module AwsSsmEnv
4
+ # 環境変数名を導出するためのNamingStrategyクラスを取得もしくは生成するファクトリクラス。
5
+ #
6
+ # @author Ryohei Sonoda
7
+ # @since 0.1.0
8
+ class NamingStrategyFactory
9
+ BASENAME_STRATEGY = :basename
10
+ SNAKE_CASE_STRATEGY = :snakecase
11
+
12
+ class << self
13
+ # 環境変数名を導出するためのNamingStrategyクラスを取得もしくは生成する。
14
+ #
15
+ # @param [Hash] args AwsSsmEnv#load に渡された引数がそのまま渡される。
16
+ # @option args [Symbol, AwsSsmEnv::NamingStrategy, Object] naming
17
+ # 引数の詳細は AwsSsmEnv#load の説明を参照。
18
+ def create_naming_strategy(**args)
19
+ naming_strategy = args[:naming]
20
+ if naming_strategy.nil?
21
+ return default_strategy(args)
22
+ end
23
+ case naming_strategy
24
+ when BASENAME_STRATEGY
25
+ create_basename_strategy(args)
26
+ when SNAKE_CASE_STRATEGY
27
+ create_snakecase_strategy(args)
28
+ else
29
+ unknown_naming_strategy(naming_strategy)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def default_strategy(**args)
36
+ create_basename_strategy(args)
37
+ end
38
+
39
+ def create_basename_strategy(**args)
40
+ require 'aws-ssm-env/naming_strategies/basename'
41
+ AwsSsmEnv::BasenameNamingStrategy.new(args)
42
+ end
43
+
44
+ def create_snakecase_strategy(**args)
45
+ require 'aws-ssm-env/naming_strategies/snakecase'
46
+ AwsSsmEnv::SnakeCaseNamingStrategy.new(args)
47
+ end
48
+
49
+ def unknown_naming_strategy(naming_strategy)
50
+ unless naming_strategy_instance?(naming_strategy)
51
+ raise ArgumentError, 'Possible values for :naming are either :basename, :snakecase, ' \
52
+ + '"AwsSsmEnv::NamingStrategy" implementation class, an object with "parse_name" method.'
53
+ end
54
+ naming_strategy
55
+ end
56
+
57
+ def naming_strategy_instance?(object)
58
+ if object.is_a?(AwsSsmEnv::NamingStrategy)
59
+ true
60
+ elsif object.respond_to?(:parse_name)
61
+ true
62
+ else
63
+ false
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,58 @@
1
+ require 'aws-ssm-env/naming_strategy'
2
+
3
+ module AwsSsmEnv
4
+ # パラメータ名の階層表現をスネークケースに変換した値を環境変数名とする。
5
+ # 例えば、`removed_prefix`が`/path`で`/path/to/environment_name`というパラメータ名なら
6
+ # ENV['TO_ENVIRONMENT_NAME']にパラメータ値がインジェクションされる。
7
+ #
8
+ # @author Ryohei Sonoda
9
+ # @since 0.1.0
10
+ class SnakeCaseNamingStrategy < NamingStrategy
11
+ # ここの引数は AwsSsmEnv#load の呼び出し時に渡された引数がそのまま渡される。
12
+ #
13
+ # @param [Hash] args AwsSsmEnv#load の呼び出し時に渡された引数。
14
+ # @option args [String] :removed_prefix
15
+ # パラメータ名から除去するプレフィクス。この文字列は導出される環境変数名に含まない。
16
+ # :removed_prefixが指定されておらず、:begins_with または :path が指定されていた場合はそれを利用する。 TODO: AwsSsmEnv#loadとREADMEに反映
17
+ # @option args [String, Regexp] :delimiter
18
+ # アンダースコアに変換する区切り文字。デフォルトはスラッシュ('/')。 TODO: AwsSsmEnv#loadとREADMEに反映
19
+ def initialize(**args)
20
+ @logger = args[:logger]
21
+ @delimiter = detect_delimiter(args)
22
+ removed_prefix = detect_prefix(args).sub(%r{/\z}, '')
23
+ @removed_prefix = /\A#{Regexp.escape(removed_prefix)}/
24
+ @logger.debug("#{self.class.name} removed_prefix is #{@removed_prefix}") if @logger
25
+ end
26
+
27
+ # @see AwsSsmEnv::NamingStrategy#parse_name
28
+ #
29
+ # パラメータ名からプレフィクスを除去してパス区切りをアンダースコアに変換後、大文字にして返す。
30
+ # @return [String] 環境変数名
31
+ def parse_name(parameter)
32
+ name_without_prefix = parameter.name.gsub(@removed_prefix, '')
33
+ name_without_prefix.gsub(@delimiter, '_').upcase
34
+ end
35
+
36
+ private
37
+
38
+ def detect_delimiter(**args)
39
+ if args[:delimiter].nil?
40
+ '/'
41
+ else
42
+ args[:delimiter]
43
+ end
44
+ end
45
+
46
+ def detect_prefix(**args)
47
+ if args[:removed_prefix]
48
+ args[:removed_prefix]
49
+ elsif args[:begins_with]
50
+ args[:begins_with]
51
+ elsif args[:path]
52
+ args[:path]
53
+ else
54
+ ''
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,23 @@
1
+ module AwsSsmEnv
2
+ # パラメータの値を設定する環境変数名を決定するためのStrategyクラス。
3
+ # 実装クラスを AwsSsmEnv#load の引数で`naming`パラメータとして渡すことにより
4
+ # インジェクションされる環境変数名の命名ルールを切り替えられるようにする。
5
+ #
6
+ # @abstract
7
+ # @author Ryohei Sonoda
8
+ # @since 0.1.0
9
+ class NamingStrategy
10
+ # ここの引数は AwsSsmEnv#load の呼び出し時に渡された引数がそのまま渡される。
11
+ # サブクラスでは必要に応じて使う引数をインスタンス変数に保持しておく。
12
+ #
13
+ # @param [Hash] ** AwsSsmEnv#load の呼び出し時に渡された引数。
14
+ def initialize(**); end
15
+
16
+ # パラメータから環境変数名を導出するメソッド。
17
+ # @abstract
18
+ # @return [String] 環境変数名
19
+ def parse_name(_parameter)
20
+ raise NotImplementedError, 'parse_name'
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module AwsSsmEnv
2
+ VERSION = '0.1.0'.freeze
3
+ end
metadata ADDED
@@ -0,0 +1,156 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aws-ssm-env
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryohei Sonoda
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-12-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk-ssm
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.48.1
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.48.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov-console
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Loads environment variables from AWS EC2 System Parameters.
112
+ email:
113
+ - ryohei-sonoda@m3.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - LICENSE
119
+ - README.md
120
+ - README_en.md
121
+ - lib/aws-ssm-env.rb
122
+ - lib/aws-ssm-env/fetcher.rb
123
+ - lib/aws-ssm-env/fetchers/begins_with.rb
124
+ - lib/aws-ssm-env/fetchers/factory.rb
125
+ - lib/aws-ssm-env/fetchers/path.rb
126
+ - lib/aws-ssm-env/loader.rb
127
+ - lib/aws-ssm-env/naming_strategies/basename.rb
128
+ - lib/aws-ssm-env/naming_strategies/factory.rb
129
+ - lib/aws-ssm-env/naming_strategies/snakecase.rb
130
+ - lib/aws-ssm-env/naming_strategy.rb
131
+ - lib/aws-ssm-env/version.rb
132
+ homepage: https://github.com/sonodar/aws-ssm-env-ruby
133
+ licenses:
134
+ - Apache License 2.0
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubyforge_project:
152
+ rubygems_version: 2.6.13
153
+ signing_key:
154
+ specification_version: 4
155
+ summary: Loads environment variables from AWS EC2 System Parameters.
156
+ test_files: []