| 
					
				 | 
			
			
				@@ -159,12 +159,14 @@ func (b *ecsAPIService) convert(project *types.Project) (*cloudformation.Templat 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return nil, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		taskExecutionRole, err := createTaskExecutionRole(service, err, definition, template) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return template, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		taskExecutionRole := createTaskExecutionRole(service, definition, template) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		definition.ExecutionRoleArn = cloudformation.Ref(taskExecutionRole) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		taskRole := createTaskRole(service, template) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if taskRole != "" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			definition.TaskRoleArn = cloudformation.Ref(taskRole) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		taskDefinition := fmt.Sprintf("%sTaskDefinition", normalizeResourceName(service.Name)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		template.Resources[taskDefinition] = definition 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -459,40 +461,43 @@ func createServiceRegistry(service types.ServiceConfig, template *cloudformation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return serviceRegistry 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func createTaskExecutionRole(service types.ServiceConfig, err error, definition *ecs.TaskDefinition, template *cloudformation.Template) (string, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func createTaskExecutionRole(service types.ServiceConfig, definition *ecs.TaskDefinition, template *cloudformation.Template) string { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	taskExecutionRole := fmt.Sprintf("%sTaskExecutionRole", normalizeResourceName(service.Name)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	policy := getPolicy(definition) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return taskExecutionRole, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	rolePolicies := []iam.Role_Policy{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if policy != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		rolePolicies = append(rolePolicies, iam.Role_Policy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			PolicyDocument: policy, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			PolicyName:     fmt.Sprintf("%sGrantAccessToSecrets", service.Name), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	policies := createPolicies(service, definition) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	template.Resources[taskExecutionRole] = &iam.Role{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		AssumeRolePolicyDocument: assumeRolePolicyDocument, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Policies:                 policies, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ManagedPolicyArns: []string{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			ecsTaskExecutionPolicy, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			ecrReadOnlyPolicy, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return taskExecutionRole 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func createTaskRole(service types.ServiceConfig, template *cloudformation.Template) string { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	taskRole := fmt.Sprintf("%sTaskRole", normalizeResourceName(service.Name)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	rolePolicies := []iam.Role_Policy{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if roles, ok := service.Extensions[extensionRole]; ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		rolePolicies = append(rolePolicies, iam.Role_Policy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			PolicyDocument: roles, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	managedPolicies := []string{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ecsTaskExecutionPolicy, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		ecrReadOnlyPolicy, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	managedPolicies := []string{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if v, ok := service.Extensions[extensionManagedPolicies]; ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		for _, s := range v.([]interface{}) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			managedPolicies = append(managedPolicies, s.(string)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	template.Resources[taskExecutionRole] = &iam.Role{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(rolePolicies) == 0 && len(managedPolicies) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	template.Resources[taskRole] = &iam.Role{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		AssumeRolePolicyDocument: assumeRolePolicyDocument, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Policies:                 rolePolicies, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		ManagedPolicyArns:        managedPolicies, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return taskExecutionRole, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return taskRole 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func createCluster(project *types.Project, template *cloudformation.Template) string { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -582,7 +587,7 @@ func normalizeResourceName(s string) string { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return strings.Title(regexp.MustCompile("[^a-zA-Z0-9]+").ReplaceAllString(s, "")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func getPolicy(taskDef *ecs.TaskDefinition) *PolicyDocument { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func createPolicies(service types.ServiceConfig, taskDef *ecs.TaskDefinition) []iam.Role_Policy { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	arns := []string{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, container := range taskDef.ContainerDefinitions { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if container.RepositoryCredentials != nil { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -596,13 +601,19 @@ func getPolicy(taskDef *ecs.TaskDefinition) *PolicyDocument { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(arns) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return &PolicyDocument{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Statement: []PolicyStatement{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					Effect:   "Allow", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					Action:   []string{actionGetSecretValue, actionGetParameters, actionDecrypt}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					Resource: arns, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return []iam.Role_Policy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				PolicyDocument: &PolicyDocument{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Statement: []PolicyStatement{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							Effect:   "Allow", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							Action:   []string{actionGetSecretValue, actionGetParameters, actionDecrypt}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							Resource: arns, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				PolicyName: fmt.Sprintf("%sGrantAccessToSecrets", service.Name), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return nil 
			 |