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