diff --git a/aws/resource_aws_sns_topic_subscription.go b/aws/resource_aws_sns_topic_subscription.go index abe86b168dd3..a1c499c53d99 100644 --- a/aws/resource_aws_sns_topic_subscription.go +++ b/aws/resource_aws_sns_topic_subscription.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" + "github.com/hashicorp/terraform/helper/structure" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" @@ -24,6 +25,7 @@ var SNSSubscriptionAttributeMap = map[string]string{ "endpoint": "Endpoint", "protocol": "Protocol", "raw_message_delivery": "RawMessageDelivery", + "filter_policy": "FilterPolicy", } func resourceAwsSnsTopicSubscription() *schema.Resource { @@ -76,6 +78,16 @@ func resourceAwsSnsTopicSubscription() *schema.Resource { Type: schema.TypeString, Computed: true, }, + "filter_policy": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validateJsonString, + DiffSuppressFunc: suppressEquivalentJsonDiffs, + StateFunc: func(v interface{}) string { + json, _ := structure.NormalizeJsonString(v) + return json + }, + }, }, } } @@ -127,6 +139,22 @@ func resourceAwsSnsTopicSubscriptionUpdate(d *schema.ResourceData, meta interfac } } + if d.HasChange("filter_policy") { + _, n := d.GetChange("filter_policy") + + attrValue := n.(string) + + req := &sns.SetSubscriptionAttributesInput{ + SubscriptionArn: aws.String(d.Id()), + AttributeName: aws.String("FilterPolicy"), + AttributeValue: aws.String(attrValue), + } + _, err := snsconn.SetSubscriptionAttributes(req) + + if err != nil { + return fmt.Errorf("Unable to set filter policy attribute on subscription: %s", err) + } + } return resourceAwsSnsTopicSubscriptionRead(d, meta) } diff --git a/aws/resource_aws_sns_topic_subscription_test.go b/aws/resource_aws_sns_topic_subscription_test.go index 9fb9616b2320..df9170614dfb 100644 --- a/aws/resource_aws_sns_topic_subscription_test.go +++ b/aws/resource_aws_sns_topic_subscription_test.go @@ -2,6 +2,7 @@ package aws import ( "fmt" + "strconv" "testing" "github.com/aws/aws-sdk-go/aws" @@ -31,6 +32,27 @@ func TestAccAWSSNSTopicSubscription_basic(t *testing.T) { }) } +func TestAccAWSSNSTopicSubscription_filterPolicy(t *testing.T) { + ri := acctest.RandInt() + filterPolicy1 := `{"key1": ["val1"], "key2": ["val2"]}` + filterPolicy2 := `{"key3": ["val3"], "key4": ["val4"]}` + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSSNSTopicSubscriptionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSSNSTopicSubscriptionConfig_filterPolicy(ri, strconv.Quote(filterPolicy1)), + Check: resource.TestCheckResourceAttr("aws_sns_topic_subscription.test_subscription", "filter_policy", filterPolicy1), + }, + { + Config: testAccAWSSNSTopicSubscriptionConfig_filterPolicy(ri, strconv.Quote(filterPolicy2)), + Check: resource.TestCheckResourceAttr("aws_sns_topic_subscription.test_subscription", "filter_policy", filterPolicy2), + }, + }, + }) +} func TestAccAWSSNSTopicSubscription_autoConfirmingEndpoint(t *testing.T) { ri := acctest.RandInt() @@ -157,6 +179,25 @@ resource "aws_sns_topic_subscription" "test_subscription" { `, i, i) } +func testAccAWSSNSTopicSubscriptionConfig_filterPolicy(i int, policy string) string { + return fmt.Sprintf(` +resource "aws_sns_topic" "test_topic" { + name = "terraform-test-topic-%d" +} + +resource "aws_sqs_queue" "test_queue" { + name = "terraform-subscription-test-queue-%d" +} + +resource "aws_sns_topic_subscription" "test_subscription" { + topic_arn = "${aws_sns_topic.test_topic.arn}" + protocol = "sqs" + endpoint = "${aws_sqs_queue.test_queue.arn}" + filter_policy = %s + } +`, i, i, policy) +} + func testAccAWSSNSTopicSubscriptionConfig_autoConfirmingEndpoint(i int) string { return fmt.Sprintf(` resource "aws_sns_topic" "test_topic" {