github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_alb_target_group_attachment.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/aws/aws-sdk-go/aws" 8 "github.com/aws/aws-sdk-go/aws/awserr" 9 "github.com/aws/aws-sdk-go/service/elbv2" 10 "github.com/hashicorp/errwrap" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/helper/schema" 13 ) 14 15 func resourceAwsAlbTargetGroupAttachment() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceAwsAlbAttachmentCreate, 18 Read: resourceAwsAlbAttachmentRead, 19 Delete: resourceAwsAlbAttachmentDelete, 20 21 Schema: map[string]*schema.Schema{ 22 "target_group_arn": { 23 Type: schema.TypeString, 24 ForceNew: true, 25 Required: true, 26 }, 27 28 "target_id": { 29 Type: schema.TypeString, 30 ForceNew: true, 31 Required: true, 32 }, 33 34 "port": { 35 Type: schema.TypeInt, 36 ForceNew: true, 37 Required: true, 38 }, 39 }, 40 } 41 } 42 43 func resourceAwsAlbAttachmentCreate(d *schema.ResourceData, meta interface{}) error { 44 elbconn := meta.(*AWSClient).elbv2conn 45 46 params := &elbv2.RegisterTargetsInput{ 47 TargetGroupArn: aws.String(d.Get("target_group_arn").(string)), 48 Targets: []*elbv2.TargetDescription{ 49 { 50 Id: aws.String(d.Get("target_id").(string)), 51 Port: aws.Int64(int64(d.Get("port").(int))), 52 }, 53 }, 54 } 55 56 log.Printf("[INFO] Registering Target %s (%d) with Target Group %s", d.Get("target_id").(string), 57 d.Get("port").(int), d.Get("target_group_arn").(string)) 58 59 _, err := elbconn.RegisterTargets(params) 60 if err != nil { 61 return errwrap.Wrapf("Error registering targets with target group: {{err}}", err) 62 } 63 64 d.SetId(resource.PrefixedUniqueId(fmt.Sprintf("%s-", d.Get("target_group_arn")))) 65 66 return nil 67 } 68 69 func resourceAwsAlbAttachmentDelete(d *schema.ResourceData, meta interface{}) error { 70 elbconn := meta.(*AWSClient).elbv2conn 71 72 params := &elbv2.DeregisterTargetsInput{ 73 TargetGroupArn: aws.String(d.Get("target_group_arn").(string)), 74 Targets: []*elbv2.TargetDescription{ 75 { 76 Id: aws.String(d.Get("target_id").(string)), 77 Port: aws.Int64(int64(d.Get("port").(int))), 78 }, 79 }, 80 } 81 82 _, err := elbconn.DeregisterTargets(params) 83 if err != nil && !isTargetGroupNotFound(err) { 84 return errwrap.Wrapf("Error deregistering Targets: {{err}}", err) 85 } 86 87 d.SetId("") 88 89 return nil 90 } 91 92 // resourceAwsAlbAttachmentRead requires all of the fields in order to describe the correct 93 // target, so there is no work to do beyond ensuring that the target and group still exist. 94 func resourceAwsAlbAttachmentRead(d *schema.ResourceData, meta interface{}) error { 95 elbconn := meta.(*AWSClient).elbv2conn 96 resp, err := elbconn.DescribeTargetHealth(&elbv2.DescribeTargetHealthInput{ 97 TargetGroupArn: aws.String(d.Get("target_group_arn").(string)), 98 Targets: []*elbv2.TargetDescription{ 99 { 100 Id: aws.String(d.Get("target_id").(string)), 101 Port: aws.Int64(int64(d.Get("port").(int))), 102 }, 103 }, 104 }) 105 if err != nil { 106 if isTargetGroupNotFound(err) { 107 log.Printf("[WARN] Target group does not exist, removing target attachment %s", d.Id()) 108 d.SetId("") 109 return nil 110 } 111 if isInvalidTarget(err) { 112 log.Printf("[WARN] Target does not exist, removing target attachment %s", d.Id()) 113 d.SetId("") 114 return nil 115 } 116 return errwrap.Wrapf("Error reading Target Health: {{err}}", err) 117 } 118 119 if len(resp.TargetHealthDescriptions) != 1 { 120 log.Printf("[WARN] Target does not exist, removing target attachment %s", d.Id()) 121 d.SetId("") 122 return nil 123 } 124 125 return nil 126 } 127 128 func isInvalidTarget(err error) bool { 129 elberr, ok := err.(awserr.Error) 130 return ok && elberr.Code() == "InvalidTarget" 131 }