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