Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/boto/iam/connection.py @ 0:d30785e31577 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:18:57 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:d30785e31577 |
---|---|
1 # Copyright (c) 2010-2011 Mitch Garnaat http://garnaat.org/ | |
2 # Copyright (c) 2010-2011, Eucalyptus Systems, Inc. | |
3 # | |
4 # Permission is hereby granted, free of charge, to any person obtaining a | |
5 # copy of this software and associated documentation files (the | |
6 # "Software"), to deal in the Software without restriction, including | |
7 # without limitation the rights to use, copy, modify, merge, publish, dis- | |
8 # tribute, sublicense, and/or sell copies of the Software, and to permit | |
9 # persons to whom the Software is furnished to do so, subject to the fol- | |
10 # lowing conditions: | |
11 # | |
12 # The above copyright notice and this permission notice shall be included | |
13 # in all copies or substantial portions of the Software. | |
14 # | |
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
16 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- | |
17 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT | |
18 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
19 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |
21 # IN THE SOFTWARE. | |
22 import boto | |
23 import boto.jsonresponse | |
24 from boto.compat import json, six | |
25 from boto.resultset import ResultSet | |
26 from boto.iam.summarymap import SummaryMap | |
27 from boto.connection import AWSQueryConnection | |
28 | |
29 DEFAULT_POLICY_DOCUMENTS = { | |
30 'default': { | |
31 'Statement': [ | |
32 { | |
33 'Principal': { | |
34 'Service': ['ec2.amazonaws.com'] | |
35 }, | |
36 'Effect': 'Allow', | |
37 'Action': ['sts:AssumeRole'] | |
38 } | |
39 ] | |
40 }, | |
41 'amazonaws.com.cn': { | |
42 'Statement': [ | |
43 { | |
44 'Principal': { | |
45 'Service': ['ec2.amazonaws.com.cn'] | |
46 }, | |
47 'Effect': 'Allow', | |
48 'Action': ['sts:AssumeRole'] | |
49 } | |
50 ] | |
51 }, | |
52 } | |
53 # For backward-compatibility, we'll preserve this here. | |
54 ASSUME_ROLE_POLICY_DOCUMENT = json.dumps(DEFAULT_POLICY_DOCUMENTS['default']) | |
55 | |
56 | |
57 class IAMConnection(AWSQueryConnection): | |
58 | |
59 APIVersion = '2010-05-08' | |
60 | |
61 def __init__(self, aws_access_key_id=None, aws_secret_access_key=None, | |
62 is_secure=True, port=None, proxy=None, proxy_port=None, | |
63 proxy_user=None, proxy_pass=None, host='iam.amazonaws.com', | |
64 debug=0, https_connection_factory=None, path='/', | |
65 security_token=None, validate_certs=True, profile_name=None): | |
66 super(IAMConnection, self).__init__(aws_access_key_id, | |
67 aws_secret_access_key, | |
68 is_secure, port, proxy, | |
69 proxy_port, proxy_user, proxy_pass, | |
70 host, debug, https_connection_factory, | |
71 path, security_token, | |
72 validate_certs=validate_certs, | |
73 profile_name=profile_name) | |
74 | |
75 def _required_auth_capability(self): | |
76 return ['hmac-v4'] | |
77 | |
78 def get_response(self, action, params, path='/', parent=None, | |
79 verb='POST', list_marker='Set'): | |
80 """ | |
81 Utility method to handle calls to IAM and parsing of responses. | |
82 """ | |
83 if not parent: | |
84 parent = self | |
85 response = self.make_request(action, params, path, verb) | |
86 body = response.read() | |
87 boto.log.debug(body) | |
88 if response.status == 200: | |
89 if body: | |
90 e = boto.jsonresponse.Element(list_marker=list_marker, | |
91 pythonize_name=True) | |
92 h = boto.jsonresponse.XmlHandler(e, parent) | |
93 h.parse(body) | |
94 return e | |
95 else: | |
96 # Support empty responses, e.g. deleting a SAML provider | |
97 # according to the official documentation. | |
98 return {} | |
99 else: | |
100 boto.log.error('%s %s' % (response.status, response.reason)) | |
101 boto.log.error('%s' % body) | |
102 raise self.ResponseError(response.status, response.reason, body) | |
103 | |
104 # | |
105 # Group methods | |
106 # | |
107 | |
108 def get_all_groups(self, path_prefix='/', marker=None, max_items=None): | |
109 """ | |
110 List the groups that have the specified path prefix. | |
111 | |
112 :type path_prefix: string | |
113 :param path_prefix: If provided, only groups whose paths match | |
114 the provided prefix will be returned. | |
115 | |
116 :type marker: string | |
117 :param marker: Use this only when paginating results and only | |
118 in follow-up request after you've received a response | |
119 where the results are truncated. Set this to the value of | |
120 the Marker element in the response you just received. | |
121 | |
122 :type max_items: int | |
123 :param max_items: Use this only when paginating results to indicate | |
124 the maximum number of groups you want in the response. | |
125 """ | |
126 params = {} | |
127 if path_prefix: | |
128 params['PathPrefix'] = path_prefix | |
129 if marker: | |
130 params['Marker'] = marker | |
131 if max_items: | |
132 params['MaxItems'] = max_items | |
133 return self.get_response('ListGroups', params, | |
134 list_marker='Groups') | |
135 | |
136 def get_group(self, group_name, marker=None, max_items=None): | |
137 """ | |
138 Return a list of users that are in the specified group. | |
139 | |
140 :type group_name: string | |
141 :param group_name: The name of the group whose information should | |
142 be returned. | |
143 :type marker: string | |
144 :param marker: Use this only when paginating results and only | |
145 in follow-up request after you've received a response | |
146 where the results are truncated. Set this to the value of | |
147 the Marker element in the response you just received. | |
148 | |
149 :type max_items: int | |
150 :param max_items: Use this only when paginating results to indicate | |
151 the maximum number of groups you want in the response. | |
152 """ | |
153 params = {'GroupName': group_name} | |
154 if marker: | |
155 params['Marker'] = marker | |
156 if max_items: | |
157 params['MaxItems'] = max_items | |
158 return self.get_response('GetGroup', params, list_marker='Users') | |
159 | |
160 def create_group(self, group_name, path='/'): | |
161 """ | |
162 Create a group. | |
163 | |
164 :type group_name: string | |
165 :param group_name: The name of the new group | |
166 | |
167 :type path: string | |
168 :param path: The path to the group (Optional). Defaults to /. | |
169 | |
170 """ | |
171 params = {'GroupName': group_name, | |
172 'Path': path} | |
173 return self.get_response('CreateGroup', params) | |
174 | |
175 def delete_group(self, group_name): | |
176 """ | |
177 Delete a group. The group must not contain any Users or | |
178 have any attached policies | |
179 | |
180 :type group_name: string | |
181 :param group_name: The name of the group to delete. | |
182 | |
183 """ | |
184 params = {'GroupName': group_name} | |
185 return self.get_response('DeleteGroup', params) | |
186 | |
187 def update_group(self, group_name, new_group_name=None, new_path=None): | |
188 """ | |
189 Updates name and/or path of the specified group. | |
190 | |
191 :type group_name: string | |
192 :param group_name: The name of the new group | |
193 | |
194 :type new_group_name: string | |
195 :param new_group_name: If provided, the name of the group will be | |
196 changed to this name. | |
197 | |
198 :type new_path: string | |
199 :param new_path: If provided, the path of the group will be | |
200 changed to this path. | |
201 | |
202 """ | |
203 params = {'GroupName': group_name} | |
204 if new_group_name: | |
205 params['NewGroupName'] = new_group_name | |
206 if new_path: | |
207 params['NewPath'] = new_path | |
208 return self.get_response('UpdateGroup', params) | |
209 | |
210 def add_user_to_group(self, group_name, user_name): | |
211 """ | |
212 Add a user to a group | |
213 | |
214 :type group_name: string | |
215 :param group_name: The name of the group | |
216 | |
217 :type user_name: string | |
218 :param user_name: The to be added to the group. | |
219 | |
220 """ | |
221 params = {'GroupName': group_name, | |
222 'UserName': user_name} | |
223 return self.get_response('AddUserToGroup', params) | |
224 | |
225 def remove_user_from_group(self, group_name, user_name): | |
226 """ | |
227 Remove a user from a group. | |
228 | |
229 :type group_name: string | |
230 :param group_name: The name of the group | |
231 | |
232 :type user_name: string | |
233 :param user_name: The user to remove from the group. | |
234 | |
235 """ | |
236 params = {'GroupName': group_name, | |
237 'UserName': user_name} | |
238 return self.get_response('RemoveUserFromGroup', params) | |
239 | |
240 def put_group_policy(self, group_name, policy_name, policy_json): | |
241 """ | |
242 Adds or updates the specified policy document for the specified group. | |
243 | |
244 :type group_name: string | |
245 :param group_name: The name of the group the policy is associated with. | |
246 | |
247 :type policy_name: string | |
248 :param policy_name: The policy document to get. | |
249 | |
250 :type policy_json: string | |
251 :param policy_json: The policy document. | |
252 | |
253 """ | |
254 params = {'GroupName': group_name, | |
255 'PolicyName': policy_name, | |
256 'PolicyDocument': policy_json} | |
257 return self.get_response('PutGroupPolicy', params, verb='POST') | |
258 | |
259 def get_all_group_policies(self, group_name, marker=None, max_items=None): | |
260 """ | |
261 List the names of the policies associated with the specified group. | |
262 | |
263 :type group_name: string | |
264 :param group_name: The name of the group the policy is associated with. | |
265 | |
266 :type marker: string | |
267 :param marker: Use this only when paginating results and only | |
268 in follow-up request after you've received a response | |
269 where the results are truncated. Set this to the value of | |
270 the Marker element in the response you just received. | |
271 | |
272 :type max_items: int | |
273 :param max_items: Use this only when paginating results to indicate | |
274 the maximum number of groups you want in the response. | |
275 """ | |
276 params = {'GroupName': group_name} | |
277 if marker: | |
278 params['Marker'] = marker | |
279 if max_items: | |
280 params['MaxItems'] = max_items | |
281 return self.get_response('ListGroupPolicies', params, | |
282 list_marker='PolicyNames') | |
283 | |
284 def get_group_policy(self, group_name, policy_name): | |
285 """ | |
286 Retrieves the specified policy document for the specified group. | |
287 | |
288 :type group_name: string | |
289 :param group_name: The name of the group the policy is associated with. | |
290 | |
291 :type policy_name: string | |
292 :param policy_name: The policy document to get. | |
293 | |
294 """ | |
295 params = {'GroupName': group_name, | |
296 'PolicyName': policy_name} | |
297 return self.get_response('GetGroupPolicy', params, verb='POST') | |
298 | |
299 def delete_group_policy(self, group_name, policy_name): | |
300 """ | |
301 Deletes the specified policy document for the specified group. | |
302 | |
303 :type group_name: string | |
304 :param group_name: The name of the group the policy is associated with. | |
305 | |
306 :type policy_name: string | |
307 :param policy_name: The policy document to delete. | |
308 | |
309 """ | |
310 params = {'GroupName': group_name, | |
311 'PolicyName': policy_name} | |
312 return self.get_response('DeleteGroupPolicy', params, verb='POST') | |
313 | |
314 def get_all_users(self, path_prefix='/', marker=None, max_items=None): | |
315 """ | |
316 List the users that have the specified path prefix. | |
317 | |
318 :type path_prefix: string | |
319 :param path_prefix: If provided, only users whose paths match | |
320 the provided prefix will be returned. | |
321 | |
322 :type marker: string | |
323 :param marker: Use this only when paginating results and only | |
324 in follow-up request after you've received a response | |
325 where the results are truncated. Set this to the value of | |
326 the Marker element in the response you just received. | |
327 | |
328 :type max_items: int | |
329 :param max_items: Use this only when paginating results to indicate | |
330 the maximum number of groups you want in the response. | |
331 """ | |
332 params = {'PathPrefix': path_prefix} | |
333 if marker: | |
334 params['Marker'] = marker | |
335 if max_items: | |
336 params['MaxItems'] = max_items | |
337 return self.get_response('ListUsers', params, list_marker='Users') | |
338 | |
339 # | |
340 # User methods | |
341 # | |
342 | |
343 def create_user(self, user_name, path='/'): | |
344 """ | |
345 Create a user. | |
346 | |
347 :type user_name: string | |
348 :param user_name: The name of the new user | |
349 | |
350 :type path: string | |
351 :param path: The path in which the user will be created. | |
352 Defaults to /. | |
353 | |
354 """ | |
355 params = {'UserName': user_name, | |
356 'Path': path} | |
357 return self.get_response('CreateUser', params) | |
358 | |
359 def delete_user(self, user_name): | |
360 """ | |
361 Delete a user including the user's path, GUID and ARN. | |
362 | |
363 If the user_name is not specified, the user_name is determined | |
364 implicitly based on the AWS Access Key ID used to sign the request. | |
365 | |
366 :type user_name: string | |
367 :param user_name: The name of the user to delete. | |
368 | |
369 """ | |
370 params = {'UserName': user_name} | |
371 return self.get_response('DeleteUser', params) | |
372 | |
373 def get_user(self, user_name=None): | |
374 """ | |
375 Retrieve information about the specified user. | |
376 | |
377 If the user_name is not specified, the user_name is determined | |
378 implicitly based on the AWS Access Key ID used to sign the request. | |
379 | |
380 :type user_name: string | |
381 :param user_name: The name of the user to retrieve. | |
382 If not specified, defaults to user making request. | |
383 """ | |
384 params = {} | |
385 if user_name: | |
386 params['UserName'] = user_name | |
387 return self.get_response('GetUser', params) | |
388 | |
389 def update_user(self, user_name, new_user_name=None, new_path=None): | |
390 """ | |
391 Updates name and/or path of the specified user. | |
392 | |
393 :type user_name: string | |
394 :param user_name: The name of the user | |
395 | |
396 :type new_user_name: string | |
397 :param new_user_name: If provided, the username of the user will be | |
398 changed to this username. | |
399 | |
400 :type new_path: string | |
401 :param new_path: If provided, the path of the user will be | |
402 changed to this path. | |
403 | |
404 """ | |
405 params = {'UserName': user_name} | |
406 if new_user_name: | |
407 params['NewUserName'] = new_user_name | |
408 if new_path: | |
409 params['NewPath'] = new_path | |
410 return self.get_response('UpdateUser', params) | |
411 | |
412 def get_all_user_policies(self, user_name, marker=None, max_items=None): | |
413 """ | |
414 List the names of the policies associated with the specified user. | |
415 | |
416 :type user_name: string | |
417 :param user_name: The name of the user the policy is associated with. | |
418 | |
419 :type marker: string | |
420 :param marker: Use this only when paginating results and only | |
421 in follow-up request after you've received a response | |
422 where the results are truncated. Set this to the value of | |
423 the Marker element in the response you just received. | |
424 | |
425 :type max_items: int | |
426 :param max_items: Use this only when paginating results to indicate | |
427 the maximum number of groups you want in the response. | |
428 """ | |
429 params = {'UserName': user_name} | |
430 if marker: | |
431 params['Marker'] = marker | |
432 if max_items: | |
433 params['MaxItems'] = max_items | |
434 return self.get_response('ListUserPolicies', params, | |
435 list_marker='PolicyNames') | |
436 | |
437 def put_user_policy(self, user_name, policy_name, policy_json): | |
438 """ | |
439 Adds or updates the specified policy document for the specified user. | |
440 | |
441 :type user_name: string | |
442 :param user_name: The name of the user the policy is associated with. | |
443 | |
444 :type policy_name: string | |
445 :param policy_name: The policy document to get. | |
446 | |
447 :type policy_json: string | |
448 :param policy_json: The policy document. | |
449 | |
450 """ | |
451 params = {'UserName': user_name, | |
452 'PolicyName': policy_name, | |
453 'PolicyDocument': policy_json} | |
454 return self.get_response('PutUserPolicy', params, verb='POST') | |
455 | |
456 def get_user_policy(self, user_name, policy_name): | |
457 """ | |
458 Retrieves the specified policy document for the specified user. | |
459 | |
460 :type user_name: string | |
461 :param user_name: The name of the user the policy is associated with. | |
462 | |
463 :type policy_name: string | |
464 :param policy_name: The policy document to get. | |
465 | |
466 """ | |
467 params = {'UserName': user_name, | |
468 'PolicyName': policy_name} | |
469 return self.get_response('GetUserPolicy', params, verb='POST') | |
470 | |
471 def delete_user_policy(self, user_name, policy_name): | |
472 """ | |
473 Deletes the specified policy document for the specified user. | |
474 | |
475 :type user_name: string | |
476 :param user_name: The name of the user the policy is associated with. | |
477 | |
478 :type policy_name: string | |
479 :param policy_name: The policy document to delete. | |
480 | |
481 """ | |
482 params = {'UserName': user_name, | |
483 'PolicyName': policy_name} | |
484 return self.get_response('DeleteUserPolicy', params, verb='POST') | |
485 | |
486 def get_groups_for_user(self, user_name, marker=None, max_items=None): | |
487 """ | |
488 List the groups that a specified user belongs to. | |
489 | |
490 :type user_name: string | |
491 :param user_name: The name of the user to list groups for. | |
492 | |
493 :type marker: string | |
494 :param marker: Use this only when paginating results and only | |
495 in follow-up request after you've received a response | |
496 where the results are truncated. Set this to the value of | |
497 the Marker element in the response you just received. | |
498 | |
499 :type max_items: int | |
500 :param max_items: Use this only when paginating results to indicate | |
501 the maximum number of groups you want in the response. | |
502 """ | |
503 params = {'UserName': user_name} | |
504 if marker: | |
505 params['Marker'] = marker | |
506 if max_items: | |
507 params['MaxItems'] = max_items | |
508 return self.get_response('ListGroupsForUser', params, | |
509 list_marker='Groups') | |
510 | |
511 # | |
512 # Access Keys | |
513 # | |
514 | |
515 def get_all_access_keys(self, user_name, marker=None, max_items=None): | |
516 """ | |
517 Get all access keys associated with an account. | |
518 | |
519 :type user_name: string | |
520 :param user_name: The username of the user | |
521 | |
522 :type marker: string | |
523 :param marker: Use this only when paginating results and only | |
524 in follow-up request after you've received a response | |
525 where the results are truncated. Set this to the value of | |
526 the Marker element in the response you just received. | |
527 | |
528 :type max_items: int | |
529 :param max_items: Use this only when paginating results to indicate | |
530 the maximum number of groups you want in the response. | |
531 """ | |
532 params = {'UserName': user_name} | |
533 if marker: | |
534 params['Marker'] = marker | |
535 if max_items: | |
536 params['MaxItems'] = max_items | |
537 return self.get_response('ListAccessKeys', params, | |
538 list_marker='AccessKeyMetadata') | |
539 | |
540 def create_access_key(self, user_name=None): | |
541 """ | |
542 Create a new AWS Secret Access Key and corresponding AWS Access Key ID | |
543 for the specified user. The default status for new keys is Active | |
544 | |
545 If the user_name is not specified, the user_name is determined | |
546 implicitly based on the AWS Access Key ID used to sign the request. | |
547 | |
548 :type user_name: string | |
549 :param user_name: The username of the user | |
550 | |
551 """ | |
552 params = {'UserName': user_name} | |
553 return self.get_response('CreateAccessKey', params) | |
554 | |
555 def update_access_key(self, access_key_id, status, user_name=None): | |
556 """ | |
557 Changes the status of the specified access key from Active to Inactive | |
558 or vice versa. This action can be used to disable a user's key as | |
559 part of a key rotation workflow. | |
560 | |
561 If the user_name is not specified, the user_name is determined | |
562 implicitly based on the AWS Access Key ID used to sign the request. | |
563 | |
564 :type access_key_id: string | |
565 :param access_key_id: The ID of the access key. | |
566 | |
567 :type status: string | |
568 :param status: Either Active or Inactive. | |
569 | |
570 :type user_name: string | |
571 :param user_name: The username of user (optional). | |
572 | |
573 """ | |
574 params = {'AccessKeyId': access_key_id, | |
575 'Status': status} | |
576 if user_name: | |
577 params['UserName'] = user_name | |
578 return self.get_response('UpdateAccessKey', params) | |
579 | |
580 def delete_access_key(self, access_key_id, user_name=None): | |
581 """ | |
582 Delete an access key associated with a user. | |
583 | |
584 If the user_name is not specified, it is determined implicitly based | |
585 on the AWS Access Key ID used to sign the request. | |
586 | |
587 :type access_key_id: string | |
588 :param access_key_id: The ID of the access key to be deleted. | |
589 | |
590 :type user_name: string | |
591 :param user_name: The username of the user | |
592 | |
593 """ | |
594 params = {'AccessKeyId': access_key_id} | |
595 if user_name: | |
596 params['UserName'] = user_name | |
597 return self.get_response('DeleteAccessKey', params) | |
598 | |
599 # | |
600 # Signing Certificates | |
601 # | |
602 | |
603 def get_all_signing_certs(self, marker=None, max_items=None, | |
604 user_name=None): | |
605 """ | |
606 Get all signing certificates associated with an account. | |
607 | |
608 If the user_name is not specified, it is determined implicitly based | |
609 on the AWS Access Key ID used to sign the request. | |
610 | |
611 :type marker: string | |
612 :param marker: Use this only when paginating results and only | |
613 in follow-up request after you've received a response | |
614 where the results are truncated. Set this to the value of | |
615 the Marker element in the response you just received. | |
616 | |
617 :type max_items: int | |
618 :param max_items: Use this only when paginating results to indicate | |
619 the maximum number of groups you want in the response. | |
620 | |
621 :type user_name: string | |
622 :param user_name: The username of the user | |
623 | |
624 """ | |
625 params = {} | |
626 if marker: | |
627 params['Marker'] = marker | |
628 if max_items: | |
629 params['MaxItems'] = max_items | |
630 if user_name: | |
631 params['UserName'] = user_name | |
632 return self.get_response('ListSigningCertificates', | |
633 params, list_marker='Certificates') | |
634 | |
635 def update_signing_cert(self, cert_id, status, user_name=None): | |
636 """ | |
637 Change the status of the specified signing certificate from | |
638 Active to Inactive or vice versa. | |
639 | |
640 If the user_name is not specified, it is determined implicitly based | |
641 on the AWS Access Key ID used to sign the request. | |
642 | |
643 :type cert_id: string | |
644 :param cert_id: The ID of the signing certificate | |
645 | |
646 :type status: string | |
647 :param status: Either Active or Inactive. | |
648 | |
649 :type user_name: string | |
650 :param user_name: The username of the user | |
651 """ | |
652 params = {'CertificateId': cert_id, | |
653 'Status': status} | |
654 if user_name: | |
655 params['UserName'] = user_name | |
656 return self.get_response('UpdateSigningCertificate', params) | |
657 | |
658 def upload_signing_cert(self, cert_body, user_name=None): | |
659 """ | |
660 Uploads an X.509 signing certificate and associates it with | |
661 the specified user. | |
662 | |
663 If the user_name is not specified, it is determined implicitly based | |
664 on the AWS Access Key ID used to sign the request. | |
665 | |
666 :type cert_body: string | |
667 :param cert_body: The body of the signing certificate. | |
668 | |
669 :type user_name: string | |
670 :param user_name: The username of the user | |
671 | |
672 """ | |
673 params = {'CertificateBody': cert_body} | |
674 if user_name: | |
675 params['UserName'] = user_name | |
676 return self.get_response('UploadSigningCertificate', params, | |
677 verb='POST') | |
678 | |
679 def delete_signing_cert(self, cert_id, user_name=None): | |
680 """ | |
681 Delete a signing certificate associated with a user. | |
682 | |
683 If the user_name is not specified, it is determined implicitly based | |
684 on the AWS Access Key ID used to sign the request. | |
685 | |
686 :type user_name: string | |
687 :param user_name: The username of the user | |
688 | |
689 :type cert_id: string | |
690 :param cert_id: The ID of the certificate. | |
691 | |
692 """ | |
693 params = {'CertificateId': cert_id} | |
694 if user_name: | |
695 params['UserName'] = user_name | |
696 return self.get_response('DeleteSigningCertificate', params) | |
697 | |
698 # | |
699 # Server Certificates | |
700 # | |
701 | |
702 def list_server_certs(self, path_prefix='/', | |
703 marker=None, max_items=None): | |
704 """ | |
705 Lists the server certificates that have the specified path prefix. | |
706 If none exist, the action returns an empty list. | |
707 | |
708 :type path_prefix: string | |
709 :param path_prefix: If provided, only certificates whose paths match | |
710 the provided prefix will be returned. | |
711 | |
712 :type marker: string | |
713 :param marker: Use this only when paginating results and only | |
714 in follow-up request after you've received a response | |
715 where the results are truncated. Set this to the value of | |
716 the Marker element in the response you just received. | |
717 | |
718 :type max_items: int | |
719 :param max_items: Use this only when paginating results to indicate | |
720 the maximum number of groups you want in the response. | |
721 | |
722 """ | |
723 params = {} | |
724 if path_prefix: | |
725 params['PathPrefix'] = path_prefix | |
726 if marker: | |
727 params['Marker'] = marker | |
728 if max_items: | |
729 params['MaxItems'] = max_items | |
730 return self.get_response('ListServerCertificates', | |
731 params, | |
732 list_marker='ServerCertificateMetadataList') | |
733 | |
734 # Preserves backwards compatibility. | |
735 # TODO: Look into deprecating this eventually? | |
736 get_all_server_certs = list_server_certs | |
737 | |
738 def update_server_cert(self, cert_name, new_cert_name=None, | |
739 new_path=None): | |
740 """ | |
741 Updates the name and/or the path of the specified server certificate. | |
742 | |
743 :type cert_name: string | |
744 :param cert_name: The name of the server certificate that you want | |
745 to update. | |
746 | |
747 :type new_cert_name: string | |
748 :param new_cert_name: The new name for the server certificate. | |
749 Include this only if you are updating the | |
750 server certificate's name. | |
751 | |
752 :type new_path: string | |
753 :param new_path: If provided, the path of the certificate will be | |
754 changed to this path. | |
755 """ | |
756 params = {'ServerCertificateName': cert_name} | |
757 if new_cert_name: | |
758 params['NewServerCertificateName'] = new_cert_name | |
759 if new_path: | |
760 params['NewPath'] = new_path | |
761 return self.get_response('UpdateServerCertificate', params) | |
762 | |
763 def upload_server_cert(self, cert_name, cert_body, private_key, | |
764 cert_chain=None, path=None): | |
765 """ | |
766 Uploads a server certificate entity for the AWS Account. | |
767 The server certificate entity includes a public key certificate, | |
768 a private key, and an optional certificate chain, which should | |
769 all be PEM-encoded. | |
770 | |
771 :type cert_name: string | |
772 :param cert_name: The name for the server certificate. Do not | |
773 include the path in this value. | |
774 | |
775 :type cert_body: string | |
776 :param cert_body: The contents of the public key certificate | |
777 in PEM-encoded format. | |
778 | |
779 :type private_key: string | |
780 :param private_key: The contents of the private key in | |
781 PEM-encoded format. | |
782 | |
783 :type cert_chain: string | |
784 :param cert_chain: The contents of the certificate chain. This | |
785 is typically a concatenation of the PEM-encoded | |
786 public key certificates of the chain. | |
787 | |
788 :type path: string | |
789 :param path: The path for the server certificate. | |
790 """ | |
791 params = {'ServerCertificateName': cert_name, | |
792 'CertificateBody': cert_body, | |
793 'PrivateKey': private_key} | |
794 if cert_chain: | |
795 params['CertificateChain'] = cert_chain | |
796 if path: | |
797 params['Path'] = path | |
798 return self.get_response('UploadServerCertificate', params, | |
799 verb='POST') | |
800 | |
801 def get_server_certificate(self, cert_name): | |
802 """ | |
803 Retrieves information about the specified server certificate. | |
804 | |
805 :type cert_name: string | |
806 :param cert_name: The name of the server certificate you want | |
807 to retrieve information about. | |
808 | |
809 """ | |
810 params = {'ServerCertificateName': cert_name} | |
811 return self.get_response('GetServerCertificate', params) | |
812 | |
813 def delete_server_cert(self, cert_name): | |
814 """ | |
815 Delete the specified server certificate. | |
816 | |
817 :type cert_name: string | |
818 :param cert_name: The name of the server certificate you want | |
819 to delete. | |
820 | |
821 """ | |
822 params = {'ServerCertificateName': cert_name} | |
823 return self.get_response('DeleteServerCertificate', params) | |
824 | |
825 # | |
826 # MFA Devices | |
827 # | |
828 | |
829 def get_all_mfa_devices(self, user_name, marker=None, max_items=None): | |
830 """ | |
831 Get all MFA devices associated with an account. | |
832 | |
833 :type user_name: string | |
834 :param user_name: The username of the user | |
835 | |
836 :type marker: string | |
837 :param marker: Use this only when paginating results and only | |
838 in follow-up request after you've received a response | |
839 where the results are truncated. Set this to the value of | |
840 the Marker element in the response you just received. | |
841 | |
842 :type max_items: int | |
843 :param max_items: Use this only when paginating results to indicate | |
844 the maximum number of groups you want in the response. | |
845 | |
846 """ | |
847 params = {'UserName': user_name} | |
848 if marker: | |
849 params['Marker'] = marker | |
850 if max_items: | |
851 params['MaxItems'] = max_items | |
852 return self.get_response('ListMFADevices', | |
853 params, list_marker='MFADevices') | |
854 | |
855 def enable_mfa_device(self, user_name, serial_number, | |
856 auth_code_1, auth_code_2): | |
857 """ | |
858 Enables the specified MFA device and associates it with the | |
859 specified user. | |
860 | |
861 :type user_name: string | |
862 :param user_name: The username of the user | |
863 | |
864 :type serial_number: string | |
865 :param serial_number: The serial number which uniquely identifies | |
866 the MFA device. | |
867 | |
868 :type auth_code_1: string | |
869 :param auth_code_1: An authentication code emitted by the device. | |
870 | |
871 :type auth_code_2: string | |
872 :param auth_code_2: A subsequent authentication code emitted | |
873 by the device. | |
874 | |
875 """ | |
876 params = {'UserName': user_name, | |
877 'SerialNumber': serial_number, | |
878 'AuthenticationCode1': auth_code_1, | |
879 'AuthenticationCode2': auth_code_2} | |
880 return self.get_response('EnableMFADevice', params) | |
881 | |
882 def deactivate_mfa_device(self, user_name, serial_number): | |
883 """ | |
884 Deactivates the specified MFA device and removes it from | |
885 association with the user. | |
886 | |
887 :type user_name: string | |
888 :param user_name: The username of the user | |
889 | |
890 :type serial_number: string | |
891 :param serial_number: The serial number which uniquely identifies | |
892 the MFA device. | |
893 | |
894 """ | |
895 params = {'UserName': user_name, | |
896 'SerialNumber': serial_number} | |
897 return self.get_response('DeactivateMFADevice', params) | |
898 | |
899 def resync_mfa_device(self, user_name, serial_number, | |
900 auth_code_1, auth_code_2): | |
901 """ | |
902 Syncronizes the specified MFA device with the AWS servers. | |
903 | |
904 :type user_name: string | |
905 :param user_name: The username of the user | |
906 | |
907 :type serial_number: string | |
908 :param serial_number: The serial number which uniquely identifies | |
909 the MFA device. | |
910 | |
911 :type auth_code_1: string | |
912 :param auth_code_1: An authentication code emitted by the device. | |
913 | |
914 :type auth_code_2: string | |
915 :param auth_code_2: A subsequent authentication code emitted | |
916 by the device. | |
917 | |
918 """ | |
919 params = {'UserName': user_name, | |
920 'SerialNumber': serial_number, | |
921 'AuthenticationCode1': auth_code_1, | |
922 'AuthenticationCode2': auth_code_2} | |
923 return self.get_response('ResyncMFADevice', params) | |
924 | |
925 # | |
926 # Login Profiles | |
927 # | |
928 | |
929 def get_login_profiles(self, user_name): | |
930 """ | |
931 Retrieves the login profile for the specified user. | |
932 | |
933 :type user_name: string | |
934 :param user_name: The username of the user | |
935 | |
936 """ | |
937 params = {'UserName': user_name} | |
938 return self.get_response('GetLoginProfile', params) | |
939 | |
940 def create_login_profile(self, user_name, password): | |
941 """ | |
942 Creates a login profile for the specified user, give the user the | |
943 ability to access AWS services and the AWS Management Console. | |
944 | |
945 :type user_name: string | |
946 :param user_name: The name of the user | |
947 | |
948 :type password: string | |
949 :param password: The new password for the user | |
950 | |
951 """ | |
952 params = {'UserName': user_name, | |
953 'Password': password} | |
954 return self.get_response('CreateLoginProfile', params) | |
955 | |
956 def delete_login_profile(self, user_name): | |
957 """ | |
958 Deletes the login profile associated with the specified user. | |
959 | |
960 :type user_name: string | |
961 :param user_name: The name of the user to delete. | |
962 | |
963 """ | |
964 params = {'UserName': user_name} | |
965 return self.get_response('DeleteLoginProfile', params) | |
966 | |
967 def update_login_profile(self, user_name, password): | |
968 """ | |
969 Resets the password associated with the user's login profile. | |
970 | |
971 :type user_name: string | |
972 :param user_name: The name of the user | |
973 | |
974 :type password: string | |
975 :param password: The new password for the user | |
976 | |
977 """ | |
978 params = {'UserName': user_name, | |
979 'Password': password} | |
980 return self.get_response('UpdateLoginProfile', params) | |
981 | |
982 def create_account_alias(self, alias): | |
983 """ | |
984 Creates a new alias for the AWS account. | |
985 | |
986 For more information on account id aliases, please see | |
987 http://goo.gl/ToB7G | |
988 | |
989 :type alias: string | |
990 :param alias: The alias to attach to the account. | |
991 """ | |
992 params = {'AccountAlias': alias} | |
993 return self.get_response('CreateAccountAlias', params) | |
994 | |
995 def delete_account_alias(self, alias): | |
996 """ | |
997 Deletes an alias for the AWS account. | |
998 | |
999 For more information on account id aliases, please see | |
1000 http://goo.gl/ToB7G | |
1001 | |
1002 :type alias: string | |
1003 :param alias: The alias to remove from the account. | |
1004 """ | |
1005 params = {'AccountAlias': alias} | |
1006 return self.get_response('DeleteAccountAlias', params) | |
1007 | |
1008 def get_account_alias(self): | |
1009 """ | |
1010 Get the alias for the current account. | |
1011 | |
1012 This is referred to in the docs as list_account_aliases, | |
1013 but it seems you can only have one account alias currently. | |
1014 | |
1015 For more information on account id aliases, please see | |
1016 http://goo.gl/ToB7G | |
1017 """ | |
1018 return self.get_response('ListAccountAliases', {}, | |
1019 list_marker='AccountAliases') | |
1020 | |
1021 def get_signin_url(self, service='ec2'): | |
1022 """ | |
1023 Get the URL where IAM users can use their login profile to sign in | |
1024 to this account's console. | |
1025 | |
1026 :type service: string | |
1027 :param service: Default service to go to in the console. | |
1028 """ | |
1029 alias = self.get_account_alias() | |
1030 | |
1031 if not alias: | |
1032 raise Exception('No alias associated with this account. Please use iam.create_account_alias() first.') | |
1033 | |
1034 resp = alias.get('list_account_aliases_response', {}) | |
1035 result = resp.get('list_account_aliases_result', {}) | |
1036 aliases = result.get('account_aliases', []) | |
1037 | |
1038 if not len(aliases): | |
1039 raise Exception('No alias associated with this account. Please use iam.create_account_alias() first.') | |
1040 | |
1041 # We'll just use the first one we find. | |
1042 alias = aliases[0] | |
1043 | |
1044 if self.host == 'iam.us-gov.amazonaws.com': | |
1045 return "https://%s.signin.amazonaws-us-gov.com/console/%s" % ( | |
1046 alias, | |
1047 service | |
1048 ) | |
1049 elif self.host.endswith('amazonaws.com.cn'): | |
1050 return "https://%s.signin.amazonaws.cn/console/%s" % ( | |
1051 alias, | |
1052 service | |
1053 ) | |
1054 else: | |
1055 return "https://%s.signin.aws.amazon.com/console/%s" % ( | |
1056 alias, | |
1057 service | |
1058 ) | |
1059 | |
1060 def get_account_summary(self): | |
1061 """ | |
1062 Get the alias for the current account. | |
1063 | |
1064 This is referred to in the docs as list_account_aliases, | |
1065 but it seems you can only have one account alias currently. | |
1066 | |
1067 For more information on account id aliases, please see | |
1068 http://goo.gl/ToB7G | |
1069 """ | |
1070 return self.get_object('GetAccountSummary', {}, SummaryMap) | |
1071 | |
1072 # | |
1073 # IAM Roles | |
1074 # | |
1075 | |
1076 def add_role_to_instance_profile(self, instance_profile_name, role_name): | |
1077 """ | |
1078 Adds the specified role to the specified instance profile. | |
1079 | |
1080 :type instance_profile_name: string | |
1081 :param instance_profile_name: Name of the instance profile to update. | |
1082 | |
1083 :type role_name: string | |
1084 :param role_name: Name of the role to add. | |
1085 """ | |
1086 return self.get_response('AddRoleToInstanceProfile', | |
1087 {'InstanceProfileName': instance_profile_name, | |
1088 'RoleName': role_name}) | |
1089 | |
1090 def create_instance_profile(self, instance_profile_name, path=None): | |
1091 """ | |
1092 Creates a new instance profile. | |
1093 | |
1094 :type instance_profile_name: string | |
1095 :param instance_profile_name: Name of the instance profile to create. | |
1096 | |
1097 :type path: string | |
1098 :param path: The path to the instance profile. | |
1099 """ | |
1100 params = {'InstanceProfileName': instance_profile_name} | |
1101 if path is not None: | |
1102 params['Path'] = path | |
1103 return self.get_response('CreateInstanceProfile', params) | |
1104 | |
1105 def _build_policy(self, assume_role_policy_document=None): | |
1106 if assume_role_policy_document is not None: | |
1107 if isinstance(assume_role_policy_document, six.string_types): | |
1108 # Historically, they had to pass a string. If it's a string, | |
1109 # assume the user has already handled it. | |
1110 return assume_role_policy_document | |
1111 else: | |
1112 | |
1113 for tld, policy in DEFAULT_POLICY_DOCUMENTS.items(): | |
1114 if tld is 'default': | |
1115 # Skip the default. We'll fall back to it if we don't find | |
1116 # anything. | |
1117 continue | |
1118 | |
1119 if self.host and self.host.endswith(tld): | |
1120 assume_role_policy_document = policy | |
1121 break | |
1122 | |
1123 if not assume_role_policy_document: | |
1124 assume_role_policy_document = DEFAULT_POLICY_DOCUMENTS['default'] | |
1125 | |
1126 # Dump the policy (either user-supplied ``dict`` or one of the defaults) | |
1127 return json.dumps(assume_role_policy_document) | |
1128 | |
1129 def create_role(self, role_name, assume_role_policy_document=None, path=None): | |
1130 """ | |
1131 Creates a new role for your AWS account. | |
1132 | |
1133 The policy grants permission to an EC2 instance to assume the role. | |
1134 The policy is URL-encoded according to RFC 3986. Currently, only EC2 | |
1135 instances can assume roles. | |
1136 | |
1137 :type role_name: string | |
1138 :param role_name: Name of the role to create. | |
1139 | |
1140 :type assume_role_policy_document: ``string`` or ``dict`` | |
1141 :param assume_role_policy_document: The policy that grants an entity | |
1142 permission to assume the role. | |
1143 | |
1144 :type path: string | |
1145 :param path: The path to the role. | |
1146 """ | |
1147 params = { | |
1148 'RoleName': role_name, | |
1149 'AssumeRolePolicyDocument': self._build_policy( | |
1150 assume_role_policy_document | |
1151 ), | |
1152 } | |
1153 if path is not None: | |
1154 params['Path'] = path | |
1155 return self.get_response('CreateRole', params) | |
1156 | |
1157 def delete_instance_profile(self, instance_profile_name): | |
1158 """ | |
1159 Deletes the specified instance profile. The instance profile must not | |
1160 have an associated role. | |
1161 | |
1162 :type instance_profile_name: string | |
1163 :param instance_profile_name: Name of the instance profile to delete. | |
1164 """ | |
1165 return self.get_response( | |
1166 'DeleteInstanceProfile', | |
1167 {'InstanceProfileName': instance_profile_name}) | |
1168 | |
1169 def delete_role(self, role_name): | |
1170 """ | |
1171 Deletes the specified role. The role must not have any policies | |
1172 attached. | |
1173 | |
1174 :type role_name: string | |
1175 :param role_name: Name of the role to delete. | |
1176 """ | |
1177 return self.get_response('DeleteRole', {'RoleName': role_name}) | |
1178 | |
1179 def delete_role_policy(self, role_name, policy_name): | |
1180 """ | |
1181 Deletes the specified policy associated with the specified role. | |
1182 | |
1183 :type role_name: string | |
1184 :param role_name: Name of the role associated with the policy. | |
1185 | |
1186 :type policy_name: string | |
1187 :param policy_name: Name of the policy to delete. | |
1188 """ | |
1189 return self.get_response( | |
1190 'DeleteRolePolicy', | |
1191 {'RoleName': role_name, 'PolicyName': policy_name}) | |
1192 | |
1193 def get_instance_profile(self, instance_profile_name): | |
1194 """ | |
1195 Retrieves information about the specified instance profile, including | |
1196 the instance profile's path, GUID, ARN, and role. | |
1197 | |
1198 :type instance_profile_name: string | |
1199 :param instance_profile_name: Name of the instance profile to get | |
1200 information about. | |
1201 """ | |
1202 return self.get_response('GetInstanceProfile', | |
1203 {'InstanceProfileName': instance_profile_name}) | |
1204 | |
1205 def get_role(self, role_name): | |
1206 """ | |
1207 Retrieves information about the specified role, including the role's | |
1208 path, GUID, ARN, and the policy granting permission to EC2 to assume | |
1209 the role. | |
1210 | |
1211 :type role_name: string | |
1212 :param role_name: Name of the role associated with the policy. | |
1213 """ | |
1214 return self.get_response('GetRole', {'RoleName': role_name}) | |
1215 | |
1216 def get_role_policy(self, role_name, policy_name): | |
1217 """ | |
1218 Retrieves the specified policy document for the specified role. | |
1219 | |
1220 :type role_name: string | |
1221 :param role_name: Name of the role associated with the policy. | |
1222 | |
1223 :type policy_name: string | |
1224 :param policy_name: Name of the policy to get. | |
1225 """ | |
1226 return self.get_response('GetRolePolicy', | |
1227 {'RoleName': role_name, | |
1228 'PolicyName': policy_name}) | |
1229 | |
1230 def list_instance_profiles(self, path_prefix=None, marker=None, | |
1231 max_items=None): | |
1232 """ | |
1233 Lists the instance profiles that have the specified path prefix. If | |
1234 there are none, the action returns an empty list. | |
1235 | |
1236 :type path_prefix: string | |
1237 :param path_prefix: The path prefix for filtering the results. For | |
1238 example: /application_abc/component_xyz/, which would get all | |
1239 instance profiles whose path starts with | |
1240 /application_abc/component_xyz/. | |
1241 | |
1242 :type marker: string | |
1243 :param marker: Use this parameter only when paginating results, and | |
1244 only in a subsequent request after you've received a response | |
1245 where the results are truncated. Set it to the value of the | |
1246 Marker element in the response you just received. | |
1247 | |
1248 :type max_items: int | |
1249 :param max_items: Use this parameter only when paginating results to | |
1250 indicate the maximum number of user names you want in the response. | |
1251 """ | |
1252 params = {} | |
1253 if path_prefix is not None: | |
1254 params['PathPrefix'] = path_prefix | |
1255 if marker is not None: | |
1256 params['Marker'] = marker | |
1257 if max_items is not None: | |
1258 params['MaxItems'] = max_items | |
1259 | |
1260 return self.get_response('ListInstanceProfiles', params, | |
1261 list_marker='InstanceProfiles') | |
1262 | |
1263 def list_instance_profiles_for_role(self, role_name, marker=None, | |
1264 max_items=None): | |
1265 """ | |
1266 Lists the instance profiles that have the specified associated role. If | |
1267 there are none, the action returns an empty list. | |
1268 | |
1269 :type role_name: string | |
1270 :param role_name: The name of the role to list instance profiles for. | |
1271 | |
1272 :type marker: string | |
1273 :param marker: Use this parameter only when paginating results, and | |
1274 only in a subsequent request after you've received a response | |
1275 where the results are truncated. Set it to the value of the | |
1276 Marker element in the response you just received. | |
1277 | |
1278 :type max_items: int | |
1279 :param max_items: Use this parameter only when paginating results to | |
1280 indicate the maximum number of user names you want in the response. | |
1281 """ | |
1282 params = {'RoleName': role_name} | |
1283 if marker is not None: | |
1284 params['Marker'] = marker | |
1285 if max_items is not None: | |
1286 params['MaxItems'] = max_items | |
1287 return self.get_response('ListInstanceProfilesForRole', params, | |
1288 list_marker='InstanceProfiles') | |
1289 | |
1290 def list_role_policies(self, role_name, marker=None, max_items=None): | |
1291 """ | |
1292 Lists the names of the policies associated with the specified role. If | |
1293 there are none, the action returns an empty list. | |
1294 | |
1295 :type role_name: string | |
1296 :param role_name: The name of the role to list policies for. | |
1297 | |
1298 :type marker: string | |
1299 :param marker: Use this parameter only when paginating results, and | |
1300 only in a subsequent request after you've received a response | |
1301 where the results are truncated. Set it to the value of the | |
1302 marker element in the response you just received. | |
1303 | |
1304 :type max_items: int | |
1305 :param max_items: Use this parameter only when paginating results to | |
1306 indicate the maximum number of user names you want in the response. | |
1307 """ | |
1308 params = {'RoleName': role_name} | |
1309 if marker is not None: | |
1310 params['Marker'] = marker | |
1311 if max_items is not None: | |
1312 params['MaxItems'] = max_items | |
1313 return self.get_response('ListRolePolicies', params, | |
1314 list_marker='PolicyNames') | |
1315 | |
1316 def list_roles(self, path_prefix=None, marker=None, max_items=None): | |
1317 """ | |
1318 Lists the roles that have the specified path prefix. If there are none, | |
1319 the action returns an empty list. | |
1320 | |
1321 :type path_prefix: string | |
1322 :param path_prefix: The path prefix for filtering the results. | |
1323 | |
1324 :type marker: string | |
1325 :param marker: Use this parameter only when paginating results, and | |
1326 only in a subsequent request after you've received a response | |
1327 where the results are truncated. Set it to the value of the | |
1328 marker element in the response you just received. | |
1329 | |
1330 :type max_items: int | |
1331 :param max_items: Use this parameter only when paginating results to | |
1332 indicate the maximum number of user names you want in the response. | |
1333 """ | |
1334 params = {} | |
1335 if path_prefix is not None: | |
1336 params['PathPrefix'] = path_prefix | |
1337 if marker is not None: | |
1338 params['Marker'] = marker | |
1339 if max_items is not None: | |
1340 params['MaxItems'] = max_items | |
1341 return self.get_response('ListRoles', params, list_marker='Roles') | |
1342 | |
1343 def put_role_policy(self, role_name, policy_name, policy_document): | |
1344 """ | |
1345 Adds (or updates) a policy document associated with the specified role. | |
1346 | |
1347 :type role_name: string | |
1348 :param role_name: Name of the role to associate the policy with. | |
1349 | |
1350 :type policy_name: string | |
1351 :param policy_name: Name of the policy document. | |
1352 | |
1353 :type policy_document: string | |
1354 :param policy_document: The policy document. | |
1355 """ | |
1356 return self.get_response('PutRolePolicy', | |
1357 {'RoleName': role_name, | |
1358 'PolicyName': policy_name, | |
1359 'PolicyDocument': policy_document}) | |
1360 | |
1361 def remove_role_from_instance_profile(self, instance_profile_name, | |
1362 role_name): | |
1363 """ | |
1364 Removes the specified role from the specified instance profile. | |
1365 | |
1366 :type instance_profile_name: string | |
1367 :param instance_profile_name: Name of the instance profile to update. | |
1368 | |
1369 :type role_name: string | |
1370 :param role_name: Name of the role to remove. | |
1371 """ | |
1372 return self.get_response('RemoveRoleFromInstanceProfile', | |
1373 {'InstanceProfileName': instance_profile_name, | |
1374 'RoleName': role_name}) | |
1375 | |
1376 def update_assume_role_policy(self, role_name, policy_document): | |
1377 """ | |
1378 Updates the policy that grants an entity permission to assume a role. | |
1379 Currently, only an Amazon EC2 instance can assume a role. | |
1380 | |
1381 :type role_name: string | |
1382 :param role_name: Name of the role to update. | |
1383 | |
1384 :type policy_document: string | |
1385 :param policy_document: The policy that grants an entity permission to | |
1386 assume the role. | |
1387 """ | |
1388 return self.get_response('UpdateAssumeRolePolicy', | |
1389 {'RoleName': role_name, | |
1390 'PolicyDocument': policy_document}) | |
1391 | |
1392 def create_saml_provider(self, saml_metadata_document, name): | |
1393 """ | |
1394 Creates an IAM entity to describe an identity provider (IdP) | |
1395 that supports SAML 2.0. | |
1396 | |
1397 The SAML provider that you create with this operation can be | |
1398 used as a principal in a role's trust policy to establish a | |
1399 trust relationship between AWS and a SAML identity provider. | |
1400 You can create an IAM role that supports Web-based single | |
1401 sign-on (SSO) to the AWS Management Console or one that | |
1402 supports API access to AWS. | |
1403 | |
1404 When you create the SAML provider, you upload an a SAML | |
1405 metadata document that you get from your IdP and that includes | |
1406 the issuer's name, expiration information, and keys that can | |
1407 be used to validate the SAML authentication response | |
1408 (assertions) that are received from the IdP. You must generate | |
1409 the metadata document using the identity management software | |
1410 that is used as your organization's IdP. | |
1411 This operation requires `Signature Version 4`_. | |
1412 For more information, see `Giving Console Access Using SAML`_ | |
1413 and `Creating Temporary Security Credentials for SAML | |
1414 Federation`_ in the Using Temporary Credentials guide. | |
1415 | |
1416 :type saml_metadata_document: string | |
1417 :param saml_metadata_document: An XML document generated by an identity | |
1418 provider (IdP) that supports SAML 2.0. The document includes the | |
1419 issuer's name, expiration information, and keys that can be used to | |
1420 validate the SAML authentication response (assertions) that are | |
1421 received from the IdP. You must generate the metadata document | |
1422 using the identity management software that is used as your | |
1423 organization's IdP. | |
1424 For more information, see `Creating Temporary Security Credentials for | |
1425 SAML Federation`_ in the Using Temporary Security Credentials | |
1426 guide. | |
1427 | |
1428 :type name: string | |
1429 :param name: The name of the provider to create. | |
1430 | |
1431 """ | |
1432 params = { | |
1433 'SAMLMetadataDocument': saml_metadata_document, | |
1434 'Name': name, | |
1435 } | |
1436 return self.get_response('CreateSAMLProvider', params) | |
1437 | |
1438 def list_saml_providers(self): | |
1439 """ | |
1440 Lists the SAML providers in the account. | |
1441 This operation requires `Signature Version 4`_. | |
1442 """ | |
1443 return self.get_response('ListSAMLProviders', {}, list_marker='SAMLProviderList') | |
1444 | |
1445 def get_saml_provider(self, saml_provider_arn): | |
1446 """ | |
1447 Returns the SAML provider metadocument that was uploaded when | |
1448 the provider was created or updated. | |
1449 This operation requires `Signature Version 4`_. | |
1450 | |
1451 :type saml_provider_arn: string | |
1452 :param saml_provider_arn: The Amazon Resource Name (ARN) of the SAML | |
1453 provider to get information about. | |
1454 | |
1455 """ | |
1456 params = {'SAMLProviderArn': saml_provider_arn} | |
1457 return self.get_response('GetSAMLProvider', params) | |
1458 | |
1459 def update_saml_provider(self, saml_provider_arn, saml_metadata_document): | |
1460 """ | |
1461 Updates the metadata document for an existing SAML provider. | |
1462 This operation requires `Signature Version 4`_. | |
1463 | |
1464 :type saml_provider_arn: string | |
1465 :param saml_provider_arn: The Amazon Resource Name (ARN) of the SAML | |
1466 provider to update. | |
1467 | |
1468 :type saml_metadata_document: string | |
1469 :param saml_metadata_document: An XML document generated by an identity | |
1470 provider (IdP) that supports SAML 2.0. The document includes the | |
1471 issuer's name, expiration information, and keys that can be used to | |
1472 validate the SAML authentication response (assertions) that are | |
1473 received from the IdP. You must generate the metadata document | |
1474 using the identity management software that is used as your | |
1475 organization's IdP. | |
1476 | |
1477 """ | |
1478 params = { | |
1479 'SAMLMetadataDocument': saml_metadata_document, | |
1480 'SAMLProviderArn': saml_provider_arn, | |
1481 } | |
1482 return self.get_response('UpdateSAMLProvider', params) | |
1483 | |
1484 def delete_saml_provider(self, saml_provider_arn): | |
1485 """ | |
1486 Deletes a SAML provider. | |
1487 | |
1488 Deleting the provider does not update any roles that reference | |
1489 the SAML provider as a principal in their trust policies. Any | |
1490 attempt to assume a role that references a SAML provider that | |
1491 has been deleted will fail. | |
1492 This operation requires `Signature Version 4`_. | |
1493 | |
1494 :type saml_provider_arn: string | |
1495 :param saml_provider_arn: The Amazon Resource Name (ARN) of the SAML | |
1496 provider to delete. | |
1497 | |
1498 """ | |
1499 params = {'SAMLProviderArn': saml_provider_arn} | |
1500 return self.get_response('DeleteSAMLProvider', params) | |
1501 | |
1502 # | |
1503 # IAM Reports | |
1504 # | |
1505 | |
1506 def generate_credential_report(self): | |
1507 """ | |
1508 Generates a credential report for an account | |
1509 | |
1510 A new credential report can only be generated every 4 hours. If one | |
1511 hasn't been generated in the last 4 hours then get_credential_report | |
1512 will error when called | |
1513 """ | |
1514 params = {} | |
1515 return self.get_response('GenerateCredentialReport', params) | |
1516 | |
1517 def get_credential_report(self): | |
1518 """ | |
1519 Retrieves a credential report for an account | |
1520 | |
1521 A report must have been generated in the last 4 hours to succeed. | |
1522 The report is returned as a base64 encoded blob within the response. | |
1523 """ | |
1524 params = {} | |
1525 return self.get_response('GetCredentialReport', params) | |
1526 | |
1527 def create_virtual_mfa_device(self, path, device_name): | |
1528 """ | |
1529 Creates a new virtual MFA device for the AWS account. | |
1530 | |
1531 After creating the virtual MFA, use enable-mfa-device to | |
1532 attach the MFA device to an IAM user. | |
1533 | |
1534 :type path: string | |
1535 :param path: The path for the virtual MFA device. | |
1536 | |
1537 :type device_name: string | |
1538 :param device_name: The name of the virtual MFA device. | |
1539 Used with path to uniquely identify a virtual MFA device. | |
1540 | |
1541 """ | |
1542 params = { | |
1543 'Path': path, | |
1544 'VirtualMFADeviceName': device_name | |
1545 } | |
1546 return self.get_response('CreateVirtualMFADevice', params) | |
1547 | |
1548 # | |
1549 # IAM password policy | |
1550 # | |
1551 | |
1552 def get_account_password_policy(self): | |
1553 """ | |
1554 Returns the password policy for the AWS account. | |
1555 """ | |
1556 params = {} | |
1557 return self.get_response('GetAccountPasswordPolicy', params) | |
1558 | |
1559 def delete_account_password_policy(self): | |
1560 """ | |
1561 Delete the password policy currently set for the AWS account. | |
1562 """ | |
1563 params = {} | |
1564 return self.get_response('DeleteAccountPasswordPolicy', params) | |
1565 | |
1566 def update_account_password_policy(self, allow_users_to_change_password=None, | |
1567 hard_expiry=None, max_password_age=None , | |
1568 minimum_password_length=None , | |
1569 password_reuse_prevention=None, | |
1570 require_lowercase_characters=None, | |
1571 require_numbers=None, require_symbols=None , | |
1572 require_uppercase_characters=None): | |
1573 """ | |
1574 Update the password policy for the AWS account. | |
1575 | |
1576 Notes: unset parameters will be reset to Amazon default settings! | |
1577 Most of the password policy settings are enforced the next time your users | |
1578 change their passwords. When you set minimum length and character type | |
1579 requirements, they are enforced the next time your users change their | |
1580 passwords - users are not forced to change their existing passwords, even | |
1581 if the pre-existing passwords do not adhere to the updated password | |
1582 policy. When you set a password expiration period, the expiration period | |
1583 is enforced immediately. | |
1584 | |
1585 :type allow_users_to_change_password: bool | |
1586 :param allow_users_to_change_password: Allows all IAM users in your account | |
1587 to use the AWS Management Console to change their own passwords. | |
1588 | |
1589 :type hard_expiry: bool | |
1590 :param hard_expiry: Prevents IAM users from setting a new password after | |
1591 their password has expired. | |
1592 | |
1593 :type max_password_age: int | |
1594 :param max_password_age: The number of days that an IAM user password is valid. | |
1595 | |
1596 :type minimum_password_length: int | |
1597 :param minimum_password_length: The minimum number of characters allowed in | |
1598 an IAM user password. | |
1599 | |
1600 :type password_reuse_prevention: int | |
1601 :param password_reuse_prevention: Specifies the number of previous passwords | |
1602 that IAM users are prevented from reusing. | |
1603 | |
1604 :type require_lowercase_characters: bool | |
1605 :param require_lowercase_characters: Specifies whether IAM user passwords | |
1606 must contain at least one lowercase character from the ISO basic Latin | |
1607 alphabet (``a`` to ``z``). | |
1608 | |
1609 :type require_numbers: bool | |
1610 :param require_numbers: Specifies whether IAM user passwords must contain at | |
1611 least one numeric character (``0`` to ``9``). | |
1612 | |
1613 :type require_symbols: bool | |
1614 :param require_symbols: Specifies whether IAM user passwords must contain at | |
1615 least one of the following non-alphanumeric characters: | |
1616 ``! @ # $ % ^ & * ( ) _ + - = [ ] { } | '`` | |
1617 | |
1618 :type require_uppercase_characters: bool | |
1619 :param require_uppercase_characters: Specifies whether IAM user passwords | |
1620 must contain at least one uppercase character from the ISO basic Latin | |
1621 alphabet (``A`` to ``Z``). | |
1622 """ | |
1623 params = {} | |
1624 if allow_users_to_change_password is not None and type(allow_users_to_change_password) is bool: | |
1625 params['AllowUsersToChangePassword'] = str(allow_users_to_change_password).lower() | |
1626 if hard_expiry is not None and type(allow_users_to_change_password) is bool: | |
1627 params['HardExpiry'] = str(hard_expiry).lower() | |
1628 if max_password_age is not None: | |
1629 params['MaxPasswordAge'] = max_password_age | |
1630 if minimum_password_length is not None: | |
1631 params['MinimumPasswordLength'] = minimum_password_length | |
1632 if password_reuse_prevention is not None: | |
1633 params['PasswordReusePrevention'] = password_reuse_prevention | |
1634 if require_lowercase_characters is not None and type(allow_users_to_change_password) is bool: | |
1635 params['RequireLowercaseCharacters'] = str(require_lowercase_characters).lower() | |
1636 if require_numbers is not None and type(allow_users_to_change_password) is bool: | |
1637 params['RequireNumbers'] = str(require_numbers).lower() | |
1638 if require_symbols is not None and type(allow_users_to_change_password) is bool: | |
1639 params['RequireSymbols'] = str(require_symbols).lower() | |
1640 if require_uppercase_characters is not None and type(allow_users_to_change_password) is bool: | |
1641 params['RequireUppercaseCharacters'] = str(require_uppercase_characters).lower() | |
1642 return self.get_response('UpdateAccountPasswordPolicy', params) | |
1643 | |
1644 def create_policy(self, policy_name, policy_document, path='/', | |
1645 description=None): | |
1646 """ | |
1647 Create a policy. | |
1648 | |
1649 :type policy_name: string | |
1650 :param policy_name: The name of the new policy | |
1651 | |
1652 :type policy_document string | |
1653 :param policy_document: The document of the new policy | |
1654 | |
1655 :type path: string | |
1656 :param path: The path in which the policy will be created. | |
1657 Defaults to /. | |
1658 | |
1659 :type description: string | |
1660 :param path: A description of the new policy. | |
1661 | |
1662 """ | |
1663 params = {'PolicyName': policy_name, | |
1664 'PolicyDocument': policy_document, | |
1665 'Path': path} | |
1666 if description is not None: | |
1667 params['Description'] = str(description) | |
1668 | |
1669 return self.get_response('CreatePolicy', params) | |
1670 | |
1671 def create_policy_version( | |
1672 self, | |
1673 policy_arn, | |
1674 policy_document, | |
1675 set_as_default=None): | |
1676 """ | |
1677 Create a policy version. | |
1678 | |
1679 :type policy_arn: string | |
1680 :param policy_arn: The ARN of the policy | |
1681 | |
1682 :type policy_document string | |
1683 :param policy_document: The document of the new policy version | |
1684 | |
1685 :type set_as_default: bool | |
1686 :param set_as_default: Sets the policy version as default | |
1687 Defaults to None. | |
1688 | |
1689 """ | |
1690 params = {'PolicyArn': policy_arn, | |
1691 'PolicyDocument': policy_document} | |
1692 if type(set_as_default) == bool: | |
1693 params['SetAsDefault'] = str(set_as_default).lower() | |
1694 return self.get_response('CreatePolicyVersion', params) | |
1695 | |
1696 def delete_policy(self, policy_arn): | |
1697 """ | |
1698 Delete a policy. | |
1699 | |
1700 :type policy_arn: string | |
1701 :param policy_arn: The ARN of the policy to delete | |
1702 | |
1703 """ | |
1704 params = {'PolicyArn': policy_arn} | |
1705 return self.get_response('DeletePolicy', params) | |
1706 | |
1707 def delete_policy_version(self, policy_arn, version_id): | |
1708 """ | |
1709 Delete a policy version. | |
1710 | |
1711 :type policy_arn: string | |
1712 :param policy_arn: The ARN of the policy to delete a version from | |
1713 | |
1714 :type version_id: string | |
1715 :param version_id: The id of the version to delete | |
1716 | |
1717 """ | |
1718 params = {'PolicyArn': policy_arn, | |
1719 'VersionId': version_id} | |
1720 return self.get_response('DeletePolicyVersion', params) | |
1721 | |
1722 def get_policy(self, policy_arn): | |
1723 """ | |
1724 Get policy information. | |
1725 | |
1726 :type policy_arn: string | |
1727 :param policy_arn: The ARN of the policy to get information for | |
1728 | |
1729 """ | |
1730 params = {'PolicyArn': policy_arn} | |
1731 return self.get_response('GetPolicy', params) | |
1732 | |
1733 def get_policy_version(self, policy_arn, version_id): | |
1734 """ | |
1735 Get policy information. | |
1736 | |
1737 :type policy_arn: string | |
1738 :param policy_arn: The ARN of the policy to get information for a | |
1739 specific version | |
1740 | |
1741 :type version_id: string | |
1742 :param version_id: The id of the version to get information for | |
1743 | |
1744 """ | |
1745 params = {'PolicyArn': policy_arn, | |
1746 'VersionId': version_id} | |
1747 return self.get_response('GetPolicyVersion', params) | |
1748 | |
1749 def list_policies(self, marker=None, max_items=None, only_attached=None, | |
1750 path_prefix=None, scope=None): | |
1751 """ | |
1752 List policies of account. | |
1753 | |
1754 :type marker: string | |
1755 :param marker: A marker used for pagination (received from previous | |
1756 accesses) | |
1757 | |
1758 :type max_items: int | |
1759 :param max_items: Send only max_items; allows paginations | |
1760 | |
1761 :type only_attached: bool | |
1762 :param only_attached: Send only policies attached to other resources | |
1763 | |
1764 :type path_prefix: string | |
1765 :param path_prefix: Send only items prefixed by this path | |
1766 | |
1767 :type scope: string | |
1768 :param scope: AWS|Local. Choose between AWS policies or your own | |
1769 """ | |
1770 params = {} | |
1771 if path_prefix is not None: | |
1772 params['PathPrefix'] = path_prefix | |
1773 if marker is not None: | |
1774 params['Marker'] = marker | |
1775 if max_items is not None: | |
1776 params['MaxItems'] = max_items | |
1777 if type(only_attached) == bool: | |
1778 params['OnlyAttached'] = str(only_attached).lower() | |
1779 if scope is not None: | |
1780 params['Scope'] = scope | |
1781 return self.get_response( | |
1782 'ListPolicies', | |
1783 params, | |
1784 list_marker='Policies') | |
1785 | |
1786 def list_policy_versions(self, policy_arn, marker=None, max_items=None): | |
1787 """ | |
1788 List policy versions. | |
1789 | |
1790 :type policy_arn: string | |
1791 :param policy_arn: The ARN of the policy to get versions of | |
1792 | |
1793 :type marker: string | |
1794 :param marker: A marker used for pagination (received from previous | |
1795 accesses) | |
1796 | |
1797 :type max_items: int | |
1798 :param max_items: Send only max_items; allows paginations | |
1799 | |
1800 """ | |
1801 params = {'PolicyArn': policy_arn} | |
1802 if marker is not None: | |
1803 params['Marker'] = marker | |
1804 if max_items is not None: | |
1805 params['MaxItems'] = max_items | |
1806 return self.get_response( | |
1807 'ListPolicyVersions', | |
1808 params, | |
1809 list_marker='Versions') | |
1810 | |
1811 def set_default_policy_version(self, policy_arn, version_id): | |
1812 """ | |
1813 Set default policy version. | |
1814 | |
1815 :type policy_arn: string | |
1816 :param policy_arn: The ARN of the policy to set the default version | |
1817 for | |
1818 | |
1819 :type version_id: string | |
1820 :param version_id: The id of the version to set as default | |
1821 """ | |
1822 params = {'PolicyArn': policy_arn, | |
1823 'VersionId': version_id} | |
1824 return self.get_response('SetDefaultPolicyVersion', params) | |
1825 | |
1826 def list_entities_for_policy(self, policy_arn, path_prefix=None, | |
1827 marker=None, max_items=None, | |
1828 entity_filter=None): | |
1829 """ | |
1830 :type policy_arn: string | |
1831 :param policy_arn: The ARN of the policy to get entities for | |
1832 | |
1833 :type marker: string | |
1834 :param marker: A marker used for pagination (received from previous | |
1835 accesses) | |
1836 | |
1837 :type max_items: int | |
1838 :param max_items: Send only max_items; allows paginations | |
1839 | |
1840 :type path_prefix: string | |
1841 :param path_prefix: Send only items prefixed by this path | |
1842 | |
1843 :type entity_filter: string | |
1844 :param entity_filter: Which entity type of User | Role | Group | | |
1845 LocalManagedPolicy | AWSManagedPolicy to return | |
1846 | |
1847 """ | |
1848 params = {'PolicyArn': policy_arn} | |
1849 if marker is not None: | |
1850 params['Marker'] = marker | |
1851 if max_items is not None: | |
1852 params['MaxItems'] = max_items | |
1853 if path_prefix is not None: | |
1854 params['PathPrefix'] = path_prefix | |
1855 if entity_filter is not None: | |
1856 params['EntityFilter'] = entity_filter | |
1857 return self.get_response('ListEntitiesForPolicy', params, | |
1858 list_marker=('PolicyGroups', | |
1859 'PolicyUsers', | |
1860 'PolicyRoles')) | |
1861 | |
1862 def attach_group_policy(self, policy_arn, group_name): | |
1863 """ | |
1864 :type policy_arn: string | |
1865 :param policy_arn: The ARN of the policy to attach | |
1866 | |
1867 :type group_name: string | |
1868 :param group_name: Group to attach the policy to | |
1869 | |
1870 """ | |
1871 params = {'PolicyArn': policy_arn, 'GroupName': group_name} | |
1872 return self.get_response('AttachGroupPolicy', params) | |
1873 | |
1874 def attach_role_policy(self, policy_arn, role_name): | |
1875 """ | |
1876 :type policy_arn: string | |
1877 :param policy_arn: The ARN of the policy to attach | |
1878 | |
1879 :type role_name: string | |
1880 :param role_name: Role to attach the policy to | |
1881 | |
1882 """ | |
1883 params = {'PolicyArn': policy_arn, 'RoleName': role_name} | |
1884 return self.get_response('AttachRolePolicy', params) | |
1885 | |
1886 def attach_user_policy(self, policy_arn, user_name): | |
1887 """ | |
1888 :type policy_arn: string | |
1889 :param policy_arn: The ARN of the policy to attach | |
1890 | |
1891 :type user_name: string | |
1892 :param user_name: User to attach the policy to | |
1893 | |
1894 """ | |
1895 params = {'PolicyArn': policy_arn, 'UserName': user_name} | |
1896 return self.get_response('AttachUserPolicy', params) | |
1897 | |
1898 def detach_group_policy(self, policy_arn, group_name): | |
1899 """ | |
1900 :type policy_arn: string | |
1901 :param policy_arn: The ARN of the policy to detach | |
1902 | |
1903 :type group_name: string | |
1904 :param group_name: Group to detach the policy from | |
1905 | |
1906 """ | |
1907 params = {'PolicyArn': policy_arn, 'GroupName': group_name} | |
1908 return self.get_response('DetachGroupPolicy', params) | |
1909 | |
1910 def detach_role_policy(self, policy_arn, role_name): | |
1911 """ | |
1912 :type policy_arn: string | |
1913 :param policy_arn: The ARN of the policy to detach | |
1914 | |
1915 :type role_name: string | |
1916 :param role_name: Role to detach the policy from | |
1917 | |
1918 """ | |
1919 params = {'PolicyArn': policy_arn, 'RoleName': role_name} | |
1920 return self.get_response('DetachRolePolicy', params) | |
1921 | |
1922 def detach_user_policy(self, policy_arn, user_name): | |
1923 """ | |
1924 :type policy_arn: string | |
1925 :param policy_arn: The ARN of the policy to detach | |
1926 | |
1927 :type user_name: string | |
1928 :param user_name: User to detach the policy from | |
1929 | |
1930 """ | |
1931 params = {'PolicyArn': policy_arn, 'UserName': user_name} | |
1932 return self.get_response('DetachUserPolicy', params) |