1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Terraform の AzAPI を使って Azure Communication Services Email を作成してみた

Last updated at Posted at 2023-08-26

Azure でメール送信といえば SendGrid か、365 のメールボックスを使っていました。久しぶりにライトにメール送信をする必要があり、Azure Communication Services Email を作成してみました。Terraform の azurerm には、一部の Azure Communication Services しか用意されておらず、今回は AzAPI を使用しています。

Azure Communication Services Email を作成する Terraform コード

main.tf
terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
    }
    azapi = {
      source = "azure/azapi"
    }
  }
}

provider "azurerm" {
  features {}
}

provider "azapi" {}

variable "prefix" {
  type    = string
  default = "mnrlabo"
}

data "azurerm_client_config" "current" {}

data "azapi_resource" "rg" {
  type      = "Microsoft.Resources/resourceGroups@2022-09-01"
  name      = "${var.prefix}-rg"
  parent_id = "/subscriptions/${data.azurerm_client_config.current.subscription_id}"
}

resource "azapi_resource" "ecs" {
  type      = "Microsoft.Communication/EmailServices@2023-03-31"
  name      = var.prefix
  location  = "global"
  parent_id = data.azapi_resource.rg.id

  body = jsonencode(
    {
      properties = {
        dataLocation = "Japan"
      }
    }
  )
}

resource "azapi_resource" "domains" {
  type      = "Microsoft.Communication/emailServices/domains@2023-03-31"
  name      = "AzureManagedDomain"
  parent_id = azapi_resource.ecs.id
  location  = "global"

  body = jsonencode(
    {
      properties = {
        domainManagement       = "AzureManaged"
        userEngagementTracking = "Disabled"
      }
    }
  )

  response_export_values = ["properties.fromSenderDomain"]
}

resource "azapi_resource" "cs" {
  type      = "Microsoft.Communication/CommunicationServices@2023-03-31"
  name      = var.prefix
  location  = "global"
  parent_id = data.azapi_resource.rg.id

  body = jsonencode(
    {
      properties = {
        dataLocation  = "Japan"
        linkedDomains = [azapi_resource.domains.id]
      }
    }
  )
}

output "fromSenderDomain" {
  value = jsondecode(azapi_resource.domains.output).properties.fromSenderDomain
}

fromSenderDomain のアウトプットを追加して、あとでコマンドライン利用する想定です。

メールを送信するスクリプト

send-email.py
import os
from azure.communication.email import EmailClient

AZURE_COMMUNICATION_STRING = os.environ.get("AZURE_COMMUNICATION_STRING")
AZURE_COMMUNICATION_SENDER = os.environ.get("AZURE_COMMUNICATION_SENDER")
AZURE_COMMUNICATION_TO = os.environ.get("AZURE_COMMUNICATION_TO")
AZURE_COMMUNICATION_SUBJECT = os.environ.get("AZURE_COMMUNICATION_SUBJECT")
AZURE_COMMUNICATION_BODY = os.environ.get("AZURE_COMMUNICATION_BODY")

try:
    email_client = EmailClient.from_connection_string(AZURE_COMMUNICATION_STRING)

    message = {
        "content": {
            "subject": AZURE_COMMUNICATION_SUBJECT,
            "plainText": AZURE_COMMUNICATION_BODY
        },
        "recipients": {
            "to": [
                {
                    "address": AZURE_COMMUNICATION_TO
                }
            ]
        },
        "senderAddress": AZURE_COMMUNICATION_SENDER
    }

    email_client.begin_send(message)
except Exception as ex:
    print('Exception:')
    print(ex)

メールを送信して動作確認

bash
export AZURE_COMMUNICATION_STRING=$(az communication list-key -n mnrlabo -g mnrlabo-rg --query primaryConnectionString -o tsv)
export AZURE_COMMUNICATION_SENDER='donotreply@'$(terraform output fromSenderDomain | jq -r .)
export AZURE_COMMUNICATION_TO=$(az account show --query user.name --output tsv)
export AZURE_COMMUNICATION_SUBJECT="test subject"
export AZURE_COMMUNICATION_BODY="test body"

pip install azure-communication-email

python send-email.py

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?