Skip to content

Commit 7d7c153

Browse files
authored
Use correct SecretsManager region (#576)
1 parent 71b64fa commit 7d7c153

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

datadog_lambda/api.py

+14-7
Original file line numberDiff line numberDiff line change
@@ -64,30 +64,37 @@ def get_api_key() -> str:
6464
DD_KMS_API_KEY = os.environ.get("DD_KMS_API_KEY", "")
6565
DD_API_KEY = os.environ.get("DD_API_KEY", os.environ.get("DATADOG_API_KEY", ""))
6666

67-
REGION = os.environ.get("AWS_REGION", "")
68-
is_gov_region = REGION.startswith("us-gov-")
67+
LAMBDA_REGION = os.environ.get("AWS_REGION", "")
68+
is_gov_region = LAMBDA_REGION.startswith("us-gov-")
6969
if is_gov_region:
7070
logger.debug(
7171
"Govcloud region detected. Using FIPs endpoints for secrets management."
7272
)
7373

7474
if DD_API_KEY_SECRET_ARN:
7575
# Secrets manager endpoints: https://docs.aws.amazon.com/general/latest/gr/asm.html
76-
fips_endpoint = (
77-
f"https://secretsmanager-fips.{REGION}.amazonaws.com"
76+
try:
77+
secrets_region = DD_API_KEY_SECRET_ARN.split(":")[3]
78+
except Exception:
79+
logger.debug(
80+
"Invalid secret arn in DD_API_KEY_SECRET_ARN. Unable to get API key."
81+
)
82+
return ""
83+
endpoint_url = (
84+
f"https://secretsmanager-fips.{secrets_region}.amazonaws.com"
7885
if is_gov_region
7986
else None
8087
)
8188
secrets_manager_client = boto3.client(
82-
"secretsmanager", endpoint_url=fips_endpoint
89+
"secretsmanager", endpoint_url=endpoint_url, region_name=secrets_region
8390
)
8491
api_key = secrets_manager_client.get_secret_value(
8592
SecretId=DD_API_KEY_SECRET_ARN
8693
)["SecretString"]
8794
elif DD_API_KEY_SSM_NAME:
8895
# SSM endpoints: https://docs.aws.amazon.com/general/latest/gr/ssm.html
8996
fips_endpoint = (
90-
f"https://ssm-fips.{REGION}.amazonaws.com" if is_gov_region else None
97+
f"https://ssm-fips.{LAMBDA_REGION}.amazonaws.com" if is_gov_region else None
9198
)
9299
ssm_client = boto3.client("ssm", endpoint_url=fips_endpoint)
93100
api_key = ssm_client.get_parameter(
@@ -96,7 +103,7 @@ def get_api_key() -> str:
96103
elif DD_KMS_API_KEY:
97104
# KMS endpoints: https://docs.aws.amazon.com/general/latest/gr/kms.html
98105
fips_endpoint = (
99-
f"https://kms-fips.{REGION}.amazonaws.com" if is_gov_region else None
106+
f"https://kms-fips.{LAMBDA_REGION}.amazonaws.com" if is_gov_region else None
100107
)
101108
kms_client = boto3.client("kms", endpoint_url=fips_endpoint)
102109
api_key = decrypt_kms_api_key(kms_client, DD_KMS_API_KEY)

tests/test_api.py

+30-3
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,36 @@ def test_secrets_manager_fips_endpoint(self, mock_boto3_client):
2929
mock_boto3_client.return_value = mock_client
3030

3131
os.environ["AWS_REGION"] = "us-gov-east-1"
32-
os.environ["DD_API_KEY_SECRET_ARN"] = "test-secrets-arn"
32+
os.environ[
33+
"DD_API_KEY_SECRET_ARN"
34+
] = "arn:aws:secretsmanager:us-gov-east-1:1234567890:secret:key-name-123ABC"
3335

3436
api_key = api.get_api_key()
3537

3638
mock_boto3_client.assert_called_with(
3739
"secretsmanager",
3840
endpoint_url="https://secretsmanager-fips.us-gov-east-1.amazonaws.com",
41+
region_name="us-gov-east-1",
42+
)
43+
self.assertEqual(api_key, "test-api-key")
44+
45+
@patch("boto3.client")
46+
def test_secrets_manager_different_region(self, mock_boto3_client):
47+
mock_client = MagicMock()
48+
mock_client.get_secret_value.return_value = {"SecretString": "test-api-key"}
49+
mock_boto3_client.return_value = mock_client
50+
51+
os.environ["AWS_REGION"] = "us-east-1"
52+
os.environ[
53+
"DD_API_KEY_SECRET_ARN"
54+
] = "arn:aws:secretsmanager:us-west-1:1234567890:secret:key-name-123ABC"
55+
56+
api_key = api.get_api_key()
57+
58+
mock_boto3_client.assert_called_with(
59+
"secretsmanager",
60+
endpoint_url=None,
61+
region_name="us-west-1",
3962
)
4063
self.assertEqual(api_key, "test-api-key")
4164

@@ -82,8 +105,12 @@ def test_no_fips_for_standard_regions(self, mock_boto3_client):
82105

83106
os.environ.clear()
84107
os.environ["AWS_REGION"] = "us-west-2"
85-
os.environ["DD_API_KEY_SECRET_ARN"] = "test-arn"
108+
os.environ[
109+
"DD_API_KEY_SECRET_ARN"
110+
] = "arn:aws:secretsmanager:us-west-2:1234567890:secret:key-name-123ABC"
86111

87112
api.get_api_key()
88113

89-
mock_boto3_client.assert_called_with("secretsmanager", endpoint_url=None)
114+
mock_boto3_client.assert_called_with(
115+
"secretsmanager", endpoint_url=None, region_name="us-west-2"
116+
)

0 commit comments

Comments
 (0)