github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_cloudwatch_event_target.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "regexp" 7 8 "github.com/hashicorp/terraform/helper/resource" 9 "github.com/hashicorp/terraform/helper/schema" 10 11 "github.com/aws/aws-sdk-go/aws" 12 "github.com/aws/aws-sdk-go/aws/awserr" 13 events "github.com/aws/aws-sdk-go/service/cloudwatchevents" 14 ) 15 16 func resourceAwsCloudWatchEventTarget() *schema.Resource { 17 return &schema.Resource{ 18 Create: resourceAwsCloudWatchEventTargetCreate, 19 Read: resourceAwsCloudWatchEventTargetRead, 20 Update: resourceAwsCloudWatchEventTargetUpdate, 21 Delete: resourceAwsCloudWatchEventTargetDelete, 22 23 Schema: map[string]*schema.Schema{ 24 "rule": &schema.Schema{ 25 Type: schema.TypeString, 26 Required: true, 27 ForceNew: true, 28 ValidateFunc: validateCloudWatchEventRuleName, 29 }, 30 31 "target_id": &schema.Schema{ 32 Type: schema.TypeString, 33 Optional: true, 34 Computed: true, 35 ForceNew: true, 36 ValidateFunc: validateCloudWatchEventTargetId, 37 }, 38 39 "arn": &schema.Schema{ 40 Type: schema.TypeString, 41 Required: true, 42 }, 43 44 "input": &schema.Schema{ 45 Type: schema.TypeString, 46 Optional: true, 47 ConflictsWith: []string{"input_path"}, 48 // We could be normalizing the JSON here, 49 // but for built-in targets input may not be JSON 50 }, 51 52 "input_path": &schema.Schema{ 53 Type: schema.TypeString, 54 Optional: true, 55 ConflictsWith: []string{"input"}, 56 }, 57 }, 58 } 59 } 60 61 func resourceAwsCloudWatchEventTargetCreate(d *schema.ResourceData, meta interface{}) error { 62 conn := meta.(*AWSClient).cloudwatcheventsconn 63 64 rule := d.Get("rule").(string) 65 66 var targetId string 67 if v, ok := d.GetOk("target_id"); ok { 68 targetId = v.(string) 69 } else { 70 targetId = resource.UniqueId() 71 d.Set("target_id", targetId) 72 } 73 74 input := buildPutTargetInputStruct(d) 75 log.Printf("[DEBUG] Creating CloudWatch Event Target: %s", input) 76 out, err := conn.PutTargets(input) 77 if err != nil { 78 return fmt.Errorf("Creating CloudWatch Event Target failed: %s", err) 79 } 80 81 if len(out.FailedEntries) > 0 { 82 return fmt.Errorf("Creating CloudWatch Event Target failed: %s", 83 out.FailedEntries) 84 } 85 86 id := rule + "-" + targetId 87 d.SetId(id) 88 89 log.Printf("[INFO] CloudWatch Event Target %q created", d.Id()) 90 91 return resourceAwsCloudWatchEventTargetRead(d, meta) 92 } 93 94 func resourceAwsCloudWatchEventTargetRead(d *schema.ResourceData, meta interface{}) error { 95 conn := meta.(*AWSClient).cloudwatcheventsconn 96 97 t, err := findEventTargetById( 98 d.Get("target_id").(string), 99 d.Get("rule").(string), 100 nil, conn) 101 if err != nil { 102 if regexp.MustCompile(" not found$").MatchString(err.Error()) { 103 log.Printf("[WARN] Removing CloudWatch Event Target %q because it's gone.", d.Id()) 104 d.SetId("") 105 return nil 106 } 107 if awsErr, ok := err.(awserr.Error); ok { 108 // This should never happen, but it's useful 109 // for recovering from https://github.com/hashicorp/terraform/issues/5389 110 if awsErr.Code() == "ValidationException" { 111 log.Printf("[WARN] Removing CloudWatch Event Target %q because it never existed.", d.Id()) 112 d.SetId("") 113 return nil 114 } 115 } 116 return err 117 } 118 log.Printf("[DEBUG] Found Event Target: %s", t) 119 120 d.Set("arn", t.Arn) 121 d.Set("target_id", t.Id) 122 d.Set("input", t.Input) 123 d.Set("input_path", t.InputPath) 124 125 return nil 126 } 127 128 func findEventTargetById(id, rule string, nextToken *string, conn *events.CloudWatchEvents) ( 129 *events.Target, error) { 130 input := events.ListTargetsByRuleInput{ 131 Rule: aws.String(rule), 132 NextToken: nextToken, 133 Limit: aws.Int64(100), // Set limit to allowed maximum to prevent API throttling 134 } 135 log.Printf("[DEBUG] Reading CloudWatch Event Target: %s", input) 136 out, err := conn.ListTargetsByRule(&input) 137 if err != nil { 138 return nil, err 139 } 140 141 for _, t := range out.Targets { 142 if *t.Id == id { 143 return t, nil 144 } 145 } 146 147 if out.NextToken != nil { 148 return findEventTargetById(id, rule, nextToken, conn) 149 } 150 151 return nil, fmt.Errorf("CloudWatch Event Target %q (%q) not found", id, rule) 152 } 153 154 func resourceAwsCloudWatchEventTargetUpdate(d *schema.ResourceData, meta interface{}) error { 155 conn := meta.(*AWSClient).cloudwatcheventsconn 156 157 input := buildPutTargetInputStruct(d) 158 log.Printf("[DEBUG] Updating CloudWatch Event Target: %s", input) 159 _, err := conn.PutTargets(input) 160 if err != nil { 161 return fmt.Errorf("Updating CloudWatch Event Target failed: %s", err) 162 } 163 164 return resourceAwsCloudWatchEventTargetRead(d, meta) 165 } 166 167 func resourceAwsCloudWatchEventTargetDelete(d *schema.ResourceData, meta interface{}) error { 168 conn := meta.(*AWSClient).cloudwatcheventsconn 169 170 input := events.RemoveTargetsInput{ 171 Ids: []*string{aws.String(d.Get("target_id").(string))}, 172 Rule: aws.String(d.Get("rule").(string)), 173 } 174 log.Printf("[INFO] Deleting CloudWatch Event Target: %s", input) 175 _, err := conn.RemoveTargets(&input) 176 if err != nil { 177 return fmt.Errorf("Error deleting CloudWatch Event Target: %s", err) 178 } 179 log.Println("[INFO] CloudWatch Event Target deleted") 180 181 d.SetId("") 182 183 return nil 184 } 185 186 func buildPutTargetInputStruct(d *schema.ResourceData) *events.PutTargetsInput { 187 e := &events.Target{ 188 Arn: aws.String(d.Get("arn").(string)), 189 Id: aws.String(d.Get("target_id").(string)), 190 } 191 192 if v, ok := d.GetOk("input"); ok { 193 e.Input = aws.String(v.(string)) 194 } 195 if v, ok := d.GetOk("input_path"); ok { 196 e.InputPath = aws.String(v.(string)) 197 } 198 199 input := events.PutTargetsInput{ 200 Rule: aws.String(d.Get("rule").(string)), 201 Targets: []*events.Target{e}, 202 } 203 204 return &input 205 }