Lambdaでメールを送信する

今回行う内容

Lambdaではなにかをトリガーに処理を実行させることができます。例えば、

・5分おきに、時間を知らせるメールをする。
・S3にファイルが置かれたら、ファイルをサーバーに転送する。
・夜の20時になったら、ec2インスタンスを停止する。

「5分おきに」「S3にファイルが置かれたら」など様々なトリガーをきっかけに処理の開始が可能です。

今回は実用性はあまりないですが、「5分おきに、メールをする。」を実装して、lambdaの使い方に慣れます。

lambdaの新規作成

サービスより、コンピューティングのlambdaを選択すると、以下画面が表示されます。

こちらから、関数の作成を押し、作成を開始します。

作成を押すと、以下画面になります。テンプレートなどを使うこともできますが、今回は使い方の説明ですので、1から設計をしていきます。

設定は以下のように。

名前:作成するlambdaに名付ける名前です。
ランタイム:今回はPythonで記入するため、Pythonを選択。使うものに合わせて選択して下さい。
ロール:既存のロールなども使えますが、今回は必要な権限を持ったロールを新規作成します。
ロール名:新規作成するロール名です。
ポリシーテンプレート:こちらでポリシー(権限)を作成するロールに付与します。今回はSNSでメールを送信するため、SNSにアクセスできる権限を追加しました。

これでSNSにアクセスできるロールを持ったlambdaが作成できました。

作成直後の画面です。赤い丸の部分の中央がlambda関数で、ここに実行させたい処理を書きます。
処理を行うときにメール送信をSNSで行いますので、その権限が必要です。
このlambdaが利用できる権限が右側に表示されており、正常にSNSがあるため、メールが送信可能で有ることがわかります。

左側がトリガーの指定です。何が起きたときに処理を実行させるかを書きます。

今回は5分おきのメール送信ですので、その設定を入れていきます。

トリガーの設定

先程の画面のトリガーの選択から、CloudWatchイベントをクリックします。

追加すると、画面下部に以下のような設定する項目が出ますので、以下のように埋めます。

cron式で書くことができますので、5分毎の文を記入しました。こちらのルールは使いまわしが可能なので、名前と説明にわかるように記入をしておきます。

これで作成し、有効化しておけば5分毎にlambdaが実行されるようになりました。

lambda関数の作成

lambdaで通知を送るためにSNSのトピックの設定をします。

こちらはlambdaのお話ではないので簡単な説明に留めますが、SNSでは通知処理を行えます。

トピックの詳細画面より、トピックARNをメモしておきます。

ARNをメモしたら、lambda関数を書きます。

lambdaの項目より、関数コードを開いて下さい。

import boto3

sns = boto3.client('sns')
TOPIC_ARN = u'arn:aws:sns:ap-northeast-1:hogehogehoge:mail-test'
msg = u'message test hacknote'
subject = u'title test hacknote'


def lambda_handler(event, context):
    request = {
    'TopicArn': TOPIC_ARN,
    'Message': msg,
    'Subject': subject
    }
    response = sns.publish(**request)
    return 'Successfully mail processed records'

ARNはSNSの詳細より確認したものを記入してください。 ここではPythonのboto3を使ってメールを送信しています。

こちらを保存すると、5の倍数の時刻にメールが届きます。

テストの方法

今回は5分毎の指定にしましたが、即時でテストしたい場合には引数などを指定して即時実行させることもできます。

画面上部の設定のテストイベントの設定を開きます。

関数に渡すデータを記入しますが、今回は必要ないのでハローワールドのままで保存し、テストを押すと即時で実行され、メールが送信されます。

ここまでが、基本的なlambdaの使い方になります。

ややこしいと思われがちですが、簡単な設定を行うのは非常に簡単です。

なぜややこしいと思われるかというと、lambdaには様々なトリガーを設定でき、また誤った動作をさせないよう関数ごとにしっかりと権限設定が必要だからです。

やりたいことを考え、必要なロールを与え、関数を作成できれば非常に便利なため、ひとつひとつ試してみましょう。