aws_pocketknife 0.1.7

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 (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +2 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +1 -0
  7. data/CODE_OF_CONDUCT.md +49 -0
  8. data/Gemfile +4 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +115 -0
  11. data/Rakefile +22 -0
  12. data/aws_pocketknife.gemspec +40 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +8 -0
  15. data/cert/ca-bundle.crt +3988 -0
  16. data/exe/pocketknife +5 -0
  17. data/lib/aws_pocketknife.rb +88 -0
  18. data/lib/aws_pocketknife/admin/policies/developer_dev_acc.json +10 -0
  19. data/lib/aws_pocketknife/admin/policies/developer_prd_acc.json +15 -0
  20. data/lib/aws_pocketknife/admin/policies/tc_devops.json.erb +207 -0
  21. data/lib/aws_pocketknife/admin/policies/tester_dev_acc.json +176 -0
  22. data/lib/aws_pocketknife/admin/policies/tester_prd_acc.json +176 -0
  23. data/lib/aws_pocketknife/admin/policies/web_front_end.json.erb +59 -0
  24. data/lib/aws_pocketknife/admin/trust_relationships/ec2.json +13 -0
  25. data/lib/aws_pocketknife/asg.rb +56 -0
  26. data/lib/aws_pocketknife/cli/ami.rb +24 -0
  27. data/lib/aws_pocketknife/cli/asg.rb +40 -0
  28. data/lib/aws_pocketknife/cli/eb.rb +49 -0
  29. data/lib/aws_pocketknife/cli/ec2.rb +61 -0
  30. data/lib/aws_pocketknife/cli/elb.rb +20 -0
  31. data/lib/aws_pocketknife/cli/iam.rb +31 -0
  32. data/lib/aws_pocketknife/cli/main.rb +34 -0
  33. data/lib/aws_pocketknife/cli/rds.rb +13 -0
  34. data/lib/aws_pocketknife/cli/rds_snapshot.rb +44 -0
  35. data/lib/aws_pocketknife/cli/route53.rb +56 -0
  36. data/lib/aws_pocketknife/cloudwatch_logs.rb +25 -0
  37. data/lib/aws_pocketknife/common/logging.rb +31 -0
  38. data/lib/aws_pocketknife/common/utils.rb +63 -0
  39. data/lib/aws_pocketknife/ec2.rb +308 -0
  40. data/lib/aws_pocketknife/elastic_beanstalk.rb +62 -0
  41. data/lib/aws_pocketknife/elb.rb +25 -0
  42. data/lib/aws_pocketknife/iam.rb +135 -0
  43. data/lib/aws_pocketknife/rds.rb +84 -0
  44. data/lib/aws_pocketknife/route53.rb +234 -0
  45. data/lib/aws_pocketknife/tasks/asg.rake +18 -0
  46. data/lib/aws_pocketknife/tasks/cloudwatch.rake +12 -0
  47. data/lib/aws_pocketknife/tasks/ec2.rake +57 -0
  48. data/lib/aws_pocketknife/tasks/elastic_beanstalk.rake +25 -0
  49. data/lib/aws_pocketknife/tasks/elb.rake +13 -0
  50. data/lib/aws_pocketknife/tasks/iam.rake +57 -0
  51. data/lib/aws_pocketknife/tasks/route53.rake +64 -0
  52. data/lib/aws_pocketknife/version.rb +3 -0
  53. metadata +284 -0
@@ -0,0 +1,176 @@
1
+ {
2
+ "Version": "2012-10-17",
3
+ "Statement": [
4
+ {
5
+ "Action": [
6
+ "acm:DescribeCertificate",
7
+ "acm:GetCertificate",
8
+ "acm:ListCertificates",
9
+ "appstream:Get*",
10
+ "autoscaling:Describe*",
11
+ "cloudformation:DescribeStackEvents",
12
+ "cloudformation:DescribeStackResource",
13
+ "cloudformation:DescribeStackResources",
14
+ "cloudformation:DescribeStacks",
15
+ "cloudformation:GetTemplate",
16
+ "cloudformation:List*",
17
+ "cloudfront:Get*",
18
+ "cloudfront:List*",
19
+ "cloudsearch:Describe*",
20
+ "cloudsearch:List*",
21
+ "cloudtrail:DescribeTrails",
22
+ "cloudtrail:GetTrailStatus",
23
+ "cloudwatch:Describe*",
24
+ "cloudwatch:Get*",
25
+ "cloudwatch:List*",
26
+ "codecommit:BatchGetRepositories",
27
+ "codecommit:Get*",
28
+ "codecommit:GitPull",
29
+ "codecommit:List*",
30
+ "codedeploy:Batch*",
31
+ "codedeploy:Get*",
32
+ "codedeploy:List*",
33
+ "config:Deliver*",
34
+ "config:Describe*",
35
+ "config:Get*",
36
+ "datapipeline:DescribeObjects",
37
+ "datapipeline:DescribePipelines",
38
+ "datapipeline:EvaluateExpression",
39
+ "datapipeline:GetPipelineDefinition",
40
+ "datapipeline:ListPipelines",
41
+ "datapipeline:QueryObjects",
42
+ "datapipeline:ValidatePipelineDefinition",
43
+ "directconnect:Describe*",
44
+ "ds:Check*",
45
+ "ds:Describe*",
46
+ "ds:Get*",
47
+ "ds:List*",
48
+ "ds:Verify*",
49
+ "dynamodb:BatchGetItem",
50
+ "dynamodb:DescribeTable",
51
+ "dynamodb:GetItem",
52
+ "dynamodb:ListTables",
53
+ "dynamodb:Query",
54
+ "dynamodb:Scan",
55
+ "ec2:Describe*",
56
+ "ec2:GetConsoleOutput",
57
+ "ecr:GetAuthorizationToken",
58
+ "ecr:BatchCheckLayerAvailability",
59
+ "ecr:GetDownloadUrlForLayer",
60
+ "ecr:GetManifest",
61
+ "ecr:DescribeRepositories",
62
+ "ecr:ListImages",
63
+ "ecr:BatchGetImage",
64
+ "ecs:Describe*",
65
+ "ecs:List*",
66
+ "elasticache:Describe*",
67
+ "elasticache:List*",
68
+ "elasticbeanstalk:Check*",
69
+ "elasticbeanstalk:Describe*",
70
+ "elasticbeanstalk:List*",
71
+ "elasticbeanstalk:RequestEnvironmentInfo",
72
+ "elasticbeanstalk:RetrieveEnvironmentInfo",
73
+ "elasticloadbalancing:Describe*",
74
+ "elasticmapreduce:Describe*",
75
+ "elasticmapreduce:List*",
76
+ "elastictranscoder:List*",
77
+ "elastictranscoder:Read*",
78
+ "es:DescribeElasticsearchDomain",
79
+ "es:DescribeElasticsearchDomains",
80
+ "es:DescribeElasticsearchDomainConfig",
81
+ "es:ListDomainNames",
82
+ "es:ListTags",
83
+ "es:ESHttpGet",
84
+ "es:ESHttpHead",
85
+ "events:DescribeRule",
86
+ "events:ListRuleNamesByTarget",
87
+ "events:ListRules",
88
+ "events:ListTargetsByRule",
89
+ "events:TestEventPattern",
90
+ "firehose:Describe*",
91
+ "firehose:List*",
92
+ "glacier:ListVaults",
93
+ "glacier:DescribeVault",
94
+ "glacier:GetDataRetrievalPolicy",
95
+ "glacier:GetVaultAccessPolicy",
96
+ "glacier:GetVaultLock",
97
+ "glacier:GetVaultNotifications",
98
+ "glacier:ListJobs",
99
+ "glacier:ListMultipartUploads",
100
+ "glacier:ListParts",
101
+ "glacier:ListTagsForVault",
102
+ "glacier:DescribeJob",
103
+ "glacier:GetJobOutput",
104
+ "iam:GenerateCredentialReport",
105
+ "iam:Get*",
106
+ "iam:List*",
107
+ "inspector:Describe*",
108
+ "inspector:Get*",
109
+ "inspector:List*",
110
+ "inspector:LocalizeText",
111
+ "inspector:PreviewAgentsForResourceGroup",
112
+ "iot:Describe*",
113
+ "iot:Get*",
114
+ "iot:List*",
115
+ "kinesis:Describe*",
116
+ "kinesis:Get*",
117
+ "kinesis:List*",
118
+ "kms:Describe*",
119
+ "kms:Get*",
120
+ "kms:List*",
121
+ "lambda:List*",
122
+ "lambda:Get*",
123
+ "logs:Describe*",
124
+ "logs:Get*",
125
+ "logs:TestMetricFilter",
126
+ "machinelearning:Describe*",
127
+ "machinelearning:Get*",
128
+ "mobilehub:GetProject",
129
+ "mobilehub:ListAvailableFeatures",
130
+ "mobilehub:ListAvailableRegions",
131
+ "mobilehub:ListProjects",
132
+ "mobilehub:ValidateProject",
133
+ "mobilehub:VerifyServiceRole",
134
+ "opsworks:Describe*",
135
+ "opsworks:Get*",
136
+ "rds:Describe*",
137
+ "rds:ListTagsForResource",
138
+ "redshift:Describe*",
139
+ "redshift:ViewQueriesInConsole",
140
+ "route53:Get*",
141
+ "route53:List*",
142
+ "route53domains:CheckDomainAvailability",
143
+ "route53domains:GetDomainDetail",
144
+ "route53domains:GetOperationDetail",
145
+ "route53domains:ListDomains",
146
+ "route53domains:ListOperations",
147
+ "route53domains:ListTagsForDomain",
148
+ "s3:Get*",
149
+ "s3:List*",
150
+ "sdb:GetAttributes",
151
+ "sdb:List*",
152
+ "sdb:Select*",
153
+ "ses:Get*",
154
+ "ses:List*",
155
+ "sns:Get*",
156
+ "sns:List*",
157
+ "sqs:GetQueueAttributes",
158
+ "sqs:ListQueues",
159
+ "sqs:ReceiveMessage",
160
+ "storagegateway:Describe*",
161
+ "storagegateway:List*",
162
+ "swf:Count*",
163
+ "swf:Describe*",
164
+ "swf:Get*",
165
+ "swf:List*",
166
+ "tag:Get*",
167
+ "trustedadvisor:Describe*",
168
+ "waf:Get*",
169
+ "waf:List*",
170
+ "workspaces:Describe*"
171
+ ],
172
+ "Effect": "Allow",
173
+ "Resource": "*"
174
+ }
175
+ ]
176
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "Version": "2012-10-17",
3
+ "Statement": [
4
+ {
5
+ "Sid": "Stmt1445469060000",
6
+ "Effect": "Allow",
7
+ "Action": [
8
+ "ec2:CreateTags",
9
+ "ec2:DescribeTags",
10
+ "ec2:RunInstances"
11
+ ],
12
+ "Resource": [
13
+ "*"
14
+ ]
15
+ },
16
+ {
17
+ "Sid": "Stmt1445469103000",
18
+ "Effect": "Allow",
19
+ "Action": [
20
+ "s3:GetObject"
21
+ ],
22
+ "Resource": [
23
+ <% buckets.first(buckets.length-1).each do |bucket| %>
24
+ "<%= bucket %>/*",
25
+ <% end %>
26
+ "<%= buckets.reverse[0] %>"
27
+ ]
28
+ },
29
+ {
30
+ "Effect": "Allow",
31
+ "Action": [
32
+ "s3:PutObject",
33
+ "s3:ListBucket"
34
+ ],
35
+ "Resource": [
36
+ <% buckets.first(buckets.length-1).each do |bucket| %>
37
+ "<%= bucket %>/logs",
38
+ "<%= bucket %>/logs/*",
39
+ <% end %>
40
+ "<%= buckets.reverse[0] %>"
41
+ ]
42
+ },
43
+ {
44
+ "Sid": "AllowAccessToSSM",
45
+ "Effect": "Allow",
46
+ "Action": [
47
+ "cloudwatch:PutMetricData",
48
+ "logs:CreateLogGroup",
49
+ "logs:CreateLogStream",
50
+ "logs:DescribeLogGroups",
51
+ "logs:DescribeLogStreams",
52
+ "logs:PutLogEvents"
53
+ ],
54
+ "Resource": [
55
+ "*"
56
+ ]
57
+ }
58
+ ]
59
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "Version": "2012-10-17",
3
+ "Statement": [
4
+ {
5
+ "Sid": "",
6
+ "Effect": "Allow",
7
+ "Principal": {
8
+ "Service": "ec2.amazonaws.com"
9
+ },
10
+ "Action": "sts:AssumeRole"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,56 @@
1
+ require 'aws_pocketknife'
2
+ require 'base64'
3
+ require 'openssl'
4
+
5
+ module AwsPocketknife
6
+ module Asg
7
+
8
+ class << self
9
+ include AwsPocketknife::Common::Utils
10
+
11
+ def describe_asg_by_name(name: "")
12
+ asgs = []
13
+ asg_list = name.split(";")
14
+ resp = asg_client.describe_auto_scaling_groups({
15
+ auto_scaling_group_names: asg_list,
16
+ })
17
+ resp.auto_scaling_groups.each do |asg|
18
+ asgs << asg
19
+ end
20
+ asgs
21
+ end
22
+
23
+ def list(max_records: 100)
24
+ asgs = []
25
+ resp = asg_client.describe_auto_scaling_groups({
26
+ max_records: max_records,
27
+ })
28
+ asgs << resp.auto_scaling_groups
29
+ next_token = resp.next_token
30
+ while true
31
+ break if next_token.nil? or next_token.empty?
32
+ resp = get_asgs(next_token: next_token, max_records: max_records)
33
+ asgs << resp.auto_scaling_groups
34
+ next_token = resp.next_token
35
+
36
+ end
37
+
38
+ asgs.flatten!
39
+
40
+ end
41
+
42
+ private
43
+
44
+ def get_asgs(next_token: "", max_records: 100)
45
+
46
+ asg_client.describe_auto_scaling_groups({
47
+ max_records: max_records,
48
+ next_token: next_token,
49
+ })
50
+
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,24 @@
1
+ require "thor"
2
+ require "aws_pocketknife"
3
+
4
+ module AwsPocketknife
5
+ module Cli
6
+ class Ami < Thor
7
+
8
+ desc "clean AMI_NAME_PATTERN DAYS --dry_run", "Given a name or filter (i.e, test-*), this command will delete all matched AMIs (and associated snapshots) with creation time lower than DAYS."
9
+ option :dry_run, :type => :boolean, :default => true, :desc => 'just show images that would be deleted'
10
+ def clean(ami_name_pattern, days)
11
+ dry_run = options.fetch("dry_run", true)
12
+ AwsPocketknife::Ec2.clean_ami ami_name_pattern: ami_name_pattern,
13
+ days: days,
14
+ dry_run: dry_run
15
+ end
16
+
17
+ desc "share IMAGE_ID ACCOUNT_ID", "share the IMAGE_ID with the specified ACCOUNT_ID"
18
+ def share(image_id, account_id)
19
+ AwsPocketknife::Ec2.share_ami(image_id: image_id, user_id: account_id)
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ require "thor"
2
+ require "aws_pocketknife"
3
+
4
+ module AwsPocketknife
5
+ module Cli
6
+ class Asg < Thor
7
+
8
+ desc "list", "list all autoscaling groups"
9
+ def list
10
+ asgs = AwsPocketknife::Asg.list
11
+ print_asg(asgs: asgs)
12
+ end
13
+
14
+ desc "desc ASG_NAME", "describe autoscaling group name"
15
+ def desc(asg_name)
16
+ asgs = AwsPocketknife::Asg.describe_asg_by_name(name: asg_name)
17
+ print_asg(asgs: asgs)
18
+ end
19
+
20
+ private
21
+
22
+ def print_asg(asgs: [])
23
+ headers = ["name", "min size", "max size", "desired capacity", "instances", "elb"]
24
+ data = []
25
+ if asgs.length > 0
26
+ asgs.each do |asg|
27
+ instances = []
28
+ asg.instances.map { |instance| instances << instance.instance_id }
29
+ data << [asg.auto_scaling_group_name, asg.min_size, asg.max_size,
30
+ asg.desired_capacity, instances.join(", "), asg.load_balancer_names.join(", ")]
31
+ end
32
+ AwsPocketknife::Asg.pretty_table(headers: headers, data: data)
33
+ else
34
+ puts "No asg(s) found for name #{args[:name]}"
35
+ end
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,49 @@
1
+ require "thor"
2
+ require "aws_pocketknife"
3
+
4
+ module AwsPocketknife
5
+ module Cli
6
+ class Eb < Thor
7
+
8
+ desc "list", "list environments"
9
+ def list
10
+ environments = AwsPocketknife::ElasticBeanstalk.describe_environment
11
+ headers = [ 'App Name', 'Env Name', 'cname', 'Updated', 'Version', 'Health']
12
+ data = []
13
+ environments.each do |e|
14
+ data << [e.application_name, e.environment_name, e.cname, e.date_updated, e.version_label, e.health]
15
+ end
16
+ AwsPocketknife::ElasticBeanstalk.pretty_table(headers: headers, data: data)
17
+ end
18
+
19
+ desc "desc ENVIRONMENT_NAME", "describe environment name"
20
+ def desc(environment_name)
21
+ environment = AwsPocketknife::ElasticBeanstalk.describe_environment_resources(environment_name: environment_name)
22
+ unless environment.nil?
23
+ AwsPocketknife::ElasticBeanstalk.nice_print(object: environment.to_h)
24
+ else
25
+ puts "#{environment_name} not found"
26
+ end
27
+ end
28
+
29
+ desc "vars NAME", "list environment variables for the specified elastic beanstalk environment name"
30
+ def vars(environment_name)
31
+ variables = AwsPocketknife::ElasticBeanstalk.list_environment_variables(environment_name: environment_name)
32
+ headers = [ 'Name', 'Value']
33
+ data = []
34
+ variables.each do |v|
35
+ v_temp = v.split("=")
36
+ name = v_temp[0]
37
+
38
+ # remove first element (headers) from array
39
+ v_temp.shift
40
+ value = v_temp.join
41
+ data << [name, value]
42
+ end
43
+ puts "Environment: #{environment_name}"
44
+ AwsPocketknife::ElasticBeanstalk.pretty_table(headers: headers, data: data)
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,61 @@
1
+ require "thor"
2
+ require "aws_pocketknife"
3
+
4
+ module AwsPocketknife
5
+ module Cli
6
+ class Ec2 < Thor
7
+
8
+ desc "find_by_name NAME", "find instances by name. (You can filter by adding *) "
9
+ def find_by_name(name)
10
+
11
+ instances = AwsPocketknife::Ec2.find_by_name(name: name)
12
+ headers = ["name", "id", "image", "state", "private ip", "public ip", "type", "key name", "launch time"]
13
+ data = []
14
+ if instances.length > 0
15
+ instances.each do |instance|
16
+ name = AwsPocketknife::Ec2.get_tag_value(tags: instance.tags, tag_key: "Name")
17
+ data << [name, instance.instance_id, instance.image_id, instance.state.name,
18
+ instance.private_ip_address, instance.public_ip_address, instance.instance_type,
19
+ instance.key_name, instance.launch_time]
20
+ end
21
+ AwsPocketknife::Ec2.pretty_table(headers: headers, data: data)
22
+ else
23
+ puts "No instance(s) found for name #{name}"
24
+ end
25
+
26
+ end
27
+
28
+ desc "find_by_id INSTANCE_ID", "find instances by id."
29
+ def find_by_id(instance_id)
30
+ instance = AwsPocketknife::Ec2.find_by_id(instance_id: instance_id)
31
+ if instance.nil?
32
+ puts "Instance #{instance_id} not found"
33
+ else
34
+ AwsPocketknife::Ec2.nice_print(object: instance.to_h)
35
+ end
36
+ end
37
+
38
+ desc "get_windows_password INSTANCE_ID", "get windows password."
39
+ def get_windows_password(instance_id)
40
+ instance = AwsPocketknife::Ec2.get_windows_password(instance_id: instance_id)
41
+ headers = ["instance id", "password", "private ip", "public ip"]
42
+ data = [[instance.instance_id,
43
+ instance.password,
44
+ instance.private_ip_address,
45
+ instance.public_ip_address]]
46
+ AwsPocketknife::Ec2.pretty_table(headers: headers, data: data)
47
+ end
48
+
49
+ desc "stop INSTANCE_ID", "stop ec2 instance"
50
+ def stop(instance_id)
51
+ AwsPocketknife::Ec2.stop_instance_by_id(instance_id)
52
+ end
53
+
54
+ desc "start INSTANCE_ID", "start ec2 instance"
55
+ def start(instance_id)
56
+ AwsPocketknife::Ec2.start_instance_by_id(instance_id)
57
+ end
58
+
59
+ end
60
+ end
61
+ end