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  }