Example #1
0
func processNetInterfaces(svc *ec2.EC2, pageSize int64, apply func([]*string)) {
	networkInterfaces, err := svc.DescribeNetworkInterfaces(&ec2.DescribeNetworkInterfacesInput{})

	kingpin.FatalIfError(err, "Could not retrieve EC2 network interfaces")

	var niIds []*string
	for _, ni := range networkInterfaces.NetworkInterfaces {
		niIds = append(niIds, ni.NetworkInterfaceId)
	}

	apply(niIds)
}
func networkInterfaceAttachmentRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc {
	return func() (interface{}, string, error) {

		describe_network_interfaces_request := &ec2.DescribeNetworkInterfacesInput{
			NetworkInterfaceIds: []*string{aws.String(id)},
		}
		describeResp, err := conn.DescribeNetworkInterfaces(describe_network_interfaces_request)

		if err != nil {
			log.Printf("[ERROR] Could not find network interface %s. %s", id, err)
			return nil, "", err
		}

		eni := describeResp.NetworkInterfaces[0]
		hasAttachment := strconv.FormatBool(eni.Attachment != nil)
		log.Printf("[DEBUG] ENI %s has attachment state %s", id, hasAttachment)
		return eni, hasAttachment, nil
	}
}
Example #3
0
func waitForNoUsedIPS(svc *ec2.EC2, vpcid string) error {
	filters := make([]*ec2.Filter, 0)
	keyname := "vpc-id"
	filter := ec2.Filter{
		Name: &keyname, Values: []*string{&vpcid}}
	filters = append(filters, &filter)
	dnii := &ec2.DescribeNetworkInterfacesInput{Filters: filters}
	dnio, err := svc.DescribeNetworkInterfaces(dnii)
	if err != nil {
		fmt.Println("Failed to describe network interfaces:", err)
		return err
	}

	//for i := range dnio.NetworkInterfaces {
	//	fmt.Println(dnio.NetworkInterfaces[i])
	//}

	count := 0
	for {
		dnio, err = svc.DescribeNetworkInterfaces(dnii)
		if len(dnio.NetworkInterfaces) == 0 {
			return nil
		}

		//for i := range dnio.NetworkInterfaces {
		//	fmt.Println(dnio.NetworkInterfaces[i])
		//}

		if count > 60 {
			break
		}

		time.Sleep(2 * time.Second)
		count++

	}

	return errors.New("Waited too long for IPs to disappear...")

}
func getLambdaENIs(conn *ec2.EC2, d *schema.ResourceData) []ec2.NetworkInterface {
	filter := &ec2.Filter{
		Name:   aws.String("group-id"),
		Values: []*string{aws.String(d.Id())},
	}
	params := &ec2.DescribeNetworkInterfacesInput{
		Filters: []*ec2.Filter{filter},
	}
	networkInterfaceResp, err := conn.DescribeNetworkInterfaces(params)

	lambdaENIs := make([]ec2.NetworkInterface, 0)
	if err != nil {
		log.Printf("[WARN] Unable to fetch ENIs: %s", err)
		return lambdaENIs
	}

	v := networkInterfaceResp.NetworkInterfaces
	for _, eni := range v {
		if strings.Contains(*eni.Description, "AWS Lambda VPC ENI") {
			lambdaENIs = append(lambdaENIs, *eni)
		}
	}
	return lambdaENIs
}
// The AWS Lambda service creates ENIs behind the scenes and keeps these around for a while
// which would prevent SGs attached to such ENIs from being destroyed
func deleteLingeringLambdaENIs(conn *ec2.EC2, d *schema.ResourceData) error {
	// Here we carefully find the offenders
	params := &ec2.DescribeNetworkInterfacesInput{
		Filters: []*ec2.Filter{
			&ec2.Filter{
				Name:   aws.String("group-id"),
				Values: []*string{aws.String(d.Id())},
			},
			&ec2.Filter{
				Name:   aws.String("description"),
				Values: []*string{aws.String("AWS Lambda VPC ENI: *")},
			},
			&ec2.Filter{
				Name:   aws.String("requester-id"),
				Values: []*string{aws.String("*:awslambda_*")},
			},
		},
	}
	networkInterfaceResp, err := conn.DescribeNetworkInterfaces(params)
	if err != nil {
		return err
	}

	// Then we detach and finally delete those
	v := networkInterfaceResp.NetworkInterfaces
	for _, eni := range v {
		if eni.Attachment != nil {
			detachNetworkInterfaceParams := &ec2.DetachNetworkInterfaceInput{
				AttachmentId: eni.Attachment.AttachmentId,
			}
			_, detachNetworkInterfaceErr := conn.DetachNetworkInterface(detachNetworkInterfaceParams)

			if detachNetworkInterfaceErr != nil {
				return detachNetworkInterfaceErr
			}

			log.Printf("[DEBUG] Waiting for ENI (%s) to become detached", *eni.NetworkInterfaceId)
			stateConf := &resource.StateChangeConf{
				Pending: []string{"true"},
				Target:  []string{"false"},
				Refresh: networkInterfaceAttachedRefreshFunc(conn, *eni.NetworkInterfaceId),
				Timeout: 10 * time.Minute,
			}
			if _, err := stateConf.WaitForState(); err != nil {
				return fmt.Errorf(
					"Error waiting for ENI (%s) to become detached: %s", *eni.NetworkInterfaceId, err)
			}
		}

		deleteNetworkInterfaceParams := &ec2.DeleteNetworkInterfaceInput{
			NetworkInterfaceId: eni.NetworkInterfaceId,
		}
		_, deleteNetworkInterfaceErr := conn.DeleteNetworkInterface(deleteNetworkInterfaceParams)

		if deleteNetworkInterfaceErr != nil {
			return deleteNetworkInterfaceErr
		}
	}

	return nil
}