Register
Login
Resources
Docs Blog Datasets Glossary Case Studies Tutorials & Webinars
Product
Data Engine LLMs Platform Enterprise
Pricing Explore
Connect to our Discord channel

aws_secrets_manager_connector.py 7.0 KB

You have to be logged in to leave a comment. Sign In
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  1. import json
  2. import logging
  3. from super_gradients.common import AWSConnector
  4. from super_gradients.common import explicit_params_validation
  5. class AWSSecretsManagerConnector:
  6. """
  7. AWSSecretsManagerConnector - This class handles the AWS Secrets Manager connection
  8. """
  9. __slots__ = [] # Making the class immutable for runtime safety
  10. current_environment_client = None
  11. DECI_ENVIRONMENTS = ['research', 'development', 'staging', 'production']
  12. @staticmethod
  13. @explicit_params_validation(validation_type='NoneOrEmpty')
  14. def get_secret_value_for_secret_key(aws_env: str, secret_name: str, secret_key: str) -> str:
  15. """
  16. get_secret_value_for_secret_key - Gets a Secret Value from AWS Secrets Manager for the Provided Key
  17. :param aws_env: The environment to get the secret for
  18. :param secret_name: The Secret Name stored in Secrets Manager
  19. :param secret_key: The Secret Key To retrieve it's value from AWS
  20. :return: str: The Secret Value
  21. """
  22. current_class_name = __class__.__name__
  23. logger = logging.getLogger(current_class_name)
  24. secret_key = secret_key.upper()
  25. aws_secrets_dict = AWSSecretsManagerConnector.__get_secrets_manager_dict_for_secret_name(
  26. aws_env=aws_env, secret_name=secret_name)
  27. secret_key = '.'.join([aws_env.upper(), secret_key])
  28. if secret_key not in aws_secrets_dict.keys():
  29. error = f'[{current_class_name}] - Secret Key ({secret_key}) not Found in AWS Secret: ' + secret_name
  30. logger.error(error)
  31. raise EnvironmentError(error)
  32. else:
  33. return aws_secrets_dict[secret_key]
  34. @staticmethod
  35. @explicit_params_validation(validation_type='NoneOrEmpty')
  36. def get_secret_values_dict_for_secret_key_properties(env: str, secret_key: str, secret_name: str,
  37. db_properties_set: set = None) -> dict:
  38. """
  39. get_config_dict - Returns the config dict of the properties from the properties dict
  40. :param env: The environment to open the dict for
  41. :param secret_key: The Secret Key
  42. :param secret_name: The Secret to Retrieve to from AWS secrets manager (usually project name)
  43. :param db_properties_set: The set of the properties to get secrets values for
  44. :return: dict The secrets dict for the requested property
  45. """
  46. current_class_name = __class__.__name__
  47. logger = logging.getLogger(current_class_name)
  48. aws_secrets_dict = AWSSecretsManagerConnector.__get_secrets_manager_dict_for_secret_name(
  49. aws_env=env, secret_name=secret_name)
  50. aws_env_safe_secrets = {}
  51. # FILL THE DICT VALUES FROM THE AWS SECRETS RESPONSE
  52. if db_properties_set:
  53. for secret_key_property in db_properties_set:
  54. secret_key_to_retrieve = '.'.join([env.upper(), secret_key, secret_key_property])
  55. if secret_key_to_retrieve not in aws_secrets_dict:
  56. error = f'[{current_class_name}] - Error retrieving data from AWS Secrets Manager for Secret Key "{secret_name}": The secret property "{secret_key_property}" Does Not Exist'
  57. logger.error(error)
  58. raise EnvironmentError(error)
  59. else:
  60. env_stripped_key_name = secret_key_to_retrieve.lstrip(env.upper()).lstrip('.')
  61. aws_env_safe_secrets[env_stripped_key_name] = aws_secrets_dict[secret_key_to_retrieve]
  62. else:
  63. # "db_properties_set" is not specified - validating and returning all the secret keys and values for the secret name.
  64. for secret_key_name, secret_value in aws_secrets_dict.items():
  65. secret_key_to_retrieve = '.'.join([env.upper(), secret_key])
  66. assert secret_key_name.startswith(
  67. env.upper()), f'The secret key property "{secret_key_name}", found in secret named {secret_name},' \
  68. f' is not following the convention of environment prefix. please add the environment prefix "{env.upper()}" to property "{secret_key_name}"'
  69. if secret_key_name.startswith(secret_key_to_retrieve):
  70. env_stripped_key_name = secret_key_name.lstrip(env.upper()).lstrip('.')
  71. aws_env_safe_secrets[env_stripped_key_name] = secret_value
  72. return aws_env_safe_secrets
  73. @staticmethod
  74. def __get_secrets_manager_dict_for_secret_name(aws_env: str, secret_name: str) -> dict:
  75. """
  76. __get_secrets_manager_dict_for_secret_name
  77. :param aws_env: The environment to open the dict for
  78. :param secret_name: The Secret to Retrieve to from AWS secrets manager (usually project name)
  79. :return: python Dictionary with the key/value pairs stored in AWS Secrets Manager
  80. """
  81. current_class_name = __class__.__name__
  82. logger = logging.getLogger(current_class_name)
  83. secrets_path = AWSSecretsManagerConnector.__get_secrets_path_from_secret_name(aws_env, secret_name)
  84. try:
  85. if not AWSSecretsManagerConnector.current_environment_client:
  86. logger.debug('Initializing a new secrets manager client...')
  87. AWSSecretsManagerConnector.current_environment_client = AWSConnector.get_aws_client_for_service_name(
  88. profile_name=aws_env,
  89. service_name='secretsmanager')
  90. logger.debug(f'Fetching the secret "{secret_name}" in env "{aws_env}"')
  91. aws_secrets = AWSSecretsManagerConnector.current_environment_client.get_secret_value(SecretId=secrets_path)
  92. aws_secrets_dict = json.loads(aws_secrets['SecretString'])
  93. return aws_secrets_dict
  94. except Exception as ex:
  95. error = '[' + current_class_name + '] - Caught Exception while trying to connect to aws to get credentials from secrets manager: ' + '"' + str(
  96. ex) + '"' + ' for ' + str(secrets_path)
  97. logger.error(error)
  98. raise EnvironmentError(error)
  99. @staticmethod
  100. def __get_secrets_path_from_secret_name(aws_env: str, secret_name: str) -> str:
  101. """
  102. __get_secrets_path_from_secret_name - Extracts the full secret path based on the Environment
  103. :param aws_env: Env
  104. :param secret_name: Secret Name
  105. :return: str: The full secret path
  106. """
  107. current_class_name = __class__.__name__
  108. logger = logging.getLogger(current_class_name)
  109. # Checking for lowercase exact match, in order to prevent any implicit usage of the environments.
  110. if aws_env not in AWSSecretsManagerConnector.DECI_ENVIRONMENTS:
  111. logger.critical('[' + current_class_name + ' ] - wrong environment param... Exiting')
  112. raise Exception('[' + current_class_name + '] - wrong environment param')
  113. secrets_path = '/'.join([aws_env, secret_name])
  114. return secrets_path
Tip!

Press p or to see the previous file or, n or to see the next file

Comments

Loading...