WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 918f502

Browse files
committed
Support both plain text and JSON format for Secrets Manager API key
- Modify get_api_key() to first treat Secrets Manager value as plain text - If the value looks like JSON (starts with '{' and ends with '}'), parse it and look for common keys (DD_API_KEY, DATADOG_API_KEY) - If JSON parsing fails or no common key is found, fall back to plain text - Add test cases for both plain text and JSON formats
1 parent ed75966 commit 918f502

File tree

2 files changed

+96
-1
lines changed

2 files changed

+96
-1
lines changed

datadog_lambda/api.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
import logging
23
import os
34

@@ -95,9 +96,25 @@ def get_api_key() -> str:
9596
secrets_manager_client = _boto3_client(
9697
"secretsmanager", endpoint_url=endpoint_url, region_name=secrets_region
9798
)
98-
api_key = secrets_manager_client.get_secret_value(
99+
secret_string = secrets_manager_client.get_secret_value(
99100
SecretId=DD_API_KEY_SECRET_ARN
100101
)["SecretString"]
102+
103+
# First treat as plain text
104+
api_key = secret_string
105+
106+
# If it looks like JSON, try parsing it
107+
if secret_string and secret_string.strip().startswith("{") and secret_string.strip().endswith("}"):
108+
try:
109+
secret_dict = json.loads(secret_string)
110+
# Try to find common key names
111+
for key in ["DD_API_KEY", "DATADOG_API_KEY"]:
112+
if key in secret_dict:
113+
api_key = secret_dict[key]
114+
break
115+
except (json.JSONDecodeError, ValueError, TypeError):
116+
# If JSON parsing fails, keep using plain text
117+
pass
101118
elif DD_API_KEY_SSM_NAME:
102119
# SSM endpoints: https://docs.aws.amazon.com/general/latest/gr/ssm.html
103120
fips_endpoint = None

tests/test_api.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,81 @@ def test_no_fips_for_standard_regions(self, mock_boto3_client):
183183
mock_boto3_client.assert_called_with(
184184
"secretsmanager", endpoint_url=None, region_name="us-west-2"
185185
)
186+
187+
@patch("botocore.session.Session.create_client")
188+
def test_secrets_manager_plain_text(self, mock_boto3_client):
189+
"""Test Secrets Manager value as plain text"""
190+
mock_client = MagicMock()
191+
mock_client.get_secret_value.return_value = {"SecretString": "plain-text-api-key"}
192+
mock_boto3_client.return_value = mock_client
193+
194+
os.environ["AWS_REGION"] = "us-east-1"
195+
os.environ["DD_API_KEY_SECRET_ARN"] = (
196+
"arn:aws:secretsmanager:us-east-1:1234567890:secret:key-name-123ABC"
197+
)
198+
199+
api_key = api.get_api_key()
200+
201+
self.assertEqual(api_key, "plain-text-api-key")
202+
203+
@patch("botocore.session.Session.create_client")
204+
def test_secrets_manager_json_with_api_key(self, mock_boto3_client):
205+
"""Test Secrets Manager value with api_key key in JSON format"""
206+
import json
207+
208+
mock_client = MagicMock()
209+
mock_client.get_secret_value.return_value = {
210+
"SecretString": json.dumps({"api_key": "json-api-key-value"})
211+
}
212+
mock_boto3_client.return_value = mock_client
213+
214+
os.environ["AWS_REGION"] = "us-east-1"
215+
os.environ["DD_API_KEY_SECRET_ARN"] = (
216+
"arn:aws:secretsmanager:us-east-1:1234567890:secret:key-name-123ABC"
217+
)
218+
219+
api_key = api.get_api_key()
220+
221+
self.assertEqual(api_key, "json-api-key-value")
222+
223+
@patch("botocore.session.Session.create_client")
224+
def test_secrets_manager_json_with_dd_api_key(self, mock_boto3_client):
225+
"""Test Secrets Manager value with DD_API_KEY key in JSON format"""
226+
import json
227+
228+
mock_client = MagicMock()
229+
mock_client.get_secret_value.return_value = {
230+
"SecretString": json.dumps({"DD_API_KEY": "dd-api-key-value"})
231+
}
232+
mock_boto3_client.return_value = mock_client
233+
234+
os.environ["AWS_REGION"] = "us-east-1"
235+
os.environ["DD_API_KEY_SECRET_ARN"] = (
236+
"arn:aws:secretsmanager:us-east-1:1234567890:secret:key-name-123ABC"
237+
)
238+
239+
api_key = api.get_api_key()
240+
241+
self.assertEqual(api_key, "dd-api-key-value")
242+
243+
@patch("botocore.session.Session.create_client")
244+
def test_secrets_manager_json_with_custom_key(self, mock_boto3_client):
245+
"""Test Secrets Manager value with custom key in JSON format (treated as plain text)"""
246+
import json
247+
248+
mock_client = MagicMock()
249+
secret_json = json.dumps({"custom_key": "custom-api-key-value"})
250+
mock_client.get_secret_value.return_value = {
251+
"SecretString": secret_json
252+
}
253+
mock_boto3_client.return_value = mock_client
254+
255+
os.environ["AWS_REGION"] = "us-east-1"
256+
os.environ["DD_API_KEY_SECRET_ARN"] = (
257+
"arn:aws:secretsmanager:us-east-1:1234567890:secret:key-name-123ABC"
258+
)
259+
260+
api_key = api.get_api_key()
261+
262+
# When no common key is found, it should be treated as plain text
263+
self.assertEqual(api_key, secret_json)

0 commit comments

Comments
 (0)