github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/aws/resource_aws_egress_only_internet_gateway.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/aws/awserr" 10 "github.com/aws/aws-sdk-go/service/ec2" 11 "github.com/hashicorp/errwrap" 12 "github.com/hashicorp/terraform/helper/resource" 13 "github.com/hashicorp/terraform/helper/schema" 14 ) 15 16 func resourceAwsEgressOnlyInternetGateway() *schema.Resource { 17 return &schema.Resource{ 18 Create: resourceAwsEgressOnlyInternetGatewayCreate, 19 Read: resourceAwsEgressOnlyInternetGatewayRead, 20 Delete: resourceAwsEgressOnlyInternetGatewayDelete, 21 22 Schema: map[string]*schema.Schema{ 23 "vpc_id": { 24 Type: schema.TypeString, 25 Required: true, 26 ForceNew: true, 27 }, 28 }, 29 } 30 } 31 32 func resourceAwsEgressOnlyInternetGatewayCreate(d *schema.ResourceData, meta interface{}) error { 33 conn := meta.(*AWSClient).ec2conn 34 35 resp, err := conn.CreateEgressOnlyInternetGateway(&ec2.CreateEgressOnlyInternetGatewayInput{ 36 VpcId: aws.String(d.Get("vpc_id").(string)), 37 }) 38 if err != nil { 39 return fmt.Errorf("Error creating egress internet gateway: %s", err) 40 } 41 42 d.SetId(*resp.EgressOnlyInternetGateway.EgressOnlyInternetGatewayId) 43 44 err = resource.Retry(5*time.Minute, func() *resource.RetryError { 45 igRaw, _, err := EIGWStateRefreshFunc(conn, d.Id())() 46 if igRaw != nil { 47 return nil 48 } 49 if err == nil { 50 return resource.RetryableError(err) 51 } else { 52 return resource.NonRetryableError(err) 53 } 54 }) 55 56 if err != nil { 57 return errwrap.Wrapf("{{err}}", err) 58 } 59 60 return resourceAwsEgressOnlyInternetGatewayRead(d, meta) 61 } 62 63 func EIGWStateRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc { 64 return func() (interface{}, string, error) { 65 resp, err := conn.DescribeEgressOnlyInternetGateways(&ec2.DescribeEgressOnlyInternetGatewaysInput{ 66 EgressOnlyInternetGatewayIds: []*string{aws.String(id)}, 67 }) 68 if err != nil { 69 ec2err, ok := err.(awserr.Error) 70 if ok && ec2err.Code() == "InvalidEgressInternetGatewayID.NotFound" { 71 resp = nil 72 } else { 73 log.Printf("[ERROR] Error on EIGWStateRefreshFunc: %s", err) 74 return nil, "", err 75 } 76 } 77 if len(resp.EgressOnlyInternetGateways) < 1 { 78 resp = nil 79 } 80 81 if resp == nil { 82 // Sometimes AWS just has consistency issues and doesn't see 83 // our instance yet. Return an empty state. 84 return nil, "", nil 85 } 86 87 ig := resp.EgressOnlyInternetGateways[0] 88 return ig, "available", nil 89 } 90 } 91 92 func resourceAwsEgressOnlyInternetGatewayRead(d *schema.ResourceData, meta interface{}) error { 93 conn := meta.(*AWSClient).ec2conn 94 95 resp, err := conn.DescribeEgressOnlyInternetGateways(&ec2.DescribeEgressOnlyInternetGatewaysInput{ 96 EgressOnlyInternetGatewayIds: []*string{aws.String(d.Id())}, 97 }) 98 if err != nil { 99 return fmt.Errorf("Error describing egress internet gateway: %s", err) 100 } 101 102 found := false 103 for _, igw := range resp.EgressOnlyInternetGateways { 104 if *igw.EgressOnlyInternetGatewayId == d.Id() { 105 found = true 106 } 107 } 108 109 if !found { 110 log.Printf("[Error] Cannot find Egress Only Internet Gateway: %q", d.Id()) 111 d.SetId("") 112 return nil 113 } 114 115 return nil 116 } 117 118 func resourceAwsEgressOnlyInternetGatewayDelete(d *schema.ResourceData, meta interface{}) error { 119 conn := meta.(*AWSClient).ec2conn 120 121 _, err := conn.DeleteEgressOnlyInternetGateway(&ec2.DeleteEgressOnlyInternetGatewayInput{ 122 EgressOnlyInternetGatewayId: aws.String(d.Id()), 123 }) 124 if err != nil { 125 return fmt.Errorf("Error deleting egress internet gateway: %s", err) 126 } 127 128 return nil 129 }