Skip to content

Commit c3f4e94

Browse files
authored
Send AgentlessAPICall Lambda ARN to backend (#255)
Sometimes there are delays in crawling resources after installing the integration. This makes it impossible for us to validate that the scanner deployment is working properly. By sending this Lambda ARN to the backend, we can scan it immediately. Although the DatadogAgentlessAPICall is not a very interesting resource to scan since it does not have dependencies, it is enough to validate that the scanner is working properly.
1 parent 1e903ee commit c3f4e94

3 files changed

Lines changed: 20 additions & 17 deletions

File tree

aws_quickstart/datadog_agentless_api_call.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
LOGGER = logging.getLogger()
1010

1111

12-
def call_datadog_agentless_api(event, method):
12+
def call_datadog_agentless_api(context, event, method):
1313
template_version = event["ResourceProperties"]["TemplateVersion"]
1414
api_key = event["ResourceProperties"]["APIKey"]
1515
app_key = event["ResourceProperties"]["APPKey"]
@@ -69,6 +69,7 @@ def call_datadog_agentless_api(event, method):
6969
"orchestrator_policy_arn": orchestrator_policy_arn,
7070
"worker_policy_arn": worker_policy_arn,
7171
"worker_dspm_policy_arn": worker_dspm_policy_arn,
72+
"invoked_function_arn": context.invoked_function_arn,
7273
},
7374
},
7475
"data": {
@@ -116,7 +117,7 @@ def handler(event, context):
116117
try:
117118
if event["RequestType"] == "Create":
118119
LOGGER.info("Received Create request.")
119-
response = call_datadog_agentless_api(event, "POST")
120+
response = call_datadog_agentless_api(context, event, "POST")
120121
send_response(
121122
event,
122123
context,
@@ -135,7 +136,7 @@ def handler(event, context):
135136
)
136137
elif event["RequestType"] == "Delete":
137138
LOGGER.info("Received Delete request.")
138-
response = call_datadog_agentless_api(event, "DELETE")
139+
response = call_datadog_agentless_api(context, event, "DELETE")
139140
send_response(
140141
event,
141142
context,

aws_quickstart/datadog_agentless_api_call_test.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import json
44
import unittest
5+
from types import SimpleNamespace
56
from unittest.mock import patch, Mock
67
from urllib.error import HTTPError
78

@@ -17,6 +18,7 @@ class TestCallDatadogAgentlessAPI(unittest.TestCase):
1718

1819
def setUp(self):
1920
"""Set up test fixtures"""
21+
self.context = SimpleNamespace(invoked_function_arn="arn:aws:lambda:us-east-1:012345678901:function:DatadogAgentlessAPICallFunction")
2022
self.base_event = {
2123
"ResourceProperties": {
2224
"TemplateVersion": "1.0.0",
@@ -55,7 +57,7 @@ def test_post_success_200(self, mock_is_enabled, mock_urlopen):
5557
mock_response = self.create_mock_response(200)
5658
mock_urlopen.return_value = mock_response
5759

58-
result = call_datadog_agentless_api(self.base_event, "POST")
60+
result = call_datadog_agentless_api(self.context, self.base_event, "POST")
5961

6062
self.assertEqual(result.status, 200)
6163

@@ -71,7 +73,7 @@ def test_post_success_201(self, mock_is_enabled, mock_urlopen):
7173
mock_response = self.create_mock_response(201)
7274
mock_urlopen.return_value = mock_response
7375

74-
result = call_datadog_agentless_api(self.base_event, "POST")
76+
result = call_datadog_agentless_api(self.context, self.base_event, "POST")
7577

7678
self.assertEqual(result.status, 201)
7779

@@ -83,7 +85,7 @@ def test_post_success_204(self, mock_is_enabled, mock_urlopen):
8385
mock_response = self.create_mock_response(204)
8486
mock_urlopen.return_value = mock_response
8587

86-
result = call_datadog_agentless_api(self.base_event, "POST")
88+
result = call_datadog_agentless_api(self.context, self.base_event, "POST")
8789

8890
self.assertEqual(result.status, 204)
8991

@@ -96,7 +98,7 @@ def test_post_error_400(self, mock_is_enabled, mock_urlopen):
9698
mock_urlopen.side_effect = mock_error
9799

98100
with self.assertRaises(HTTPError):
99-
call_datadog_agentless_api(self.base_event, "POST")
101+
call_datadog_agentless_api(self.context, self.base_event, "POST")
100102

101103
@patch("datadog_agentless_api_call.urllib.request.urlopen")
102104
@patch("datadog_agentless_api_call.is_agentless_scanning_enabled")
@@ -107,7 +109,7 @@ def test_post_error_404(self, mock_is_enabled, mock_urlopen):
107109
mock_urlopen.side_effect = mock_error
108110

109111
with self.assertRaises(HTTPError):
110-
call_datadog_agentless_api(self.base_event, "POST")
112+
call_datadog_agentless_api(self.context, self.base_event, "POST")
111113

112114
@patch("datadog_agentless_api_call.urllib.request.urlopen")
113115
@patch("datadog_agentless_api_call.is_agentless_scanning_enabled")
@@ -118,7 +120,7 @@ def test_post_error_500(self, mock_is_enabled, mock_urlopen):
118120
mock_urlopen.side_effect = mock_error
119121

120122
with self.assertRaises(HTTPError):
121-
call_datadog_agentless_api(self.base_event, "POST")
123+
call_datadog_agentless_api(self.context, self.base_event, "POST")
122124

123125
@patch("datadog_agentless_api_call.urllib.request.urlopen")
124126
@patch("datadog_agentless_api_call.is_agentless_scanning_enabled")
@@ -128,7 +130,7 @@ def test_post_patch_when_enabled(self, mock_is_enabled, mock_urlopen):
128130
mock_response = self.create_mock_response(200)
129131
mock_urlopen.return_value = mock_response
130132

131-
result = call_datadog_agentless_api(self.base_event, "POST")
133+
result = call_datadog_agentless_api(self.context, self.base_event, "POST")
132134

133135
self.assertEqual(result.status, 200)
134136

@@ -142,7 +144,7 @@ def test_delete_success_200(self, mock_urlopen):
142144
mock_response = self.create_mock_response(200)
143145
mock_urlopen.return_value = mock_response
144146

145-
result = call_datadog_agentless_api(self.base_event, "DELETE")
147+
result = call_datadog_agentless_api(self.context, self.base_event, "DELETE")
146148

147149
self.assertEqual(result.status, 200)
148150

@@ -152,7 +154,7 @@ def test_delete_success_204(self, mock_urlopen):
152154
mock_response = self.create_mock_response(204)
153155
mock_urlopen.return_value = mock_response
154156

155-
result = call_datadog_agentless_api(self.base_event, "DELETE")
157+
result = call_datadog_agentless_api(self.context, self.base_event, "DELETE")
156158

157159
self.assertEqual(result.status, 204)
158160

@@ -162,7 +164,7 @@ def test_delete_error_404_returns_error(self, mock_urlopen):
162164
mock_error = self.create_mock_http_error(404)
163165
mock_urlopen.side_effect = mock_error
164166

165-
result = call_datadog_agentless_api(self.base_event, "DELETE")
167+
result = call_datadog_agentless_api(self.context, self.base_event, "DELETE")
166168

167169
self.assertEqual(result.status, 404)
168170

@@ -173,11 +175,11 @@ def test_delete_error_500_raises_exception(self, mock_urlopen):
173175
mock_urlopen.side_effect = mock_error
174176

175177
with self.assertRaises(HTTPError):
176-
call_datadog_agentless_api(self.base_event, "DELETE")
178+
call_datadog_agentless_api(self.context, self.base_event, "DELETE")
177179

178180
def test_unsupported_method_returns_none(self):
179181
"""Test that unsupported HTTP methods return None"""
180-
result = call_datadog_agentless_api(self.base_event, "PUT")
182+
result = call_datadog_agentless_api(self.context, self.base_event, "PUT")
181183
self.assertIsNone(result)
182184

183185
@patch("datadog_agentless_api_call.urllib.request.urlopen")
@@ -188,7 +190,7 @@ def test_post_request_payload_structure(self, mock_is_enabled, mock_urlopen):
188190
mock_response = self.create_mock_response(200)
189191
mock_urlopen.return_value = mock_response
190192

191-
call_datadog_agentless_api(self.base_event, "POST")
193+
call_datadog_agentless_api(self.context, self.base_event, "POST")
192194

193195
# Get the request that was made
194196
call_args = mock_urlopen.call_args[0][0]

aws_quickstart/version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v4.2.0
1+
v4.2.1

0 commit comments

Comments
 (0)