LambdaからAWS SNS経由でメール(Eメール/SMS)を送信する

AWS Lambdaを使用して、処理を実行させているとメールで情報連携させたいタイミングが出てきます。
処理が正常終了したことであったり、異常終了したエラーメッセージ等はわざわざAWSマネコンにログインしなくても確認したいですよね。

そんな時に、今回ご紹介するLmabdaをご使用下さい。
送信したいメッセージと件名を設定して、AWS SNS経由でメール送信を行います。
AWS SNSを作成するのが面倒な場合は、電話番号だけでショートメッセージ(SMS)を送信させることもできます。

使用例

このページのLambdaとAWS SNSを使用することで以下のようなことが実現できます。
  • LambdaからAWS SNS経由でEメール送信
  • LambdaからAWS SNS経由でSMS送信
※AWS SNSの解説は、本ページでは省略いたします。

構成図

本ページにて紹介するLambdaは、AWS SNS経由でトピックに登録しているEメールサブスクリプションに対してメール送信を行います。
boto3関数は、SNSの「publish」を使用します。

メッセージ本文と件名はLambda内で設定しますが、送信先のEメールアドレスについてはAWS SNSのトピックにて登録します。
Eメールではなく、電話番号でショートメッセージを送ることも可能で、この方法の場合はAWS SNSでトピックを作成せずとも送信できます。

Lambdaソースコード

メイン処理の内容をメッセージに入力し送信したい場合は、
Message変数に文字列として代入すれば、結果を組み込んだ本文を送信可能です。
import boto3

sns_client = boto3.client('sns')
def lambda_handler(event, context):
    #########################
    #メイン処理を記載する。
    #
    #########################

    response = sns_client.publish(
        ,
        Message=
    )

    return 0

▼基本設定

送信対象
SNSトピック
ARN*
電話番号*
メッセージ*
件名

権限(IAMロール設定)

Lambdaに付与するIAMロールに「sns:Publish」の権限を付与してください。

解説

紹介したLambdaのフローは以下の通りです。
  1. メイン処理実行
  2. メッセージの送信
メインの処理を実行して、その内容に基づいてメールの送信を行えます。
例えば、処理が成功した場合と失敗した場合で、分岐を作成すればそれぞれで送りたい内容のメールを送信できます。

使い方

今回紹介したソースコードを利用すると以下のような処理を書くことができます。
以下は指定したEC2の起動をメイン処理として行わせています。

それをtry-except句を利用することで、起動処理が失敗したらメールを送信するように処理を組んでいます。
EC2の起動ではAWSのリソースが不足して起動できないこともありますので、
以下のようなコードを組んでおくと、起動に失敗したタイミングでメールを受信することができます。
import boto3

ec2_client = boto3.client('ec2')
sns_client = boto3.client('sns')
def lambda_handler(event, context):
    try:
        ec2_client.start_instances(
            InstanceIds=[
                'i-xxxxxxxxxxxxxxxxx',
            ]
        )
    except Exception as e:
        response = sns_client.publish(
            TopicArn='arn:aws:sns:ap-northeast-1:123456789012:xxxxxxxxxxx',
            Message=str(e)
        )
    return 0