aws_pocketknife 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
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