github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_vpc_endpoint.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/ec2" 10 "github.com/hashicorp/terraform/helper/schema" 11 ) 12 13 func resourceAwsVpcEndpoint() *schema.Resource { 14 return &schema.Resource{ 15 Create: resourceAwsVPCEndpointCreate, 16 Read: resourceAwsVPCEndpointRead, 17 Update: resourceAwsVPCEndpointUpdate, 18 Delete: resourceAwsVPCEndpointDelete, 19 Schema: map[string]*schema.Schema{ 20 "policy": &schema.Schema{ 21 Type: schema.TypeString, 22 Optional: true, 23 Computed: true, 24 StateFunc: normalizeJson, 25 }, 26 "vpc_id": &schema.Schema{ 27 Type: schema.TypeString, 28 Required: true, 29 ForceNew: true, 30 }, 31 "service_name": &schema.Schema{ 32 Type: schema.TypeString, 33 Required: true, 34 ForceNew: true, 35 }, 36 "route_table_ids": &schema.Schema{ 37 Type: schema.TypeSet, 38 Optional: true, 39 Elem: &schema.Schema{Type: schema.TypeString}, 40 Set: schema.HashString, 41 }, 42 }, 43 } 44 } 45 46 func resourceAwsVPCEndpointCreate(d *schema.ResourceData, meta interface{}) error { 47 conn := meta.(*AWSClient).ec2conn 48 input := &ec2.CreateVpcEndpointInput{ 49 VpcId: aws.String(d.Get("vpc_id").(string)), 50 RouteTableIds: expandStringList(d.Get("route_table_ids").(*schema.Set).List()), 51 ServiceName: aws.String(d.Get("service_name").(string)), 52 } 53 54 if v, ok := d.GetOk("policy"); ok { 55 policy := normalizeJson(v) 56 input.PolicyDocument = aws.String(policy) 57 } 58 59 log.Printf("[DEBUG] Creating VPC Endpoint: %#v", input) 60 output, err := conn.CreateVpcEndpoint(input) 61 if err != nil { 62 return fmt.Errorf("Error creating VPC Endpoint: %s", err) 63 } 64 log.Printf("[DEBUG] VPC Endpoint %q created.", *output.VpcEndpoint.VpcEndpointId) 65 66 d.SetId(*output.VpcEndpoint.VpcEndpointId) 67 68 return resourceAwsVPCEndpointRead(d, meta) 69 } 70 71 func resourceAwsVPCEndpointRead(d *schema.ResourceData, meta interface{}) error { 72 conn := meta.(*AWSClient).ec2conn 73 input := &ec2.DescribeVpcEndpointsInput{ 74 VpcEndpointIds: []*string{aws.String(d.Id())}, 75 } 76 77 log.Printf("[DEBUG] Reading VPC Endpoint: %q", d.Id()) 78 output, err := conn.DescribeVpcEndpoints(input) 79 80 if err != nil { 81 ec2err, ok := err.(awserr.Error) 82 if !ok { 83 return fmt.Errorf("Error reading VPC Endpoint: %s", err.Error()) 84 } 85 86 if ec2err.Code() == "InvalidVpcEndpointId.NotFound" { 87 return nil 88 } 89 90 return fmt.Errorf("Error reading VPC Endpoint: %s", err.Error()) 91 } 92 93 if len(output.VpcEndpoints) != 1 { 94 return fmt.Errorf("There's no unique VPC Endpoint, but %d endpoints: %#v", 95 len(output.VpcEndpoints), output.VpcEndpoints) 96 } 97 98 vpce := output.VpcEndpoints[0] 99 100 d.Set("vpc_id", vpce.VpcId) 101 d.Set("policy", normalizeJson(*vpce.PolicyDocument)) 102 d.Set("service_name", vpce.ServiceName) 103 if err := d.Set("route_table_ids", aws.StringValueSlice(vpce.RouteTableIds)); err != nil { 104 return err 105 } 106 107 return nil 108 } 109 110 func resourceAwsVPCEndpointUpdate(d *schema.ResourceData, meta interface{}) error { 111 conn := meta.(*AWSClient).ec2conn 112 input := &ec2.ModifyVpcEndpointInput{ 113 VpcEndpointId: aws.String(d.Id()), 114 } 115 116 if d.HasChange("route_table_ids") { 117 o, n := d.GetChange("route_table_ids") 118 os := o.(*schema.Set) 119 ns := n.(*schema.Set) 120 121 add := expandStringList(ns.Difference(os).List()) 122 if len(add) > 0 { 123 input.AddRouteTableIds = add 124 } 125 126 remove := expandStringList(os.Difference(ns).List()) 127 if len(remove) > 0 { 128 input.RemoveRouteTableIds = remove 129 } 130 } 131 132 if d.HasChange("policy") { 133 policy := normalizeJson(d.Get("policy")) 134 input.PolicyDocument = aws.String(policy) 135 } 136 137 log.Printf("[DEBUG] Updating VPC Endpoint: %#v", input) 138 _, err := conn.ModifyVpcEndpoint(input) 139 if err != nil { 140 return fmt.Errorf("Error updating VPC Endpoint: %s", err) 141 } 142 log.Printf("[DEBUG] VPC Endpoint %q updated", input.VpcEndpointId) 143 144 return resourceAwsVPCEndpointRead(d, meta) 145 } 146 147 func resourceAwsVPCEndpointDelete(d *schema.ResourceData, meta interface{}) error { 148 conn := meta.(*AWSClient).ec2conn 149 input := &ec2.DeleteVpcEndpointsInput{ 150 VpcEndpointIds: []*string{aws.String(d.Id())}, 151 } 152 153 log.Printf("[DEBUG] Deleting VPC Endpoint: %#v", input) 154 _, err := conn.DeleteVpcEndpoints(input) 155 156 if err != nil { 157 ec2err, ok := err.(awserr.Error) 158 if !ok { 159 return fmt.Errorf("Error deleting VPC Endpoint: %s", err.Error()) 160 } 161 162 if ec2err.Code() == "InvalidVpcEndpointId.NotFound" { 163 log.Printf("[DEBUG] VPC Endpoint %q is already gone", d.Id()) 164 } else { 165 return fmt.Errorf("Error deleting VPC Endpoint: %s", err.Error()) 166 } 167 } 168 169 log.Printf("[DEBUG] VPC Endpoint %q deleted", d.Id()) 170 d.SetId("") 171 172 return nil 173 }