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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 02a1b7f6e19f94121b951fa081dab24f07a19b63
4
+ data.tar.gz: 91ea648fbd61babe279737fe07bf67d379976fa0
5
+ SHA512:
6
+ metadata.gz: 1494b25e51d89ed45f473a373d462b6f84e9d7735c204e5e1ebb1e398470ee60c641c08c5f3b1f93dd29cc8fe56e3af8cb6f4512213f1cb9eb3674c0c3086958
7
+ data.tar.gz: 682c81baa1ff424184e5a2ac1e1b00698edda851e9b4118bb87d1ad966dc7c15f864cabc3ef190271f9cbe5e118162ace305ea0cfe1dcb274b667584f792e2ae
data/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
@@ -0,0 +1,272 @@
1
+ # aws-ssm-env
2
+
3
+ AWS EC2 Parameter Storeから取得したパラメータを環境変数として設定します。
4
+
5
+ デフォルトでは、パラメータ名の最後の階層が環境変数名として設定されます。
6
+
7
+ 例えば、`/staging/secure/DB_PASSWORD`というパラメータ名であれば、`ENV['DB_PASSWORD']`にパラメータ値が設定されます。
8
+ この環境変数のネーミングはオプションでカスタマイズ可能です。(後述)
9
+
10
+ ## Installation
11
+
12
+ ```
13
+ gem install aws-ssm-env
14
+ ```
15
+
16
+ ### Rails
17
+
18
+ ```ruby
19
+ # Gemfile
20
+ gem 'aws-ssm-env', group: :aws
21
+ ```
22
+
23
+ ```ruby
24
+ # config/application.rb
25
+ if defined?(AwsSsmEnv)
26
+ AwsSsmEnv.load(path: "/myapp/#{ENV['RAILS_ENV']}", recursive: true)
27
+ end
28
+ ```
29
+
30
+ ### Other ruby program
31
+
32
+ ```ruby
33
+ require 'aws-ssm-env'
34
+ AwsSsmEnv.load!(begins_with: "myapp.ENV['RACK_ENV'].")
35
+ ```
36
+
37
+ ## Quick Start
38
+
39
+ 事前にAWS EC2 Parameter Storeにパラメータを登録しておく必要があります。
40
+
41
+ ```shell
42
+ # 例) /myservice/staging/RDS_PASSWORDをSecureStringで登録
43
+ aws ssm --region ap-northeast-1 put-parameter \
44
+ --name /myservice/staging/RDS_PASSWORD \
45
+ --type SecureString --value <secret value>
46
+ ```
47
+
48
+ AWSの認証情報を設定します。例えば、以下のように環境変数を利用したり、
49
+
50
+ ```shell
51
+ export AWS_ACCESS_KEY_ID=YOURACCESSKEYID
52
+ export AWS_SECRET_ACCESS_KEY=YOURSECRETKEY
53
+ bundle exec rails start
54
+ ```
55
+
56
+ 引数で`ssm_client_args`を渡したり、
57
+
58
+ ```ruby
59
+ AwsSsmEnv.load(
60
+ fetch: "/myservice/#{ENV['RAILS_ENV']}",
61
+ ssm_client_args: {
62
+ access_key_id: 'ACCESS_KEY_ID',
63
+ secret_access_key: 'SECRET_ACCESS_KEY',
64
+ region: 'ap-northeast-1',
65
+ }
66
+ )
67
+ ```
68
+
69
+ `Aws.config`を利用することもできます。
70
+
71
+ ```ruby
72
+
73
+ if defined?(AwsSsmEnv)
74
+ AWS.config({
75
+ access_key_id: 'ACCESS_KEY_ID',
76
+ secret_access_key: 'SECRET_ACCESS_KEY',
77
+ region: 'ap-northeast-1',
78
+ })
79
+ AwsSsmEnv.load(path: "/myservice/#{ENV['RAILS_ENV']}")
80
+ end
81
+ ```
82
+
83
+ 詳細はaws-sdkのドキュメントを参照してください。
84
+
85
+ ## Usage
86
+
87
+ `AwsSsmEnv#load`に渡すオプションの説明です。
88
+
89
+ ### decryption: [Boolean]
90
+
91
+ SecureStringのパラメータを復号化するかどうかを表すフラグ。
92
+ `true`を指定した場合は取得したSecureStringパラメータの値は復号化されている。
93
+ `false`の場合は暗号化されたまた環境変数値として設定される。
94
+ なお、このためのgemなのでデフォルトは`true`(復号化する)。
95
+
96
+ ### overwrite: [Boolean]
97
+
98
+ すでに設定されている環境変数を上書きするかどうかを指定する。
99
+ `true`を指定した場合、環境変数が設定されていても取得したパラメータ値で上書きする。
100
+ `false`を指定した場合はすでに設定されている環境変数を上書きしない。
101
+ デフォルトは`false`(上書きしない)。
102
+ なお、`AwsSsmEnv#load!`を実行した場合、このフラグは自動的に`true`になる。
103
+
104
+ ### client: [Aws::SSM::Client]
105
+
106
+ `Aws::SSM::Client`のインスタンスを指定する。
107
+ すでに生成済みのインスタンスがある場合にそれを設定するためのオプション。
108
+ 生成済みのインスタンスがない場合は`ssm_client_args`を利用する。
109
+
110
+ ### ssm_client_args: [Hash]
111
+
112
+ `Aws::SSM::Client`のコンストラクタに渡すハッシュを指定する。
113
+ 指定しなかった場合は引数なしで`Aws::SSM::Client.new`が呼ばれる。
114
+ 環境変数やEC2インスタンスプロファイルによる認証情報を利用する場合は不要。
115
+
116
+ ### fetch: [Symbol, AwsSsmEnv::Fetcher, Object]
117
+
118
+ パラメータ取得方法を指定する。
119
+ 指定可能な値は`:path`, `:begins_with`または`AwsSsmEnv::Fetcher`を実装したクラスのインスタンス、`each`メソッドを
120
+ 持ったクラスのインスタンスのいずれか。
121
+ 何も指定されていない場合は`:path`として扱われるが、後述の`begins_with`が指定されていた場合は自動的に`:begins_with`となる。
122
+
123
+ #### :fetch => :path
124
+
125
+ `:path`を指定した場合はパラメータ階層をパス指定で取得する`AwsSsmEnv::PathFetcher`が利用される。
126
+ この場合は後述の`path`引数が必須となる。また、後述の`recursive`引数を利用する。
127
+ この方法でパラメータを取得する場合は指定するパスに対して`ssm:GetParametersByPath`の権限が必要。
128
+ 以下、IAMポリシーの例を示す。
129
+
130
+ ```json
131
+ {
132
+ "Version": "2012-10-17",
133
+ "Statement": [
134
+ {
135
+ "Sid": "",
136
+ "Effect": "Allow",
137
+ "Action": "ssm:GetParametersByPath",
138
+ "Resource": "arn:aws:ssm:YOUR_REGION:YOUR_ACCOUNT_ID:parameter/YOUR_PATH"
139
+ }
140
+ ]
141
+ }
142
+ ```
143
+
144
+ #### :fetch => :begins_with
145
+
146
+ `:begins_with`を指定した場合はパラメータ名が指定した文字列から開始するパラメータを取得する`AwsSsmEnv::BeginsWithFetcher`が利用される。
147
+ この場合は後述の`begins_with`引数が必須となる。
148
+ この方法でパラメータを取得する場合は指定するパスに対して`ssm:DescribeParameters`および`ssm:GetParameters`の権限が必要。
149
+ 以下、IAMポリシーの例を示す。
150
+
151
+ ```json
152
+ {
153
+ "Version": "2012-10-17",
154
+ "Statement": [
155
+ {
156
+ "Sid": "",
157
+ "Effect": "Allow",
158
+ "Action": "ssm:DescribeParameters",
159
+ "Resource": "arn:aws:ssm:YOUR_REGION:YOUR_ACCOUNT_ID:parameter"
160
+ },
161
+ {
162
+ "Sid": "",
163
+ "Effect": "Allow",
164
+ "Action": "ssm:GetParameters",
165
+ "Resource": "arn:aws:ssm:YOUR_REGION:YOUR_ACCOUNT_ID:parameter/YOUR_PREFIX*"
166
+ }
167
+ ]
168
+ }
169
+ ```
170
+
171
+ #### other
172
+
173
+ `fetch`に`AwsSsmEnv::Fetcher`を実装したクラスのインスタンス、もしくは`each`メソッドを持つインスタンスを指定した場合はそのインスタンスをそのまま利用する。
174
+
175
+ ### naming: [Symbol, AwsSsmEnv::NamingStrategy, Object]
176
+
177
+ 環境変数名を導出方法を指定する。
178
+ 指定可能な値は`:basename`, `:snakecase`または`AwsSsmEnv::NamingStrategy`を実装したクラスのインスタンス、`parse_name`メソッドを持ったクラスのインスタンスのいずれか。
179
+ デフォルトは`:basename`。
180
+
181
+ #### :naming => :basename or :naming => nil
182
+
183
+ `naming`を指定しなかった場合、もしくは`:basename`を指定した場合はパラメータ階層の最後の階層を変数名とする`AwsSsmEnv::BasenameNamingStrategy`が利用される。
184
+ この場合、例えば`/myapp/production/DB_PASSWORD`というパラメータ名であれば`ENV['DB_PASSWORD']`にパラメータ値がインジェクションされる。
185
+
186
+ #### :naming => :snakecase
187
+
188
+ `:snakecase`を指定した場合はパラメータ名のスラッシュ区切りをアンダースコア区切りにした結果を大文字に変換して環境変数名とする`AwsSsmEnv::SnakeCaseNamingStrategy`が利用される。
189
+ この場合、例えば`/myapp/production/DB_PASSWORD`というパラメータ名であれば`ENV['MYAPP_PRODUCTION_DB_PASSWORD']`にパラメータ値がインジェクションされる。
190
+ 後述の`removed_prefix`引数で除外する先頭文字列を指定することができる。
191
+ また、後述の`delimiter`オプションでアンダースコアに変換する文字を指定できる。
192
+ 以下の例では`/myapp/production/db/password`というパラメータが`ENV['DB_PASSWORD']`にインジェクションされる。
193
+
194
+ ```ruby
195
+ AwsSsmEnv.load(naming: :snakecase, removed_prefix: '/myapp/production')
196
+ ```
197
+
198
+ #### other
199
+
200
+ `AwsSsmEnv::NamingStrategy`を実装したクラスのインスタンス、もしくは`parse_name`メソッドを持つ
201
+ インスタンスを指定した場合はそのインスタンスをそのまま利用する。
202
+
203
+ ### path: [String]
204
+
205
+ `fetch`に何も指定していない場合、もしくは`:path`を指定した場合は必須となる。
206
+ パラメータを取得するパス階層を指定する。
207
+ 下の例では`/myapp/web/production`直下のパラメータが取得される。
208
+
209
+ ```ruby
210
+ AwsSsmEnv.load(path: '/myapp/web/production')
211
+ ```
212
+
213
+ #### recursive: [Boolean]
214
+
215
+ `fetch`に何も指定していない場合、もしくは`:path`を指定した場合に利用する。
216
+ 指定したパス階層以下のパラメータをすべて取得する。
217
+ 下の例では`/myapp/web/production`以下すべてのパラメータが取得される。
218
+
219
+ ```ruby
220
+ AwsSsmEnv.load(path: '/myapp/web/production', recursive: true)
221
+ ```
222
+
223
+ ### begins_with: [String, Array<String>]
224
+
225
+ `fetch`に`:begins_with`を指定した場合は必須となる。
226
+ 取得するパラメータ名のプレフィクスを指定する。配列で複数指定することも可能(OR条件となる)。
227
+ 下の例では`myapp.web.production`で始まる名前のパラメータが取得される。
228
+
229
+ ```ruby
230
+ AwsSsmEnv.load(path: 'myapp.web.production')
231
+ ```
232
+
233
+ ### removed_prefix: [String]
234
+
235
+ `naming`に`:snakecase`を指定した場合に利用される。
236
+ 環境変数名から除外するパラメータ名のプレフィクスを指定する。
237
+ `:removed_prefix`が指定されておらず、`:begins_with`もしくは`:path`が指定されていた場合はそれを利用する。
238
+
239
+ ### delimiter: [String, Regexp]
240
+
241
+ `naming`に`:snakecase`を指定した場合に利用される。
242
+ アンダースコアに変換する文字列もしくは正規表現を指定する。
243
+ デフォルトはスラッシュ(`/`)。
244
+
245
+ ### fetch_size: [Integer]
246
+
247
+ 一度のAWS API実行で取得するパラメータ数を指定する。 `:path`指定の場合は最大値は`10`でデフォルトも`10`。
248
+ `:begins_with`指定の場合は最大値は`50`でデフォルトも`50`である。通常このパラメータを指定することはない。
249
+
250
+
251
+ ## Motivation
252
+
253
+ RailsアプリケーションをECSで起動する場合、環境変数を渡すのが面倒だったので作りました。
254
+
255
+ ## Security
256
+
257
+ シークレット情報を取得するための権限を付与しなければならないため、セキュリティ運用には十分な注意が必要です。
258
+
259
+ EC2インスタンスプロファイルが設定されていた場合、そのEC2上であればどのアカウントでもパラメータが見えるようになるため、
260
+ EC2インスタンスプロファイルとは別にIAMユーザを用意するなどセキュリティレベルを上げる工夫が必要です。
261
+
262
+ EC2にログインできるのが管理者のみであればファイルで持つのと大差ありません。
263
+
264
+ `AWS Fargate`であればコンテナ上でコマンドの実行はできないので、シークレット情報が見られることはありません。
265
+
266
+ ## License
267
+
268
+ Apache License 2.0
269
+
270
+ ## Contributors
271
+
272
+ - Ryohei Sonoda <[sonodar](https://github.com/sonodar)>