10
10
# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
11
11
# and limitations under the License.
12
12
#
13
- import pickle # nosec B403: pickle is used to create a hashable value. The value will never be deserialized.
14
-
15
13
import uuid
16
14
17
15
import boto3
27
25
28
26
from typing import TypedDict , NotRequired , Dict , Literal , Sequence
29
27
28
+ from .bedrock_prepare_agent import prepare_agent
30
29
from .cr_types import CustomResourceRequest , CustomResourceResponse
31
30
from .exceptions import AWSRetryableError , can_retry
32
31
@@ -75,13 +74,14 @@ class AgentRequest(TypedDict):
75
74
customerEncryptionKeyArn : NotRequired [str ]
76
75
promptOverrideConfiguration : NotRequired [PromptOverride ]
77
76
tags : NotRequired [Dict [str , str ]]
77
+ shouldPrepareAgent : NotRequired [str ]
78
78
79
79
80
80
class AgentResponse (TypedDict ):
81
81
agentId : str
82
82
agentArn : NotRequired [str ]
83
83
agentName : NotRequired [str ]
84
- changeId : NotRequired [str ]
84
+ updatedAt : NotRequired [str ]
85
85
86
86
87
87
session = boto3 .session .Session ()
@@ -170,23 +170,6 @@ def validate_agent_request(request: AgentRequest) -> AgentRequest:
170
170
return request
171
171
172
172
173
- def create_change_hash (request : AgentRequest ) -> str :
174
- return str (
175
- hash (
176
- # nosemgrep - Pickle is used to generate a hash. This object will never be deserialized.
177
- pickle .dumps (
178
- (
179
- request .get ("instruction" , None ),
180
- request .get ("foundationModel" , None ),
181
- request .get ("description" , None ),
182
- request .get ("idleSessionTTLInSeconds" , None ),
183
- request .get ("promptOverrideConfiguration" , None ),
184
- )
185
- )
186
- )
187
- )
188
-
189
-
190
173
def on_event (event : CustomResourceRequest [Dict ], context ):
191
174
logger .debug (f"Received event: { event } " )
192
175
request_type = event ["RequestType" ]
@@ -213,23 +196,31 @@ def on_create(
213
196
) -> CustomResourceResponse :
214
197
bedrock_agent = session .client ("bedrock-agent" )
215
198
199
+ if "shouldPrepareAgent" in event ["ResourceProperties" ]:
200
+ should_prepare_agent = event ["ResourceProperties" ]["shouldPrepareAgent" ].upper () == 'TRUE'
201
+ del event ["ResourceProperties" ]["shouldPrepareAgent" ]
202
+ else :
203
+ should_prepare_agent = False
204
+
216
205
request = AgentRequest (** event ["ResourceProperties" ])
217
206
request = validate_agent_request (request )
218
207
219
208
try :
220
209
response = bedrock_agent .create_agent (clientToken = client_token , ** request )
221
- return CustomResourceResponse (
210
+
211
+ except botocore .exceptions .ClientError as e :
212
+ can_retry (e )
213
+ if should_prepare_agent :
214
+ prepare_agent (response ["agent" ]["agentId" ])
215
+ return CustomResourceResponse (
222
216
PhysicalResourceId = response ["agent" ]["agentId" ],
223
217
Data = AgentResponse (
224
218
agentArn = response ["agent" ]["agentArn" ],
225
219
agentId = response ["agent" ]["agentId" ],
226
220
agentName = response ["agent" ]["agentName" ],
227
- changeId = create_change_hash ( request ),
221
+ updatedAt = str ( response [ "agent" ][ "updatedAt" ] ),
228
222
),
229
223
)
230
- except botocore .exceptions .ClientError as e :
231
- can_retry (e )
232
-
233
224
234
225
@retry (
235
226
retry = retry_if_exception_type (AWSRetryableError ),
@@ -238,6 +229,11 @@ def on_create(
238
229
)
239
230
def on_update (event : CustomResourceRequest [Dict ]) -> CustomResourceResponse :
240
231
bedrock_agent = session .client ("bedrock-agent" )
232
+ if "shouldPrepareAgent" in event ["ResourceProperties" ]:
233
+ should_prepare_agent = event ["ResourceProperties" ]["shouldPrepareAgent" ].upper () == 'TRUE'
234
+ del event ["ResourceProperties" ]["shouldPrepareAgent" ]
235
+ else :
236
+ should_prepare_agent = False
241
237
request = AgentRequest (** event ["ResourceProperties" ])
242
238
request = validate_agent_request (request )
243
239
if "tags" in request :
@@ -248,18 +244,19 @@ def on_update(event: CustomResourceRequest[Dict]) -> CustomResourceResponse:
248
244
** request ,
249
245
agentId = event ["PhysicalResourceId" ],
250
246
)
251
- return CustomResourceResponse (
252
- PhysicalResourceId = response ["agent" ]["agentId" ],
253
- Data = AgentResponse (
254
- agentArn = response ["agent" ]["agentArn" ],
255
- agentId = response ["agent" ]["agentId" ],
256
- agentName = response ["agent" ]["agentName" ],
257
- changeId = create_change_hash (request ),
258
- ),
259
- )
260
247
except botocore .exceptions .ClientError as e :
261
248
can_retry (e )
262
-
249
+ if should_prepare_agent :
250
+ prepare_agent (response ["agent" ]["agentId" ])
251
+ return CustomResourceResponse (
252
+ PhysicalResourceId = response ["agent" ]["agentId" ],
253
+ Data = AgentResponse (
254
+ agentArn = response ["agent" ]["agentArn" ],
255
+ agentId = response ["agent" ]["agentId" ],
256
+ agentName = response ["agent" ]["agentName" ],
257
+ updatedAt = str (response ["agent" ]["updatedAt" ]),
258
+ ),
259
+ )
263
260
264
261
@retry (
265
262
retry = retry_if_exception_type (AWSRetryableError ),
0 commit comments