import argparse import boto3 import json import os import sys from typing import List def parse_args(args: List[str]) -> argparse.Namespace: """ Parse command-line arguments :param args: List of arguments :return: Parsed arguments """ parser = argparse.ArgumentParser(description="Backup IAM Role and Policies") parser.add_argument("name", type=str, help="Name of the IAM role or policy") parser.add_argument("--type", type=str, help="Type of the entity. Allowed values are role or policy", default='role') parsed_args = parser.parse_args(args) return parsed_args def backup_role(client, role_name: str) -> None: """ Backup IAM Role and Policies :param client: Boto3 IAM client :param role_name: Name of the IAM role :return: None """ # Get Role role = client.get_role(RoleName=role_name) with open(f'{role_name}.json', 'w') as f: json.dump(role, f, indent=4, default=str) # Get Attached Policies attached_policies = client.list_attached_role_policies(RoleName=role_name) with open(f'{role_name}_AttachedPolicies.json', 'w') as f: json.dump(attached_policies, f, indent=4, default=str) # Get Inline Policies inline_policies = client.list_role_policies(RoleName=role_name) with open(f'{role_name}_InlinePolicies.json', 'w') as f: json.dump(inline_policies, f, indent=4, default=str) def backup_policy(client, policy_name: str) -> None: """ Backup IAM Policy :param client: Boto3 IAM client :param policy_name: Name of the IAM policy :return: None """ # Get Policy policy = client.get_policy(PolicyArn=policy_name) with open(f'{policy_name}.json', 'w') as f: json.dump(policy, f, indent=4, default=str) # Get Policy Version policy_version = client.get_policy_version(PolicyArn=policy_name, VersionId=policy['Policy']['DefaultVersionId']) with open(f'{policy_name}_Version.json', 'w') as f: json.dump(policy_version, f, indent=4, default=str) def main(args: List[str]) -> int: """ Main function :param args: List of arguments :return: 0 if successful, 1 otherwise """ parsed_args = parse_args(args) iam_client = boto3.client('iam') if parsed_args.type == 'role': backup_role(iam_client, parsed_args.name) elif parsed_args.type == 'policy': backup_policy(iam_client, parsed_args.name) else: print(f'Invalid type: {parsed_args.type}') return 1 return 0 if __name__ == "__main__": sys.exit(main(sys.argv[1:]))