ses.tf 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. ######################
  2. # Access keys
  3. #
  4. # For rotation purposes, there are two of these. Delete the oldest one,
  5. # add a new one (with a higher version number), and then update the output.
  6. # ses_user
  7. resource "aws_iam_access_key" "ses_access_key-v4" {
  8. user = aws_iam_user.ses_user.name
  9. provider = aws.ses
  10. }
  11. resource "aws_iam_access_key" "ses_access_key-v5" {
  12. user = aws_iam_user.ses_user.name
  13. provider = aws.ses
  14. }
  15. # This just muddies the output, but is good for troubleshooting, so I'm just
  16. # commenting it out.
  17. #output ses_user_access_keys {
  18. # value = {
  19. # "current" = {
  20. # "aws_access_key_id": aws_iam_access_key.ses_access_key-v1.id
  21. # "aws_secret_access_key": aws_iam_access_key.ses_access_key-v1.secret
  22. # },
  23. # "previous" = {
  24. # "aws_access_key_id": aws_iam_access_key.ses_access_key-v0.id
  25. # "aws_secret_access_key": aws_iam_access_key.ses_access_key-v0.secret
  26. # }
  27. # }
  28. #}
  29. output "ses_user_smtp_username" {
  30. value = aws_iam_access_key.ses_access_key-v5.id
  31. }
  32. output "ses_user_smtp_password" {
  33. value = aws_iam_access_key.ses_access_key-v5.ses_smtp_password_v4
  34. sensitive = true
  35. }
  36. ######################
  37. # SES Domain
  38. resource "aws_ses_domain_identity" "public" {
  39. domain = var.dns_info["public"]["zone"]
  40. provider = aws.ses
  41. }
  42. resource "aws_route53_record" "amazonses_verification_record" {
  43. zone_id = var.dns_info["public"]["zone_id"]
  44. name = "_amazonses"
  45. type = "TXT"
  46. ttl = "600"
  47. records = [aws_ses_domain_identity.public.verification_token]
  48. provider = aws.mdr-common-services-commercial
  49. }
  50. resource "aws_ses_domain_identity_verification" "ses_verification" {
  51. domain = aws_ses_domain_identity.public.id
  52. depends_on = [
  53. aws_route53_record.amazonses_verification_record,
  54. aws_route53_record.amazonses_dkim_record,
  55. aws_route53_record.ses_spf_record,
  56. aws_route53_record.ses_domain_mail_from_mx,
  57. ]
  58. provider = aws.ses
  59. }
  60. ######################
  61. # DKIM
  62. resource "aws_ses_domain_dkim" "public" {
  63. domain = aws_ses_domain_identity.public.domain
  64. provider = aws.ses
  65. }
  66. resource "aws_route53_record" "amazonses_dkim_record" {
  67. count = 3
  68. zone_id = var.dns_info["public"]["zone_id"]
  69. name = "${element(aws_ses_domain_dkim.public.dkim_tokens, count.index)}._domainkey"
  70. type = "CNAME"
  71. ttl = "600"
  72. records = ["${element(aws_ses_domain_dkim.public.dkim_tokens, count.index)}.dkim.amazonses.com"]
  73. provider = aws.mdr-common-services-commercial
  74. }
  75. ######################
  76. # SPF
  77. resource "aws_route53_record" "ses_spf_record" {
  78. zone_id = var.dns_info["public"]["zone_id"]
  79. name = ""
  80. type = "TXT"
  81. ttl = "600"
  82. records = ["v=spf1 include:amazonses.com -all"]
  83. provider = aws.mdr-common-services-commercial
  84. }
  85. ######################
  86. # MAIL FROM
  87. resource "aws_ses_domain_mail_from" "public" {
  88. domain = aws_ses_domain_identity.public.domain
  89. mail_from_domain = "bounce.${aws_ses_domain_identity.public.domain}"
  90. provider = aws.ses
  91. }
  92. ######################
  93. # MX for MAIL FROM
  94. resource "aws_route53_record" "ses_domain_mail_from_mx" {
  95. zone_id = var.dns_info["public"]["zone_id"]
  96. name = aws_ses_domain_mail_from.public.mail_from_domain
  97. type = "MX"
  98. ttl = "600"
  99. records = ["10 feedback-smtp.${var.ses_region}.amazonses.com"]
  100. provider = aws.mdr-common-services-commercial
  101. }
  102. #-----------------------------------------------
  103. # IAM user for smtp auth
  104. #-----------------------------------------------
  105. resource "aws_iam_user" "ses_user" {
  106. name = "ses_user"
  107. path = "/service_accounts/"
  108. }
  109. resource "aws_iam_user_policy" "ses_user" {
  110. name = "ses_user_policy"
  111. user = aws_iam_user.ses_user.name
  112. policy = <<EOF
  113. {
  114. "Version": "2012-10-17",
  115. "Statement": [
  116. {
  117. "Action": [
  118. "ses:SendRawEmail"
  119. ],
  120. "Effect": "Allow",
  121. # tfsec:ignore:aws-iam-no-policy-wildcards Allows use by the entire account
  122. "Resource": "*"
  123. }
  124. ]
  125. }
  126. EOF
  127. }
  128. #------------------------------------
  129. # SNS topic for bounce notifications
  130. #------------------------------------
  131. resource "aws_sns_topic" "bounces" {
  132. name = "ses-notifications"
  133. provider = aws.ses
  134. }
  135. resource "aws_ses_identity_notification_topic" "bounce_notification" {
  136. topic_arn = aws_sns_topic.bounces.arn
  137. notification_type = "Bounce"
  138. identity = aws_ses_domain_identity.public.domain
  139. provider = aws.ses
  140. }
  141. resource "aws_ses_identity_notification_topic" "complaint_notification" {
  142. topic_arn = aws_sns_topic.bounces.arn
  143. notification_type = "Complaint"
  144. identity = aws_ses_domain_identity.public.domain
  145. provider = aws.ses
  146. }