github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/internal/adapters/cloud/aws/ec2/autoscaling.go (about)

     1  package ec2
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/khulnasoft-lab/defsec/pkg/concurrency"
     7  	defsecTypes "github.com/khulnasoft-lab/defsec/pkg/types"
     8  
     9  	ec2api "github.com/aws/aws-sdk-go-v2/service/ec2"
    10  	"github.com/aws/aws-sdk-go-v2/service/ec2/types"
    11  	"github.com/khulnasoft-lab/defsec/pkg/providers/aws/ec2"
    12  )
    13  
    14  func (a *adapter) getLaunchTemplates() ([]ec2.LaunchTemplate, error) {
    15  
    16  	a.Tracker().SetServiceLabel("Discovering launch templates...")
    17  
    18  	input := ec2api.DescribeLaunchTemplatesInput{}
    19  
    20  	var apiTemplates []types.LaunchTemplate
    21  	for {
    22  		output, err := a.client.DescribeLaunchTemplates(a.Context(), &input)
    23  		if err != nil {
    24  			return nil, err
    25  		}
    26  		apiTemplates = append(apiTemplates, output.LaunchTemplates...)
    27  		a.Tracker().SetTotalResources(len(apiTemplates))
    28  		if output.NextToken == nil {
    29  			break
    30  		}
    31  		input.NextToken = output.NextToken
    32  	}
    33  
    34  	a.Tracker().SetServiceLabel("Adapting launch templates...")
    35  	return concurrency.Adapt(apiTemplates, a.RootAdapter, a.adaptLaunchTemplate), nil
    36  }
    37  
    38  func (a *adapter) adaptLaunchTemplate(template types.LaunchTemplate) (*ec2.LaunchTemplate, error) {
    39  
    40  	metadata := a.CreateMetadata("launch-template/" + *template.LaunchTemplateId)
    41  
    42  	var version string
    43  	if template.DefaultVersionNumber != nil {
    44  		version = fmt.Sprintf("%d", *template.DefaultVersionNumber)
    45  	} else if template.LatestVersionNumber != nil {
    46  		version = fmt.Sprintf("%d", *template.LatestVersionNumber)
    47  	}
    48  
    49  	output, err := a.client.DescribeLaunchTemplateVersions(a.Context(), &ec2api.DescribeLaunchTemplateVersionsInput{
    50  		LaunchTemplateId: template.LaunchTemplateId,
    51  		Versions:         []string{version},
    52  	})
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  
    57  	if len(output.LaunchTemplateVersions) == 0 {
    58  		return nil, fmt.Errorf("launch template not found")
    59  	}
    60  
    61  	templateData := output.LaunchTemplateVersions[0].LaunchTemplateData
    62  
    63  	instance := ec2.NewInstance(metadata)
    64  	if templateData.MetadataOptions != nil {
    65  		instance.MetadataOptions.HttpTokens = defsecTypes.StringDefault(string(templateData.MetadataOptions.HttpTokens), metadata)
    66  		instance.MetadataOptions.HttpEndpoint = defsecTypes.StringDefault(string(templateData.MetadataOptions.HttpEndpoint), metadata)
    67  	}
    68  
    69  	if templateData.BlockDeviceMappings != nil {
    70  		for _, blockMapping := range templateData.BlockDeviceMappings {
    71  			ebsDevice := &ec2.BlockDevice{
    72  				Metadata:  metadata,
    73  				Encrypted: defsecTypes.BoolDefault(false, metadata),
    74  			}
    75  			if blockMapping.Ebs != nil && blockMapping.Ebs.Encrypted != nil {
    76  				ebsDevice.Encrypted = defsecTypes.BoolDefault(*blockMapping.Ebs.Encrypted, metadata)
    77  			}
    78  			instance.EBSBlockDevices = append(instance.EBSBlockDevices, ebsDevice)
    79  		}
    80  	}
    81  
    82  	return &ec2.LaunchTemplate{
    83  		Metadata: metadata,
    84  		Instance: *instance,
    85  	}, nil
    86  }