SNS supports custom delivery policies when using HTTP/S. In the example above, we use default policy that AWS creates for new topics. The only difference is maxDelayTarget which has default value 20, was changed to 30 for testing.
Details for customizing the policy are here: https://docs.aws.amazon.com/sns/latest/dg/sns-message-delivery-retries.html#creating-delivery-policy
For HTTP delivery policy, you may also provide two IAM role ARNs. These ARNs (created outside of this module) allow SNS to send logs to cloudwatch for success and failure deliveries.
Feedback roles should be created as trust policy below
{"treedata":{"name":"root","toggled":true,"children":[{"name":".circleci","children":[{"name":"config.yml","path":".circleci/config.yml","sha":"4a047069b7913e939a32135bc5f0695605ae1053"},{"name":"post-upgrade-test-results.sh","path":".circleci/post-upgrade-test-results.sh","sha":"a4867e8fbdc334b7a90259568ee41ea577fbe764"},{"name":"set-upgrade-test-vars.sh","path":".circleci/set-upgrade-test-vars.sh","sha":"847835f9da4ec8456ddce45f6473f0e21474efd9"}]},{"name":".github","children":[{"name":"ISSUE_TEMPLATE","children":[{"name":"bug_report.md","path":".github/ISSUE_TEMPLATE/bug_report.md","sha":"d2e87e27c601e423865ed660ec697082470ca60f"},{"name":"feature_request.md","path":".github/ISSUE_TEMPLATE/feature_request.md","sha":"023a33099be2336476930c96e17ff1ba5dc55348"}]},{"name":"pull_request_template.md","path":".github/pull_request_template.md","sha":"6b100e40e323b5b07f40ed30616277c51c9f4b9e"}]},{"name":".gitignore","path":".gitignore","sha":"1b13a3bf1f1425e2e779cbf1a40a88e74a24f57b"},{"name":".pre-commit-config.yaml","path":".pre-commit-config.yaml","sha":"1d8f329691fa148e29c9f4b1628b118d253d94a3"},{"name":"CODEOWNERS","path":"CODEOWNERS","sha":"c2c7f3dfdcdf5c0fc535998d206a897a1e9a6f67"},{"name":"LICENSE.txt","path":"LICENSE.txt","sha":"947b78a929481a192a688dbcd8aef5e959102397"},{"name":"README.md","path":"README.md","sha":"aee4ffa5875881a7308befe61a08dcdd3e62ecd2"},{"name":"examples","children":[{"name":"kinesis","children":[{"name":"README.md","path":"examples/kinesis/README.md","sha":"a10663a758592a4001140edd7eff20d1dcf64b36"},{"name":"main.tf","path":"examples/kinesis/main.tf","sha":"b4b9de8690fe0af7e799b5f2a8e58dda1765b329"},{"name":"outputs.tf","path":"examples/kinesis/outputs.tf","sha":"952a5cf88e478992ff28c5774e8f37217f89d296"},{"name":"variables.tf","path":"examples/kinesis/variables.tf","sha":"1065357fa72427e839f19969607c92a217fecd62"}]},{"name":"msk-with-iam-auth","children":[{"name":"README.md","path":"examples/msk-with-iam-auth/README.md","sha":"6af235e4cfa4afd19d919742748ffa53b053f572"},{"name":"main.tf","path":"examples/msk-with-iam-auth/main.tf","sha":"8ba709204b93852e559ca311397eaf85a0ac2ae6"},{"name":"outputs.tf","path":"examples/msk-with-iam-auth/outputs.tf","sha":"ef6b634e22db3e19f2e7848a0a0410c2f7f72035"},{"name":"user-data","children":[{"name":"user-data.sh","path":"examples/msk-with-iam-auth/user-data/user-data.sh","sha":"37084170a864f40703074f41d8237b02940ae003"}]},{"name":"variables.tf","path":"examples/msk-with-iam-auth/variables.tf","sha":"d996ce5636f593477f44241c5e93aefb4226f504"}]},{"name":"sns-sqs-connection","children":[{"name":"README.md","path":"examples/sns-sqs-connection/README.md","sha":"9ab1842aef0a29fd9df9d9895052b8b008e92628"},{"name":"main.tf","path":"examples/sns-sqs-connection/main.tf","sha":"839a9ee43ef29b97ee8745c2fc4fd9bb62008e04"},{"name":"outputs.tf","path":"examples/sns-sqs-connection/outputs.tf","sha":"cbe0132f92c314bf95992232cd4e733102e7b08c"},{"name":"variables.tf","path":"examples/sns-sqs-connection/variables.tf","sha":"62ad583ebbafbfdf66f2149f453a88ae45ec14ea"}]},{"name":"sns","children":[{"name":"README.md","path":"examples/sns/README.md","sha":"d20e499ef9e61789460c42b65d84698cba354ffe"},{"name":"main.tf","path":"examples/sns/main.tf","sha":"2f75d60b1df7c0387d84b8c878134fe5e6f09f6b"},{"name":"outputs.tf","path":"examples/sns/outputs.tf","sha":"4f3fdd7d70805e7c7520730b598dca452785ecc5"},{"name":"variables.tf","path":"examples/sns/variables.tf","sha":"36263569e5b9c4e90e3515673b7b0e289f2587b5"}]},{"name":"sqs-lambda-connection","children":[{"name":"README.md","path":"examples/sqs-lambda-connection/README.md","sha":"a93b874b1b91e8a08d5f3728537038a0ec8bfaa2"},{"name":"main.tf","path":"examples/sqs-lambda-connection/main.tf","sha":"bce89d1e78e8299cc106603615dd6c62dac01c92"},{"name":"outputs.tf","path":"examples/sqs-lambda-connection/outputs.tf","sha":"3dd33dd0e765e67e1c717330a95254a6c4f4e054"},{"name":"variables.tf","path":"examples/sqs-lambda-connection/variables.tf","sha":"64b2b533875ba3563998fe014d09a77076fe00e4"}]},{"name":"sqs","children":[{"name":"dead-letter-queue","children":[{"name":"README.md","path":"examples/sqs/dead-letter-queue/README.md","sha":"afb19a5c1926f3cc1192151c7d8ee1851da5bd7f"},{"name":"main.tf","path":"examples/sqs/dead-letter-queue/main.tf","sha":"1e024ec085c9481487afe6fe01ee2483387df86e"},{"name":"outputs.tf","path":"examples/sqs/dead-letter-queue/outputs.tf","sha":"b3d13e984797fab06aeae8abfd599b2a0f12d9f8"},{"name":"variables.tf","path":"examples/sqs/dead-letter-queue/variables.tf","sha":"5b3ac6fcefb6b6a9b2ed2bf31a08fb319277b643"}]},{"name":"fifo-queue-with-encryption","children":[{"name":"README.md","path":"examples/sqs/fifo-queue-with-encryption/README.md","sha":"56fcb9edfe2c4befd84fb31109598845ab48ba74"},{"name":"main.tf","path":"examples/sqs/fifo-queue-with-encryption/main.tf","sha":"816f695b83f60b71571c7b51a5f1389085b2db83"},{"name":"outputs.tf","path":"examples/sqs/fifo-queue-with-encryption/outputs.tf","sha":"b3d13e984797fab06aeae8abfd599b2a0f12d9f8"},{"name":"variables.tf","path":"examples/sqs/fifo-queue-with-encryption/variables.tf","sha":"7155c480e6a99e1d998ec9a222e2d16378d90ce3"}]},{"name":"no-dead-letter-queue","children":[{"name":"README.md","path":"examples/sqs/no-dead-letter-queue/README.md","sha":"23a010877a28dbbed0ff2c1de54b7886f6db66e8"},{"name":"main.tf","path":"examples/sqs/no-dead-letter-queue/main.tf","sha":"bda2d362f83207b9fb9cffb393be4afe1a7889e0"},{"name":"outputs.tf","path":"examples/sqs/no-dead-letter-queue/outputs.tf","sha":"e2961511ac23997e4f3e2cd8991559ffdbe10ac0"},{"name":"variables.tf","path":"examples/sqs/no-dead-letter-queue/variables.tf","sha":"a59eb9bc6c66d8a4bf9d9e4d418e78c21035d67b"}]}]}]},{"name":"modules","children":[{"name":"kinesis","children":[{"name":"README.md","path":"modules/kinesis/README.md","sha":"2755785a2c97e818989121565c1e6c4b4e2060bd"},{"name":"main.tf","path":"modules/kinesis/main.tf","sha":"21ec5bc175c8cb277296f1ba8d6b28384ec39996"},{"name":"outputs.tf","path":"modules/kinesis/outputs.tf","sha":"6a03e228332416c46f03acf869a1e364ca901c32"},{"name":"variables.tf","path":"modules/kinesis/variables.tf","sha":"71e59e5243f93f6a9a2237fb6779e241009cb5a3"}]},{"name":"msk","children":[{"name":"README.md","path":"modules/msk/README.md","sha":"8ed5181fd43ec36405581e63b27f2351ec50ab51"},{"name":"main.tf","path":"modules/msk/main.tf","sha":"faf94aa73c54d6d2f449f8d05b36e6c656fd0c8b"},{"name":"outputs.tf","path":"modules/msk/outputs.tf","sha":"3819e63f34ef96848ab3c3036f0d4b744d986558"},{"name":"variables.tf","path":"modules/msk/variables.tf","sha":"1d29e3c1550c555c0a41463316021918c4b727a0"}]},{"name":"sns-sqs-connection","children":[{"name":"README.md","path":"modules/sns-sqs-connection/README.md","sha":"b4f86c6463caf238a8ab01fbf87bad3ba2f10b2f"},{"name":"main.tf","path":"modules/sns-sqs-connection/main.tf","sha":"98710606010f1b75328c820e8e66f9954948d139"},{"name":"outputs.tf","path":"modules/sns-sqs-connection/outputs.tf","sha":"f771fdc188025b64ef0219d4a1d8389d67a7c780"},{"name":"variables.tf","path":"modules/sns-sqs-connection/variables.tf","sha":"036c7ef148acec6ae018a0f24e16a08808630093"}]},{"name":"sns","children":[{"name":"README.md","path":"modules/sns/README.md","sha":"3ad20d55ca56926c53ce20383b9d42ce4e3022b1","toggled":true},{"name":"main.tf","path":"modules/sns/main.tf","sha":"8c702342e78584a001575a90567ff7b8a3f4843b"},{"name":"outputs.tf","path":"modules/sns/outputs.tf","sha":"b187ff24e06f69c9d92e412cafbd05c11734f033"},{"name":"variables.tf","path":"modules/sns/variables.tf","sha":"d6e89bea23a2bdfdb1013936a6c8dd13e7e4db5e"}],"toggled":true},{"name":"sqs-lambda-connection","children":[{"name":"README.md","path":"modules/sqs-lambda-connection/README.md","sha":"4a5c2d28641c9d5600c13d13f23d37f0401f41e8"},{"name":"main.tf","path":"modules/sqs-lambda-connection/main.tf","sha":"f76294035eb996e8a35fc583b85657f85d7743c6"},{"name":"outputs.tf","path":"modules/sqs-lambda-connection/outputs.tf","sha":"1776f39a27d6502062aab149ab8c831251875fad"},{"name":"variables.tf","path":"modules/sqs-lambda-connection/variables.tf","sha":"43ac7496926f6fb3ce22348f9f8bac40339bfb9a"}]},{"name":"sqs","children":[{"name":"README.md","path":"modules/sqs/README.md","sha":"c5d450a5bcf2e7c2d131ae0e4ba607b8745372e0"},{"name":"main.tf","path":"modules/sqs/main.tf","sha":"c7ee8590e5237ce96907c7dd859c30edc4fce0f5"},{"name":"outputs.tf","path":"modules/sqs/outputs.tf","sha":"e1d941e64d321ac3f6f36ff7fa8f8c4d07ffe6c5"},{"name":"variables.tf","path":"modules/sqs/variables.tf","sha":"677dff17ecb1669d5ef878d1068beb372c420b3e"}]}],"toggled":true},{"name":"terraform-cloud-enterprise-private-module-registry-placeholder.tf","path":"terraform-cloud-enterprise-private-module-registry-placeholder.tf","sha":"ae586c0fe830819580e1009d41a9074f16e65bed"},{"name":"test","children":[{"name":"README.md","path":"test/README.md","sha":"031cdc06d155eff31f9c5648a1c92ee5fb816ea0"},{"name":"common.go","path":"test/common.go","sha":"f21073ab5bd19e1a2d639797db57d74c86981a7f"},{"name":"go.mod","path":"test/go.mod","sha":"4f7dce5c1967a86b2aacd2fcd66318569992f730"},{"name":"go.sum","path":"test/go.sum","sha":"15d7d1f1ed80cb690998c0639da15c981a2db472"},{"name":"kinesis_test.go","path":"test/kinesis_test.go","sha":"094e5dd45864c2f476c639830d2d304f7c90cec3"},{"name":"msk_test.go","path":"test/msk_test.go","sha":"378f59cd02c9904b4d91f396fa44829acde737ed"},{"name":"sns_test.go","path":"test/sns_test.go","sha":"7c16521dbd128d717166913b6f938dcdcf2eaed4"},{"name":"sqs_dead_letter_queue_test.go","path":"test/sqs_dead_letter_queue_test.go","sha":"fb338072c1da0e4b9f4af835428bf640da040252"},{"name":"sqs_encrypted_fifo_queue_test.go","path":"test/sqs_encrypted_fifo_queue_test.go","sha":"d54f013c4ecb9f685a4aea19aeab8455025d52b5"},{"name":"sqs_standard_test.go","path":"test/sqs_standard_test.go","sha":"7d54c5085ba793d6ec55bf5083382b5bb66bede9"},{"name":"terratest_options.go","path":"test/terratest_options.go","sha":"b5bbf25e1e4da073add81cf87ded6b67ccf8e139"},{"name":"upgrades","children":[{"name":"upgrade_test.go","path":"test/upgrades/upgrade_test.go","sha":"42f6d1d07b78ad094c6b2ed45f40629b97e0398c"}]},{"name":"validation","children":[{"name":"validate_all_modules_and_examples_test.go","path":"test/validation/validate_all_modules_and_examples_test.go","sha":"33d73c385b64c4fc870033e99427e683c31dc45a"}]}]}]},"detailsContent":"<h1 class=\"preview__body--title\" id=\"simple-notification-service-sns-topic-module\">Simple Notification Service (SNS) Topic Module</h1><div class=\"preview__body--border\"></div><p>This module makes it easy to deploy a SNS topic along with the publisher and subscriber policies for the topic.</p>\n<h2 class=\"preview__body--subtitle\" id=\"how-do-you-use-this-module\">How do you use this module?</h2>\n<ul>\n<li>See the <a href=\"/repos/v0.12.0/package-messaging/README.md\" class=\"preview__body--description--blue\">root README</a> for instructions on using Terraform modules.</li>\n<li>See the <a href=\"/repos/v0.12.0/package-messaging/examples\" class=\"preview__body--description--blue\">examples</a> folder for example usage.</li>\n<li>See <a href=\"/repos/v0.12.0/package-messaging/modules/sns/variables.tf\" class=\"preview__body--description--blue\">variables.tf</a> for all the variables you can set on this module.</li>\n</ul>\n<p>Here is an example of how you might deploy an SNS topic with this module:</p>\n<pre>module <span class=\"hljs-string\">\"sns\"</span> {\n <span class=\"hljs-attr\">source</span> = <span class=\"hljs-string\">\"git::git@github.com:gruntwork-io/terraform-aws-messaging.git//modules/sns?ref=vx.y.z\"</span>\n\n <span class=\"hljs-attr\">name</span> = <span class=\"hljs-string\">\"my-topic\"</span>\n <span class=\"hljs-attr\">display_name</span> = <span class=\"hljs-string\">\"my-display\"</span>\n <span class=\"hljs-attr\">allow_publish_accounts</span> = [\n <span class=\"hljs-string\">\"arn:aws:iam::123456789012:user/Bill\"</span>,\n <span class=\"hljs-string\">\"arn:aws:iam::123456789012:user/Ted\"</span>\n ]\n\n <span class=\"hljs-attr\">allow_subscribe_accounts</span> = [\n <span class=\"hljs-string\">\"arn:aws:iam::123456789012:user/AbeLincoln\"</span>\n ]\n\n <span class=\"hljs-attr\">allow_subscribe_protocols</span> = [\n <span class=\"hljs-string\">\"https\"</span>\n ]\n\n <span class=\"hljs-attr\">allow_publish_services</span> = [\n <span class=\"hljs-string\">\"events.amazonaws.com\"</span>,\n <span class=\"hljs-string\">\"rds.amazonaws.com\"</span>\n ]\n \n <span class=\"hljs-attr\">delivery_policy</span> = <<EOF\n {\n <span class=\"hljs-string\">\"http\"</span>: {\n <span class=\"hljs-string\">\"defaultHealthyRetryPolicy\"</span>: {\n <span class=\"hljs-string\">\"minDelayTarget\"</span>: <span class=\"hljs-number\">20</span>,\n <span class=\"hljs-string\">\"maxDelayTarget\"</span>: <span class=\"hljs-number\">30</span>,\n <span class=\"hljs-string\">\"numRetries\"</span>: <span class=\"hljs-number\">3</span>,\n <span class=\"hljs-string\">\"numMaxDelayRetries\"</span>: <span class=\"hljs-number\">0</span>,\n <span class=\"hljs-string\">\"numNoDelayRetries\"</span>: <span class=\"hljs-number\">0</span>,\n <span class=\"hljs-string\">\"numMinDelayRetries\"</span>: <span class=\"hljs-number\">0</span>,\n <span class=\"hljs-string\">\"backoffFunction\"</span>: <span class=\"hljs-string\">\"linear\"</span>\n },\n <span class=\"hljs-string\">\"disableSubscriptionOverrides\"</span>: <span class=\"hljs-literal\">false</span>\n }\n }\n EOF\n}\n\n <span class=\"hljs-attr\">http_success_feedback_role_arn</span> = arn:aws:iam::<span class=\"hljs-number\">1234567890</span>:role/HTTPSuccessFeedbackRole\n <span class=\"hljs-attr\">http_failure_feedback_role_arn</span> = arn:aws:iam::<span class=\"hljs-number\">1234567890</span>:role/HTTPFailureFeedbackRole\n</pre>\n<h3 class=\"preview__body--subtitle\" id=\"delivery-policy\">Delivery policy</h3>\n<p>SNS supports custom delivery policies when using HTTP/S. In the example above, we use default policy that AWS creates for new topics. The only difference is <code>maxDelayTarget</code> which has default value 20, was changed to 30 for testing.</p>\n<p>Details for customizing the policy are here: https://docs.aws.amazon.com/sns/latest/dg/sns-message-delivery-retries.html#creating-delivery-policy</p>\n<p>For HTTP delivery policy, you may also provide two IAM role ARNs. These ARNs (created outside of this module) allow SNS to send logs to cloudwatch for success and failure deliveries.</p>\n<p>Feedback roles should be created as trust policy below</p>\n<pre>{\n <span class=\"hljs-attr\">\"Version\"</span>: <span class=\"hljs-string\">\"2012-10-17\"</span>,\n <span class=\"hljs-attr\">\"Statement\"</span>: [\n {\n <span class=\"hljs-attr\">\"Effect\"</span>: <span class=\"hljs-string\">\"Allow\"</span>,\n <span class=\"hljs-attr\">\"Principal\"</span>: {\n <span class=\"hljs-attr\">\"Service\"</span>: <span class=\"hljs-string\">\"sns.amazonaws.com\"</span>\n },\n <span class=\"hljs-attr\">\"Action\"</span>: <span class=\"hljs-string\">\"sts:AssumeRole\"</span>\n }\n ]\n}\n</pre>\n<p>The roles should use <code>AmazonSNSRole</code> AWS managed policy, which gives SNS access to cloudwatch</p>\n<pre>{\n <span class=\"hljs-attr\">\"Version\"</span>: <span class=\"hljs-string\">\"2012-10-17\"</span>,\n <span class=\"hljs-attr\">\"Statement\"</span>: [\n {\n <span class=\"hljs-attr\">\"Effect\"</span>: <span class=\"hljs-string\">\"Allow\"</span>,\n <span class=\"hljs-attr\">\"Action\"</span>: [\n <span class=\"hljs-string\">\"logs:CreateLogGroup\"</span>,\n <span class=\"hljs-string\">\"logs:CreateLogStream\"</span>,\n <span class=\"hljs-string\">\"logs:PutLogEvents\"</span>,\n <span class=\"hljs-string\">\"logs:PutMetricFilter\"</span>,\n <span class=\"hljs-string\">\"logs:PutRetentionPolicy\"</span>\n ],\n <span class=\"hljs-attr\">\"Resource\"</span>: [\n <span class=\"hljs-string\">\"*\"</span>\n ]\n }\n ]\n}\n</pre>\n<h2 class=\"preview__body--subtitle\" id=\"how-do-i-access-the-sns-topic\">How do I access the SNS topic?</h2>\n<p>This module includes several <a href=\"https://www.terraform.io/intro/getting-started/outputs.html\" class=\"preview__body--description--blue\" target=\"_blank\">Terraform outputs</a>,\nincluding:</p>\n<ol>\n<li><code>topic_name</code>: The Name of the created topic</li>\n<li><code>topic_display_name</code>: The Display Name of the created topic</li>\n<li><code>topic_arn</code>: The ARN of the created topic</li>\n<li><code>topic_policy</code>: The Access policy of the created topic</li>\n</ol>\n","repoName":"package-messaging","repoRef":"v0.10.1","serviceDescriptor":{"serviceName":"SNS","serviceRepoName":"package-messaging","serviceRepoOrg":"gruntwork-io","serviceMainReadmePath":"/modules/sns","cloudProviders":["aws"],"description":"Create SNS topics with configurable IAM and delivery policies.","imageUrl":"sns.png","licenseType":"subscriber","technologies":["Terraform"],"compliance":[],"tags":[""]},"serviceCategoryName":"Messaging & streaming","fileName":"README.md","filePath":"/modules/sns","title":"Repo Browser: SNS","description":"Browse the repos in the Gruntwork Infrastructure as Code Library."}