@@ -113,86 +113,4 @@ deployment_validation:
113113 script :
114114 # Check if service role has sufficient permissions for main stack deployment
115115 - python3 scripts/validate_service_role_permissions.py
116- - |
117- python3 -c "
118- import yaml
119- import sys
120- import os
121- import glob
122-
123- def extract_aws_services_from_template(template_path):
124- '''Extract AWS services used in a CloudFormation template'''
125- try:
126- with open(template_path, 'r') as f:
127- template = yaml.safe_load(f)
128-
129- services = set()
130- if 'Resources' in template:
131- for resource in template['Resources'].values():
132- if 'Type' in resource:
133- resource_type = resource['Type']
134- if resource_type.startswith('AWS::'):
135- service = resource_type.split('::')[1].lower()
136- services.add(service)
137- return services
138- except Exception as e:
139- print(f'Error processing {template_path}: {e}')
140- return set()
141-
142- def extract_permissions_from_role(role_template_path):
143- '''Extract permissions from IAM role template'''
144- with open(role_template_path, 'r') as f:
145- role_template = yaml.safe_load(f)
146-
147- permissions = set()
148- for resource in role_template['Resources'].values():
149- if resource['Type'] == 'AWS::IAM::Role':
150- for policy in resource['Properties']['Policies']:
151- for statement in policy['PolicyDocument']['Statement']:
152- if statement['Effect'] == 'Allow':
153- actions = statement['Action']
154- if isinstance(actions, str):
155- permissions.add(actions)
156- else:
157- permissions.update(actions)
158- return permissions
159-
160- # Extract permissions from service role
161- role_permissions = extract_permissions_from_role('iam-roles/cloudformation-management/IDP-Cloudformation-Service-Role.yaml')
162-
163- # Find all CloudFormation templates
164- template_files = []
165- template_files.append('template.yaml') # Main template
166- template_files.extend(glob.glob('patterns/*/template.yaml'))
167- template_files.extend(glob.glob('options/*/template.yaml'))
168-
169- # Extract required services from all templates
170- required_services = set()
171- for template_file in template_files:
172- if os.path.exists(template_file):
173- services = extract_aws_services_from_template(template_file)
174- required_services.update(services)
175- print(f'Services in {template_file}: {sorted(services)}')
176-
177- print(f'\\nAll required services: {sorted(required_services)}')
178-
179- # Check if role has permissions for each service
180- missing_services = []
181- for service in required_services:
182- # Check if role has wildcard or specific permissions for this service
183- has_permission = any(
184- perm == f'{service}:*' or
185- perm.startswith(f'{service}:') or
186- perm == '*'
187- for perm in role_permissions
188- )
189- if not has_permission:
190- missing_services.append(service)
191-
192- if missing_services:
193- print(f'\\nWARNING: Service role may be missing permissions for: {sorted(missing_services)}')
194- sys.exit(1)
195- else:
196- print(f'\\nSUCCESS: Service role appears to have sufficient permissions for all required services')
197- "
198116
0 commit comments