ses.tf 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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-v0" {
  8. user = aws_iam_user.ses_user.name
  9. }
  10. resource "aws_iam_access_key" "ses_access_key-v1" {
  11. user = aws_iam_user.ses_user.name
  12. }
  13. # This just muddies the output, but is good for troubleshooting, so I'm just
  14. # commenting it out.
  15. #output ses_user_access_keys {
  16. # value = {
  17. # "current" = {
  18. # "aws_access_key_id": aws_iam_access_key.ses_access_key-v1.id
  19. # "aws_secret_access_key": aws_iam_access_key.ses_access_key-v1.secret
  20. # },
  21. # "previous" = {
  22. # "aws_access_key_id": aws_iam_access_key.ses_access_key-v0.id
  23. # "aws_secret_access_key": aws_iam_access_key.ses_access_key-v0.secret
  24. # }
  25. # }
  26. #}
  27. output ses_user_smtp_username {
  28. value = aws_iam_access_key.ses_access_key-v1.id
  29. }
  30. output ses_user_smtp_password {
  31. value = aws_iam_access_key.ses_access_key-v1.ses_smtp_password_v4
  32. }
  33. # dps_portal
  34. resource "aws_iam_access_key" "dps_portal_key-v0" {
  35. user = aws_iam_user.dps_portal.name
  36. }
  37. resource "aws_iam_access_key" "dps_portal_key-v1" {
  38. user = aws_iam_user.dps_portal.name
  39. }
  40. # This just muddies the output, but is good for troubleshooting, so I'm just
  41. # commenting it out.
  42. #output dps_portal_access_keys {
  43. # value = {
  44. # "current" = {
  45. # "aws_access_key_id": aws_iam_access_key.dps_portal_key-v1.id
  46. # "aws_secret_access_key": aws_iam_access_key.dps_portal_key-v1.secret
  47. # },
  48. # "previous" = {
  49. # "aws_access_key_id": aws_iam_access_key.dps_portal_key-v0.id
  50. # "aws_secret_access_key": aws_iam_access_key.dps_portal_key-v0.secret
  51. # }
  52. # }
  53. #}
  54. output dps_portal_smtp_username {
  55. value = aws_iam_access_key.dps_portal_key-v1.id
  56. }
  57. output dps_portal_smtp_password {
  58. value = aws_iam_access_key.dps_portal_key-v1.ses_smtp_password_v4
  59. }
  60. ######################
  61. # SES Domain
  62. resource "aws_ses_domain_identity" "public" {
  63. domain = var.dns_info["public"]["zone"]
  64. provider = aws.ses
  65. }
  66. resource "aws_route53_record" "amazonses_verification_record" {
  67. zone_id = var.dns_info["public"]["zone_id"]
  68. name = "_amazonses"
  69. type = "TXT"
  70. ttl = "600"
  71. records = [ aws_ses_domain_identity.public.verification_token ]
  72. provider = aws.mdr-common-services-commercial
  73. }
  74. resource "aws_ses_domain_identity_verification" "ses_verification" {
  75. domain = aws_ses_domain_identity.public.id
  76. depends_on = [
  77. aws_route53_record.amazonses_verification_record,
  78. aws_route53_record.amazonses_dkim_record,
  79. aws_route53_record.ses_spf_record,
  80. aws_route53_record.ses_domain_mail_from_mx,
  81. ]
  82. provider = aws.ses
  83. }
  84. ######################
  85. # DKIM
  86. resource "aws_ses_domain_dkim" "public" {
  87. domain = aws_ses_domain_identity.public.domain
  88. provider = aws.ses
  89. }
  90. resource "aws_route53_record" "amazonses_dkim_record" {
  91. count = 3
  92. zone_id = var.dns_info["public"]["zone_id"]
  93. name = "${element(aws_ses_domain_dkim.public.dkim_tokens, count.index)}._domainkey"
  94. type = "CNAME"
  95. ttl = "600"
  96. records = [ "${element(aws_ses_domain_dkim.public.dkim_tokens, count.index)}.dkim.amazonses.com" ]
  97. provider = aws.mdr-common-services-commercial
  98. }
  99. ######################
  100. # SPF
  101. resource "aws_route53_record" "ses_spf_record" {
  102. zone_id = var.dns_info["public"]["zone_id"]
  103. name = "@"
  104. type = "TXT"
  105. ttl = "600"
  106. records = ["v=spf1 include:amazonses.com -all"]
  107. provider = aws.mdr-common-services-commercial
  108. }
  109. ######################
  110. # MAIL FROM
  111. resource "aws_ses_domain_mail_from" "public" {
  112. domain = aws_ses_domain_identity.public.domain
  113. mail_from_domain = "bounce.${aws_ses_domain_identity.public.domain}"
  114. provider = aws.ses
  115. }
  116. ######################
  117. # MX for MAIL FROM
  118. resource "aws_route53_record" "ses_domain_mail_from_mx" {
  119. zone_id = var.dns_info["public"]["zone_id"]
  120. name = aws_ses_domain_mail_from.public.mail_from_domain
  121. type = "MX"
  122. ttl = "600"
  123. records = ["10 feedback-smtp.${var.aws_partition}.amazonses.com"]
  124. provider = aws.mdr-common-services-commercial
  125. }
  126. #-----------------------------------------------
  127. # IAM user for smtp auth
  128. #-----------------------------------------------
  129. resource "aws_iam_user" "ses_user" {
  130. name = "ses_user"
  131. path = "/service_accounts/"
  132. }
  133. resource "aws_iam_user_policy" "ses_user" {
  134. name = "ses_user_policy"
  135. user = aws_iam_user.ses_user.name
  136. policy = <<EOF
  137. {
  138. "Version": "2012-10-17",
  139. "Statement": [
  140. {
  141. "Action": [
  142. "ses:SendRawEmail"
  143. ],
  144. "Effect": "Allow",
  145. "Resource": "*"
  146. }
  147. ]
  148. }
  149. EOF
  150. }
  151. #-----------------------------------------------
  152. # IAM user for smtp auth for dps-portal
  153. #-----------------------------------------------
  154. resource "aws_iam_user" "dps_portal" {
  155. name = "dps_portal"
  156. path = "/service_accounts/"
  157. }
  158. resource "aws_iam_user_policy" "dps_portal" {
  159. name = "dps_portal_policy"
  160. user = aws_iam_user.dps_portal.name
  161. policy = <<EOF
  162. {
  163. "Version": "2012-10-17",
  164. "Statement": [
  165. {
  166. "Action": [
  167. "ses:SendRawEmail"
  168. ],
  169. "Effect": "Allow",
  170. "Resource": "*"
  171. }
  172. ]
  173. }
  174. EOF
  175. }
  176. #------------------------------------
  177. # SNS topic for bounce notifications
  178. #------------------------------------
  179. resource "aws_sns_topic" "bounces" {
  180. name = "ses-notifications"
  181. provider = aws.ses
  182. }
  183. resource "aws_ses_identity_notification_topic" "bounce_notification" {
  184. topic_arn = aws_sns_topic.bounces.arn
  185. notification_type = "Bounce"
  186. identity = aws_ses_domain_identity.public.domain
  187. provider = aws.ses
  188. }
  189. resource "aws_ses_identity_notification_topic" "complaint_notification" {
  190. topic_arn = aws_sns_topic.bounces.arn
  191. notification_type = "Complaint"
  192. identity = aws_ses_domain_identity.public.domain
  193. provider = aws.ses
  194. }
  195. #-----------------------------------------------
  196. # For DPS portal, needs SES connectivity
  197. #-----------------------------------------------
  198. #module "ses_user_for_portal" {
  199. # source = "../modules/ses_iam_account"
  200. # username = "dps_portal"
  201. # pgp_key = "${path.module}/../../common/duane_waddle.pgp"
  202. #}
  203. #
  204. #output portal_ses_username {
  205. # value = "${module.ses_user_for_portal.username}"
  206. #}
  207. #
  208. #output portal_ses_password {
  209. # value = "${module.ses_user_for_portal.password}"
  210. #}