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