Cloud Functions と Amazon SES を連携させてメール送信を試してみた

2021.12.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!エノカワです。

本エントリは クラスメソッド Google Cloud Advent Calendar 2021 の 6日目 の記事です。

さて、私事ではございますが「Google Cloud から手軽にメール送信がしてみたい」
というのが、目下の関心事です。

Gmail API や SendGrid を利用する方法もありますが、他の方法は無いものだろうか。
例えば、他のクラウドサービスが提供するメール送信サービスを利用する方法とか、、、

ということで、今回はCloud Functions と Amazon SES を連携させてメール送信を試してみました。(強引)

概要

構成図はこんな感じです。

Cloud Functions で Amazon SES のメール送信APIを呼び出す関数を作成し、
コンソールからその関数を実行してメールを送信します。

今回はお試しということで、とてもシンプルな構成です。

Amazon SES

メール送信環境構築

まずは AWS のパートです。
メール送信に使用するメールアドレスの確認を行います。

Amazon SES のコンソールから「Verified identities」の画面に遷移し、
「Create identity」ボタンをクリックします。

「Email addres」に送信用に使用するメールアドレスを入力して、
「Create identity」ボタンをクリックします。

そうすると、登録した送信用メールアドレスに検証要求のメールが届きました。
内容を確認して、リンクをクリックします。

Amazon SES のコンソールに戻ると、
登録した送信用メールアドレスの Status が「Verified」になっていることが確認できます。

送信用メールアドレスの確認が完了し、メール送信環境が整いました!

メール送信テスト

登録した送信用メールアドレスからメール送信できるのかテストしてみましょう。

コンソールの「Verified identities」から送信用メールアドレスをクリックして、
「Send test Email」ボタンをクリックします。

下の図のようにメールアドレスやメールの内容を入力します。
この時点では送信用メールアドレス以外にメール送信できないサンドボックスという状態なので、
「From-address」と「Custom recipient」の両方に送信用メールアドレスを入力します。

「Send test email」ボタンをクリックすると、、、

送信用メールアドレスの受信トレイにテストメールが届きました!

アクセスキー取得

コンソールからメール送信ができたので、 Cloud Functions からメール送信を行う準備に入ります。

今回は AWS SDK for Python を使用して Amazon SES 経由でメールを送信しますが、
SDK を使用して Amazon SES にアクセスするにはAWS アクセスキー IDAWS シークレットアクセスキーが必要です。

IAM のコンソールから Amazon SES でメール送信の権限を持つユーザーを作成します。
インラインポリシーでses:SendEmailの権限を持つユーザーです。

メール送信ユーザーのアクセスキーを作成します。

AWS アクセスキー ID と AWS シークレットアクセスキーは、
Cloud Functions で関数を作成する際に使用します。

Cloud Functions

メール送信関数作成

ここからは Google Cloud のパートです。
Cloud Functions でメール送信関数を作成します。

Cloud Functions のコンソールから「関数の作成」ボタンをクリックします。

下の図のように入力していきます。

  • 関数名
    send_email
  • リージョン
    asia-northeast1
  • トリガー
    HTTP

ランタイム環境変数も設定します。
先ほど作成したAWS アクセスキー IDAWS シークレットアクセスキーを入力します。

  • AWS_ACCESS_KEY_ID
    {AWS アクセスキー ID}
  • AWS_SECRET_ACCESS_KEY_ID
    {AWS シークレットアクセスキー}

ランタイム環境変数は Cloud Functions のコード内で参照することが可能です。
この仕組みを利用することで、認証情報をコードから切り出すことができます。

「次へ」ボタンをクリックして、コード入力画面に遷移します。

コード

引数で指定されたメールタイトルと本文の内容で
Amazon SES のメール送信APIを実行するだけのシンプルなコードです。

main.py

import os
import boto3

def send_email(request):
    # 引数取得
    request_json = request.get_json()
    subject = request_json['subject']   # メールタイトル
    message = request_json['message']   # メール本文

    # 環境変数取得
    AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID', 'None')
    AWS_SECRET_ACCESS_KEY_ID = os.getenv('AWS_SECRET_ACCESS_KEY_ID', 'None')

    # SESクライアント
    client = boto3.client('ses',
        aws_access_key_id = AWS_ACCESS_KEY_ID,              # アクセスキー
        aws_secret_access_key = AWS_SECRET_ACCESS_KEY_ID,   # シークレットキー
        region_name = 'ap-northeast-1'
    )

    # メール送信
    response = client.send_email(
        Source = '{Amazon SES で認証したメールアドレス}',
        Destination = {
            'ToAddresses': ['{Amazon SES で認証したメールアドレス}']
        },
        Message = {
            'Subject': {
                'Data': subject,
                'Charset': 'UTF-8'
            },
            'Body': {
                'Text': {
                    'Data': message,
                    'Charset': 'UTF-8'
                }
            }
        }
    )

    print(response)

requirements.txt

boto3>=1.17.100

下の図のように入力していきます。

  • ランタイム
    Python 3.7
  • エントリポイント
    send_email

「デプロイ」ボタンをクリックしてしばらくすると、作成した関数が一覧に表示されました。

メール送信関数実行

作成した関数をテスト実行してみましょう。

関数一覧から「send_email」をクリックし、「テスト中」タブに切り替えます。

トリガーとなるイベント

{
    "subject" : "テストメール",
    "message" : "Cloud Functions から来ました。"
}

イベントを入力し、「関数をテストする」ボタンをクリックすると、、、

Cloud Functions から来ました!

まとめ

以上、Cloud Functions と Amazon SES を連携させてメール送信を試してみました。

数クリックの操作で手軽にメール送信できる環境を構築することができました。

既に Amazon SES を使っていて、Google Cloud で新たに構築したサービスから
メール送信したいといった場合に活用できる構成ではないでしょうか。

今回はお試しということで Cloud Functions を手動実行しましたが、
バッチ完了をメール通知するケースを想定してスケジュール実行も試してみたいと思います。

明日 12/7 は さいちゃん さんです。よろしくお願いします!

参考