diff --git a/builtin/providers/aws/resource_aws_alb.go b/builtin/providers/aws/resource_aws_alb.go index 0668ed4af..da26ce49b 100644 --- a/builtin/providers/aws/resource_aws_alb.go +++ b/builtin/providers/aws/resource_aws_alb.go @@ -3,6 +3,7 @@ package aws import ( "fmt" "log" + "regexp" "strconv" "github.com/aws/aws-sdk-go/aws" @@ -28,6 +29,11 @@ func resourceAwsAlb() *schema.Resource { Computed: true, }, + "arn_suffix": { + Type: schema.TypeString, + Computed: true, + }, + "name": { Type: schema.TypeString, Optional: true, @@ -191,6 +197,7 @@ func resourceAwsAlbRead(d *schema.ResourceData, meta interface{}) error { alb := describeResp.LoadBalancers[0] d.Set("arn", alb.LoadBalancerArn) + d.Set("arn_suffix", albSuffixFromARN(alb.LoadBalancerArn)) d.Set("name", alb.LoadBalancerName) d.Set("internal", (alb.Scheme != nil && *alb.Scheme == "internal")) d.Set("security_groups", flattenStringList(alb.SecurityGroups)) @@ -345,3 +352,17 @@ func flattenSubnetsFromAvailabilityZones(availabilityZones []*elbv2.Availability } return result } + +func albSuffixFromARN(arn *string) string { + if arn == nil { + return "" + } + + if arnComponents := regexp.MustCompile(`arn:.*:loadbalancer/(.*)`).FindAllStringSubmatch(*arn, -1); len(arnComponents) == 1 { + if len(arnComponents[0]) == 2 { + return arnComponents[0][1] + } + } + + return "" +} diff --git a/builtin/providers/aws/resource_aws_alb_test.go b/builtin/providers/aws/resource_aws_alb_test.go index d6d5a48f8..168eda6c1 100644 --- a/builtin/providers/aws/resource_aws_alb_test.go +++ b/builtin/providers/aws/resource_aws_alb_test.go @@ -14,6 +14,37 @@ import ( "github.com/hashicorp/terraform/terraform" ) +func TestALBCloudwatchSuffixFromARN(t *testing.T) { + cases := []struct { + name string + arn *string + suffix string + }{ + { + name: "valid suffix", + arn: aws.String(`arn:aws:elasticloadbalancing:us-east-1:123456:loadbalancer/app/my-alb/abc123`), + suffix: `app/my-alb/abc123`, + }, + { + name: "no suffix", + arn: aws.String(`arn:aws:elasticloadbalancing:us-east-1:123456:loadbalancer`), + suffix: ``, + }, + { + name: "nil ARN", + arn: nil, + suffix: ``, + }, + } + + for _, tc := range cases { + actual := albSuffixFromARN(tc.arn) + if actual != tc.suffix { + t.Fatalf("bad suffix: %q\nExpected: %s\n Got: %s", tc.name, tc.suffix, actual) + } + } +} + func TestAccAWSALB_basic(t *testing.T) { var conf elbv2.LoadBalancer albName := fmt.Sprintf("testaccawsalb-basic-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum)) diff --git a/website/source/docs/providers/aws/r/alb.html.markdown b/website/source/docs/providers/aws/r/alb.html.markdown index c4b258253..e69a92a87 100644 --- a/website/source/docs/providers/aws/r/alb.html.markdown +++ b/website/source/docs/providers/aws/r/alb.html.markdown @@ -59,11 +59,12 @@ Access Logs (`access_logs`) support the following: The following attributes are exported in addition to the arguments listed above: -* `id` - The ARN of the load balancer (matches `arn`) -* `arn` - The ARN of the load balancer (matches `id`) -* `dns_name` - The DNS name of the load balancer +* `id` - The ARN of the load balancer (matches `arn`). +* `arn` - The ARN of the load balancer (matches `id`). +* `arn_suffix` - The ARN suffix for use with CloudWatch Metrics. +* `dns_name` - The DNS name of the load balancer. * `canonical_hosted_zone_id` - The canonical hosted zone ID of the load balancer. -* `zone_id` - The canonical hosted zone ID of the load balancer (to be used in a Route 53 Alias record) +* `zone_id` - The canonical hosted zone ID of the load balancer (to be used in a Route 53 Alias record). ## Import