ses.tf 6.3 KB

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