user2976753
user2976753

Reputation: 966

Property validation failure "SNSDestination" while creating a ConfigurationSetEventDestination from CloudFormation

I'm trying to create a ConfigurationSetEventDestination using serverless resources but it not recognizing the EventDestination for value SNSDestination, here is the output.

enter image description here

And here the resource from serverless.yml

resources:
  Resources:
    HandleEmailsEvents:
      Type: AWS::SNS::Topic
      Properties:
        DisplayName: 'Handle emails events (${self:custom.stage})'
        TopicName: 'HandleEmailsEvents'
    ConfigurationSet:
      Type: 'AWS::SES::ConfigurationSet'
      Properties:
        Name: 'EMAIL_TRACKING'
    ConfigurationSetEventDestination:
      Type: 'AWS::SES::ConfigurationSetEventDestination'
      Properties:
        ConfigurationSetName: 'EMAIL_TRACKING'
        EventDestination:
          Name: 'EMAIL_TRACKING_DESTINATION'
          Enabled: true
          MatchingEventTypes:
            - bounce
            - complaint
          SNSDestination:
            TopicARN:
              Ref: 'HandleEmailsEvents'

Following the documentation ConfigurationSetEventDestination EventDestination seems to not be available, but here it is with this description object.

SNSDestination is also available when creating from console

enter image description here

@AWS What's going on here?

Thanks,

PS: I'm not the only one...

https://forums.aws.amazon.com/thread.jspa?messageID=858616&#858616

https://forums.aws.amazon.com/thread.jspa?messageID=809004&#809004

https://forums.aws.amazon.com/thread.jspa?messageID=848013&#848013

[UPDATED]

I tried creating the same via nodejs sdk, it works, its possible, docs here.

Could be something with serverless CloudFormation generated stack?

let ses = new AWS.SES()
const destinationParams = {
  ConfigurationSetName: 'test',
  EventDestination: {
    Name: 'xxxxx2',
    MatchingEventTypes: ['send', 'reject', 'bounce', 'complaint', 'delivery', 'open', 'click'],
    Enabled: true,
    SNSDestination: {
      TopicARN: 'arn:aws:sns:us-east-1:xxxxxxxxxx:test',
    },
  },
};

ses.createConfigurationSetEventDestination(destinationParams, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

enter image description here

Upvotes: 4

Views: 577

Answers (2)

I found a solution, if you are using serverless framework.

1- Create a Resource to create the ConfigurationSet in serverless.yml

resources:
  Resources:
    ConfigurationSet:
      Type: 'AWS::SES::ConfigurationSet'
      Properties:
        Name: 'EMAIL_TRACKING'

2- Install serverless-ses-sns

npm install --save-dev serverless-ses-sns

3- Add to serverless.yml

plugins:
  - serverless-ses-sns

4- Finally add the configuration in serverless.yml

custom:
  snsDestination:
    region: <region> # If absent, self:provider.region will be used
    configurationSet: 'EMAIL_TRACKING'
    topicArn: <topic arn> # If absent, one will be created
    events: # One or more of the following
      - renderingFailure
      - reject
      - bounce
      - send
      - complaint
      - delivery
      - open
      - click

Reference for the plugin

Upvotes: 1

noobie-php
noobie-php

Reputation: 7233

I also stumbled upon the same issue, so as of now, SNS cannot be passed as an event destination using cloudformation. For more info refer to the link, Do checkout the NOTE, its explicitly mentioned there.

Upvotes: 0

Related Questions