Skip to content

Commit 1118f93

Browse files
committed
Bug Fix: Defining local_tags to allow creating new permission sets
1 parent 5bc8071 commit 1118f93

File tree

1 file changed

+27
-39
lines changed

1 file changed

+27
-39
lines changed

src/automation-code/identity-center-auto-permissionsets/auto-permissionsets.py

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
runtime_region = os.getenv('AWS_REGION')
3737
ic_bucket_name = os.getenv('IC_S3_BucketName')
3838
s3 = boto3.resource('s3')
39-
orgs_client = boto3.client('organizations', region_name=runtime_region, config=AWS_CONFIG)
39+
orgs_client = boto3.client(
40+
'organizations', region_name=runtime_region, config=AWS_CONFIG)
4041
ic_admin = boto3.client(
4142
'sso-admin', region_name=runtime_region, config=AWS_CONFIG)
4243
ic_instance_arn = os.getenv('IC_InstanceArn')
@@ -107,6 +108,7 @@ def log_and_append_error(message):
107108

108109
CACHE_TTL = 1800 # 30 minutes
109110

111+
110112
class CacheManager:
111113
def __init__(self):
112114
self._cache = {}
@@ -198,7 +200,8 @@ def execute_with_retry(func, *args, **kwargs):
198200
base_delay = RETRY_BASE_DELAY * (2 ** attempt)
199201
sleep(base_delay + random.uniform(0, 1))
200202
except Exception as error:
201-
log_and_append_error(f"Unexpected error in {func.__name__}: {str(error)}")
203+
log_and_append_error(
204+
f"Unexpected error in {func.__name__}: {str(error)}")
202205
raise
203206

204207

@@ -209,6 +212,7 @@ def process_permission_set(local_perm_set, aws_permission_sets):
209212
local_description = local_perm_set.get('Description', '')
210213
local_session_duration = local_perm_set.get(
211214
'Session_Duration', default_session_duration)
215+
local_tags = local_perm_set.get('Tags', [])
212216

213217
# Check if this permission set should be skipped
214218
global skipped_perm_set
@@ -222,7 +226,6 @@ def process_permission_set(local_perm_set, aws_permission_sets):
222226
logger.info(f"Permission set {perm_set_name} exists. Syncing.")
223227
perm_set_arn = aws_permission_sets[perm_set_name]['Arn']
224228
aws_session_duration = aws_permission_sets[perm_set_name]['SessionDuration']
225-
local_tags = local_perm_set.get('Tags', [])
226229
aws_description = aws_permission_sets[perm_set_name]['Description']
227230
else:
228231
# Create new permission set
@@ -321,10 +324,11 @@ def is_provisioned_or_outdated(perm_set_name, perm_set_arn, account):
321324
try:
322325
# Check never provisioned
323326
provisioned = []
324-
paginator = ic_admin.get_paginator('list_permission_sets_provisioned_to_account')
325-
for page in paginator.paginate(InstanceArn=ic_instance_arn,AccountId=account):
327+
paginator = ic_admin.get_paginator(
328+
'list_permission_sets_provisioned_to_account')
329+
for page in paginator.paginate(InstanceArn=ic_instance_arn, AccountId=account):
326330
provisioned.extend(page.get('PermissionSets', []))
327-
331+
328332
if provisioned:
329333
if perm_set_arn not in provisioned:
330334
return (perm_set_name, perm_set_arn, account, 'never_provisioned')
@@ -340,7 +344,8 @@ def is_provisioned_or_outdated(perm_set_name, perm_set_arn, account):
340344
return (perm_set_name, perm_set_arn, account, 'outdated')
341345

342346
except Exception as error:
343-
log_and_append_error(f"Status check failed for {account}: {str(error)}")
347+
log_and_append_error(
348+
f"Status check failed for {account}: {str(error)}")
344349
logger.debug(f"No provisioning required for {perm_set_name}")
345350
return None
346351

@@ -360,7 +365,8 @@ def provisioning_job():
360365
try:
361366
provision_account(perm_set_name, perm_set_arn, account)
362367
except Exception as error:
363-
log_and_append_error(f"Failed to provision {account}: {str(error)}")
368+
log_and_append_error(
369+
f"Failed to provision {account}: {str(error)}")
364370

365371
if idx < len(provisioning_tasks):
366372
time.sleep(3)
@@ -455,17 +461,21 @@ def deprovisioning_job(permission_sets):
455461
if result: # If deprovisioning is required
456462
confirmed_tasks.extend(result)
457463
except Exception as error:
458-
log_and_append_error(f"Deprovisioning check failed: {error}")
464+
log_and_append_error(
465+
f"Deprovisioning check failed: {error}")
459466
# if not confirmed_tasks:
460467
# logger.info("No permission sets require deprovisioning")
461468
# return
462-
deprovisioning_needed = [(name, arn, account) for name, arn, account in confirmed_tasks if account is not None]
463-
deletion_only = [(name, arn) for name, arn, account in confirmed_tasks if account is None]
469+
deprovisioning_needed = [(name, arn, account) for name,
470+
arn, account in confirmed_tasks if account is not None]
471+
deletion_only = [(name, arn) for name, arn,
472+
account in confirmed_tasks if account is None]
464473

465474
if not deprovisioning_needed:
466475
logger.info("No permission sets require deprovisioning")
467476
if deprovisioning_needed:
468-
logger.info(f"Starting deprovisioning of {len(deprovisioning_needed)} tasks")
477+
logger.info(
478+
f"Starting deprovisioning of {len(deprovisioning_needed)} tasks")
469479
# Process in batches of 10
470480
for i in range(0, len(deprovisioning_needed), 10):
471481
batch = deprovisioning_needed[i:i + 10]
@@ -491,7 +501,8 @@ def deprovisioning_job(permission_sets):
491501
if success:
492502
deprovisioned_sets.add((name, arn))
493503
except Exception as error:
494-
log_and_append_error(f"Deprovisioning failed: {error}")
504+
log_and_append_error(
505+
f"Deprovisioning failed: {error}")
495506

496507
if i + 10 < len(deprovisioning_needed):
497508
time.sleep(2)
@@ -533,7 +544,7 @@ def deprovision_account(perm_set_arn, perm_set_name, account):
533544
assignments = []
534545
paginator = ic_admin.get_paginator('list_account_assignments')
535546
for page in paginator.paginate(InstanceArn=ic_instance_arn, AccountId=account, PermissionSetArn=perm_set_arn
536-
)['AccountAssignments']:
547+
)['AccountAssignments']:
537548
assignments.extend(page.get('AccountAssignments', []))
538549

539550
for assignment in assignments:
@@ -822,30 +833,6 @@ def get_all_json_files(bucket_name):
822833
return file_contents
823834

824835

825-
def create_permission_set(name, desc, tags, session_duration):
826-
"""Create a permission set in AWS IAM Identity Center"""
827-
logger.info(f"Creating permission set: {name}")
828-
try:
829-
response = ic_admin.create_permission_set(
830-
Name=name,
831-
Description=desc,
832-
InstanceArn=ic_instance_arn,
833-
SessionDuration=session_duration,
834-
Tags=tags
835-
)
836-
except ic_admin.exceptions.ConflictException as error:
837-
logger.info("%sThe same IAM Identity Center process may have been started in another invocation, or check for potential conflicts; skipping...", error)
838-
sleep(0.5)
839-
except ClientError as error:
840-
error_message = f'Client error occurred: {error}'
841-
log_and_append_error(error_message)
842-
except Exception as error:
843-
error_message = f'Error occurred: {error}'
844-
log_and_append_error(error_message)
845-
cache.set(f"permsets_{delegated}", None)
846-
return response
847-
848-
849836
def add_managed_policy_to_perm_set(local_name, perm_set_arn, managed_policy_arn):
850837
"""Attach a managed policy to a permission set"""
851838
logger.info(
@@ -1300,7 +1287,8 @@ def sync_tags(local_name, local_tags, perm_set_arn):
13001287
def is_account_active(account_id):
13011288
"""Check if the AWS account is active (not suspended or pending closure)"""
13021289
try:
1303-
response = execute_with_retry(orgs_client.describe_account,AccountId=account_id)
1290+
response = execute_with_retry(
1291+
orgs_client.describe_account, AccountId=account_id)
13041292
if response['Account']['Status'] == 'ACTIVE':
13051293
return True
13061294
except Exception as error:

0 commit comments

Comments
 (0)