in internal/resources/providers/awslib/ec2/provider.go [468:511]
func (p *Provider) DescribeVolumes(ctx context.Context, instances []*Ec2Instance) ([]*Volume, error) {
instanceFilter := lo.Map(instances, func(ins *Ec2Instance, _ int) string { return *ins.InstanceId })
volumes, err := awslib.MultiRegionFetch(ctx, p.clients, func(ctx context.Context, region string, c Client) ([]*Volume, error) {
input := &ec2.DescribeVolumesInput{
Filters: []types.Filter{
{
Name: aws.String("attachment.instance-id"),
Values: instanceFilter,
},
},
}
allVolumes := []types.Volume{}
for {
output, err := c.DescribeVolumes(ctx, input)
if err != nil {
return nil, err
}
allVolumes = append(allVolumes, output.Volumes...)
if output.NextToken == nil {
break
}
input.NextToken = output.NextToken
}
var result []*Volume
for _, vol := range allVolumes {
if len(vol.Attachments) != 1 {
p.log.Errorf("Volume %s has %d attachments", *vol.VolumeId, len(vol.Attachments))
continue
}
result = append(result, &Volume{
VolumeId: *vol.VolumeId,
Size: int(*vol.Size),
Region: region,
Encrypted: *vol.Encrypted,
InstanceId: *vol.Attachments[0].InstanceId,
Device: *vol.Attachments[0].Device,
})
}
return result, nil
})
return lo.Flatten(volumes), err
}