amail-lambda-smtp-relay 0.1.0

Amail incoming SMTP relay
resource "null_resource" "lambda_runtime" {
  triggers = {
    # TODO: not trigger always, download from GitHub releases?
    always = uuid() # always trigger and let cargo decide if anything to do
  }

  provisioner "local-exec" {
    command     = "docker-compose run lambda-smtp-relay-build"
    working_dir = path.module
  }

  provisioner "local-exec" {
    command     = "cp target/x86_64-unknown-linux-musl/release/handler bootstrap"
    working_dir = path.module
  }
}

data "archive_file" "lambda_runtime" {
  depends_on = [
    null_resource.lambda_runtime,
  ]

  type        = "zip"
  source_file = "${path.module}/bootstrap"
  output_path = "${path.module}/handler.zip"
}

data "aws_iam_policy_document" "smtp_relay" {
  statement {
    effect = "Allow"
    actions = [
      "sts:AssumeRole",
    ]

    principals {
      type = "Service"
      identifiers = [
        "lambda.amazonaws.com",
      ]
    }
  }
}

resource "aws_iam_role" "smtp_relay" {
  path               = var.aws_iam_path
  name               = "smtp-relay"
  assume_role_policy = data.aws_iam_policy_document.smtp_relay.json
}

resource "aws_lambda_function" "smtp_relay" {
  function_name    = "smtp-relay"
  filename         = data.archive_file.lambda_runtime.output_path
  source_code_hash = data.archive_file.lambda_runtime.output_base64sha256
  runtime          = "provided"
  handler          = "main"
  role             = aws_iam_role.smtp_relay.arn
  timeout          = 12

  kms_key_arn = var.user_params.kms_key.arn
  environment {
    variables = {
      S3_BUCKET           = var.eml_bucket.id
      S3_REGION           = var.eml_bucket.region
      RELAY_ENVELOPE_FROM = var.user_params.envelope_from
      RELAY_ENVELOPE_TO   = var.user_params.envelope_to
      SMTP_HOST           = var.user_params.smtp_host
      SMTP_USER           = var.user_params.smtp_user
      SMTP_PASS           = var.user_params.smtp_password
    }
  }
}

resource "aws_lambda_permission" "eml_store" {
  statement_id   = "AllowSESInvocation"
  action         = "lambda:InvokeFunction"
  function_name  = aws_lambda_function.smtp_relay.function_name
  principal      = "ses.amazonaws.com"
  source_account = var.aws_account_id
}

resource "aws_iam_role_policy_attachment" "logging" {
  role       = aws_iam_role.smtp_relay.name
  policy_arn = var.aws_iam_policy.logging.arn
}

resource "aws_iam_role_policy_attachment" "eml_fetch" {
  role       = aws_iam_role.smtp_relay.name
  policy_arn = var.aws_iam_policy.eml_fetch.arn
}