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

AWS Lambdaを使用して、処理を実行させているとメールで情報連携させたいタイミングが出てきます。
処理が正常終了したことであったり、異常終了したエラーメッセージ等はわざわざAWSマネコンにログインしなくても確認したいですよね。
そんな時に、今回ご紹介するLmabdaをご使用下さい。
送信したいメッセージと件名を設定して、AWS SNS経由でメール送信を行います。
AWS SNSを作成するのが面倒な場合は、電話番号だけでショートメッセージ(SMS)を送信させることもできます。
処理が正常終了したことであったり、異常終了したエラーメッセージ等はわざわざAWSマネコンにログインしなくても確認したいですよね。
そんな時に、今回ご紹介するLmabdaをご使用下さい。
送信したいメッセージと件名を設定して、AWS SNS経由でメール送信を行います。
AWS SNSを作成するのが面倒な場合は、電話番号だけでショートメッセージ(SMS)を送信させることもできます。
使用例
このページのLambdaとAWS SNSを使用することで以下のようなことが実現できます。
- LambdaからAWS SNS経由でEメール送信
- LambdaからAWS SNS経由でSMS送信
構成図
本ページにて紹介するLambdaは、AWS SNS経由でトピックに登録しているEメールサブスクリプションに対してメール送信を行います。
boto3関数は、SNSの「publish」を使用します。
メッセージ本文と件名はLambda内で設定しますが、送信先のEメールアドレスについてはAWS SNSのトピックにて登録します。
Eメールではなく、電話番号でショートメッセージを送ることも可能で、この方法の場合はAWS SNSでトピックを作成せずとも送信できます。
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のフローは以下の通りです。
例えば、処理が成功した場合と失敗した場合で、分岐を作成すればそれぞれで送りたい内容のメールを送信できます。
- メイン処理実行
- メッセージの送信
例えば、処理が成功した場合と失敗した場合で、分岐を作成すればそれぞれで送りたい内容のメールを送信できます。
使い方
今回紹介したソースコードを利用すると以下のような処理を書くことができます。
以下は指定したEC2の起動をメイン処理として行わせています。
それをtry-except句を利用することで、起動処理が失敗したらメールを送信するように処理を組んでいます。
EC2の起動ではAWSのリソースが不足して起動できないこともありますので、
以下のようなコードを組んでおくと、起動に失敗したタイミングでメールを受信することができます。
以下は指定した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