ses.tf 6.4 KB

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