aws_pocketknife 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +115 -0
- data/Rakefile +22 -0
- data/aws_pocketknife.gemspec +40 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/cert/ca-bundle.crt +3988 -0
- data/exe/pocketknife +5 -0
- data/lib/aws_pocketknife.rb +88 -0
- data/lib/aws_pocketknife/admin/policies/developer_dev_acc.json +10 -0
- data/lib/aws_pocketknife/admin/policies/developer_prd_acc.json +15 -0
- data/lib/aws_pocketknife/admin/policies/tc_devops.json.erb +207 -0
- data/lib/aws_pocketknife/admin/policies/tester_dev_acc.json +176 -0
- data/lib/aws_pocketknife/admin/policies/tester_prd_acc.json +176 -0
- data/lib/aws_pocketknife/admin/policies/web_front_end.json.erb +59 -0
- data/lib/aws_pocketknife/admin/trust_relationships/ec2.json +13 -0
- data/lib/aws_pocketknife/asg.rb +56 -0
- data/lib/aws_pocketknife/cli/ami.rb +24 -0
- data/lib/aws_pocketknife/cli/asg.rb +40 -0
- data/lib/aws_pocketknife/cli/eb.rb +49 -0
- data/lib/aws_pocketknife/cli/ec2.rb +61 -0
- data/lib/aws_pocketknife/cli/elb.rb +20 -0
- data/lib/aws_pocketknife/cli/iam.rb +31 -0
- data/lib/aws_pocketknife/cli/main.rb +34 -0
- data/lib/aws_pocketknife/cli/rds.rb +13 -0
- data/lib/aws_pocketknife/cli/rds_snapshot.rb +44 -0
- data/lib/aws_pocketknife/cli/route53.rb +56 -0
- data/lib/aws_pocketknife/cloudwatch_logs.rb +25 -0
- data/lib/aws_pocketknife/common/logging.rb +31 -0
- data/lib/aws_pocketknife/common/utils.rb +63 -0
- data/lib/aws_pocketknife/ec2.rb +308 -0
- data/lib/aws_pocketknife/elastic_beanstalk.rb +62 -0
- data/lib/aws_pocketknife/elb.rb +25 -0
- data/lib/aws_pocketknife/iam.rb +135 -0
- data/lib/aws_pocketknife/rds.rb +84 -0
- data/lib/aws_pocketknife/route53.rb +234 -0
- data/lib/aws_pocketknife/tasks/asg.rake +18 -0
- data/lib/aws_pocketknife/tasks/cloudwatch.rake +12 -0
- data/lib/aws_pocketknife/tasks/ec2.rake +57 -0
- data/lib/aws_pocketknife/tasks/elastic_beanstalk.rake +25 -0
- data/lib/aws_pocketknife/tasks/elb.rake +13 -0
- data/lib/aws_pocketknife/tasks/iam.rake +57 -0
- data/lib/aws_pocketknife/tasks/route53.rake +64 -0
- data/lib/aws_pocketknife/version.rb +3 -0
- 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,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
|