Skip to content

Commit db4a965

Browse files
committed
adding error handling with IAM policy deletes (race condition found)
1 parent 3f1d91d commit db4a965

File tree

1 file changed

+28
-5
lines changed
  • aws_sra_examples/solutions/genai/bedrock_org/lambda/src

1 file changed

+28
-5
lines changed

aws_sra_examples/solutions/genai/bedrock_org/lambda/src/sra_iam.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,15 @@ def detach_policy(self, role_name: str, policy_arn: str) -> EmptyResponseMetadat
165165
Empty response metadata
166166
"""
167167
self.LOGGER.info("Detaching policy from %s.", role_name)
168-
return self.IAM_CLIENT.detach_role_policy(RoleName=role_name, PolicyArn=policy_arn)
168+
try:
169+
response = self.IAM_CLIENT.detach_role_policy(RoleName=role_name, PolicyArn=policy_arn)
170+
except ClientError as error:
171+
if error.response["Error"]["Code"] == "NoSuchEntity":
172+
self.LOGGER.info(f"Policy '{policy_arn}' is not attached to role '{role_name}'.")
173+
else:
174+
self.LOGGER.error(f"Error detaching policy '{policy_arn}' from role '{role_name}': {error}")
175+
raise ValueError(f"Error detaching policy '{policy_arn}' from role '{role_name}': {error}") from None
176+
return response
169177

170178
def delete_policy(self, policy_arn: str) -> EmptyResponseMetadataTypeDef:
171179
"""Delete IAM Policy.
@@ -184,10 +192,25 @@ def delete_policy(self, policy_arn: str) -> EmptyResponseMetadataTypeDef:
184192
for version in page["Versions"]:
185193
if not version["IsDefaultVersion"]:
186194
self.LOGGER.info(f"Deleting policy version {version['VersionId']}")
187-
self.IAM_CLIENT.delete_policy_version(PolicyArn=policy_arn, VersionId=version["VersionId"])
188-
sleep(1)
189-
self.LOGGER.info("Policy version deleted.")
190-
return self.IAM_CLIENT.delete_policy(PolicyArn=policy_arn)
195+
try:
196+
self.IAM_CLIENT.delete_policy_version(PolicyArn=policy_arn, VersionId=version["VersionId"])
197+
sleep(1)
198+
self.LOGGER.info("Policy version deleted.")
199+
except ClientError as error:
200+
if error.response["Error"]["Code"] == "NoSuchEntity":
201+
self.LOGGER.info(f"Policy version {version['VersionId']} not found.")
202+
else:
203+
self.LOGGER.error(f"Error deleting policy version {version['VersionId']}: {error}")
204+
raise ValueError(f"Error deleting policy version {version['VersionId']}: {error}") from None
205+
try:
206+
response = self.IAM_CLIENT.delete_policy(PolicyArn=policy_arn)
207+
except ClientError as error:
208+
if error.response["Error"]["Code"] == "NoSuchEntity":
209+
self.LOGGER.info(f"Policy {policy_arn} not found.")
210+
else:
211+
self.LOGGER.error(f"Error deleting policy {policy_arn}: {error}")
212+
raise ValueError(f"Error deleting policy {policy_arn}: {error}") from None
213+
return response
191214

192215
def delete_role(self, role_name: str) -> EmptyResponseMetadataTypeDef:
193216
"""Delete IAM role.

0 commit comments

Comments
 (0)