github.com/timsutton/packer@v1.3.2/builder/amazon/common/step_deregister_ami.go (about) 1 package common 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/aws/aws-sdk-go/aws" 8 "github.com/aws/aws-sdk-go/service/ec2" 9 "github.com/hashicorp/packer/helper/multistep" 10 "github.com/hashicorp/packer/packer" 11 ) 12 13 type StepDeregisterAMI struct { 14 AccessConfig *AccessConfig 15 ForceDeregister bool 16 ForceDeleteSnapshot bool 17 AMIName string 18 Regions []string 19 } 20 21 func (s *StepDeregisterAMI) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { 22 // Check for force deregister 23 if !s.ForceDeregister { 24 return multistep.ActionContinue 25 } 26 27 ui := state.Get("ui").(packer.Ui) 28 ec2conn := state.Get("ec2").(*ec2.EC2) 29 // Add the session region to list of regions will will deregister AMIs in 30 regions := append(s.Regions, *ec2conn.Config.Region) 31 32 for _, region := range regions { 33 // get new connection for each region in which we need to deregister vms 34 session, err := s.AccessConfig.Session() 35 if err != nil { 36 return multistep.ActionHalt 37 } 38 39 regionconn := ec2.New(session.Copy(&aws.Config{ 40 Region: aws.String(region)}, 41 )) 42 43 resp, err := regionconn.DescribeImages(&ec2.DescribeImagesInput{ 44 Owners: aws.StringSlice([]string{"self"}), 45 Filters: []*ec2.Filter{{ 46 Name: aws.String("name"), 47 Values: aws.StringSlice([]string{s.AMIName}), 48 }}}) 49 50 if err != nil { 51 err := fmt.Errorf("Error describing AMI: %s", err) 52 state.Put("error", err) 53 ui.Error(err.Error()) 54 return multistep.ActionHalt 55 } 56 57 // Deregister image(s) by name 58 for _, i := range resp.Images { 59 _, err := regionconn.DeregisterImage(&ec2.DeregisterImageInput{ 60 ImageId: i.ImageId, 61 }) 62 63 if err != nil { 64 err := fmt.Errorf("Error deregistering existing AMI: %s", err) 65 state.Put("error", err) 66 ui.Error(err.Error()) 67 return multistep.ActionHalt 68 } 69 ui.Say(fmt.Sprintf("Deregistered AMI %s, id: %s", s.AMIName, *i.ImageId)) 70 71 // Delete snapshot(s) by image 72 if s.ForceDeleteSnapshot { 73 for _, b := range i.BlockDeviceMappings { 74 if b.Ebs != nil && aws.StringValue(b.Ebs.SnapshotId) != "" { 75 _, err := regionconn.DeleteSnapshot(&ec2.DeleteSnapshotInput{ 76 SnapshotId: b.Ebs.SnapshotId, 77 }) 78 79 if err != nil { 80 err := fmt.Errorf("Error deleting existing snapshot: %s", err) 81 state.Put("error", err) 82 ui.Error(err.Error()) 83 return multistep.ActionHalt 84 } 85 ui.Say(fmt.Sprintf("Deleted snapshot: %s", *b.Ebs.SnapshotId)) 86 } 87 } 88 } 89 } 90 } 91 92 return multistep.ActionContinue 93 } 94 95 func (s *StepDeregisterAMI) Cleanup(state multistep.StateBag) { 96 }