AWS S3にファイルが保存されたらメール送信する
こんにちは!オンサイトのエンジニア、ふけはらです。
オンサイトのエンジニアがAWSの活用方法を紹介する【AWSを使い倒す!】シリーズ。
前回の記事で、AWS S3を利用してファイルを共有する方法を説明しました。
今回は、S3にファイルが保存されたタイミングでメール送信を行う方法について説明します。AWSのLambdaとSESを使って実現します。
目次
[SES] ドメインとメールアドレスを検証する
まずはAWS SESでドメインと送信元として使用するメールアドレスを検証します。
・ドメインの検証
・送信元メールアドレスを検証
・SESの制限解除
この手順で解説していきます。
①ドメインの検証
[Domains]メニューの[Verify a New Domain]を選択し、利用するドメインを入力します。DKIMの設定も必要であればチェックボックスをONにします。

▼
SESで利用するドメインを登録すると以下のような画面が表示されます。[Download Record Set as CSV]を選んで、DNSへ登録するレコードが書かれたファイルをダウンロードします。
▼
ドメインを管理しているDNSにSESからダウンロードしたCSVに記されているレコードを登録して、しばらく待つとドメインの検証が完了します。
②送信元メールアドレスの検証
ドメインの検証に成功したら、[Email Addresses]メニューの[Verify a New Email Address]を選択し、送信元として利用するメールアドレスを入力します。

▼
入力したメールアドレス宛にAWSから検証用のメールが届きますので、メール内にあるURLをクリックしてしばらく待つと、メールアドレスの検証が完了します。
③SESの制限解除
SESは、不正使用や悪用の防止のため、初期状態ではサンドボックス環境にあります。本番運用を開始する際は、制限解除の申請を行い、サンドボックス環境から出してあげる必要があります。
SESにアクセスし、[Setting Statistics]を表示すると、[Production Access]の欄で、現在の環境を確認することができます。Sandboxとなっている場合は、[Edit your account details]から、制限解除の申請を行います。
▼
[Enable Production Access]でYesを選択し、その他の必要事項も記入したうえで、[Submit for review]を押して、制限解除を申請します。私が申請したときは、2時間程度で制限解除されました。状況によっては制限解除まで数日かかることもあるかもしれません。

[Lambda] S3にファイルが保存されたらメールを送信する
SESでメールの準備ができたら、次はLambdaで、S3にファイルが保存されたらメール送信する処理を設定します。
・関数の作成
・トリガーの設定
こちらはこの手順で解説していきます。
関数の作成
[関数名]を入力、[ランタイム]を選択し、関数を作成します。今回はNode.jsを利用します。
トリガーの設定
[トリガーを追加]を選び、関数が動作するタイミングを設定します。トリガーの設定画面で、S3とバケットを選択します。今回はファイルが保存されたときに関数を実行したいので、[イベントタイプ]でPUTを選択します。

メール送信を行うコード
以下は、Lambdaで実行するコードのサンプルです。
const AWS = require('aws-sdk');
AWS.config = new AWS.Config();
AWS.config.region = "ap-northeast-1";
exports.handler = (event) => {
  // eventオブジェクトから保存されたファイルパスを取得する
  const filePath = event['Records'][0]['s3']['object']['key'];
  
  const param = {
    // 送信元メールアドレス
    Source: 'test1@example.com',
    Destination: {
      // 送信先メールアドレス
      ToAddresses: ['test2@example.com', 'test3@example.com']
    },
    Message: {
      Subject: {
        Data: "ファイルが保存されました",
      },
      Body: {
        Text: {
          Data: filePath + "が保存されました。",
        }
      }
    }
  };
  var sendPromise = new AWS.SES().sendEmail(param).promise();
  sendPromise.then(
    function(data) {
      console.log('successful', data);
    }).catch(
      function(err) {
        console.error(err, err.stack);
      });
};eventオブジェクトから以下のようなデータが取得できるので、ディレクトリやファイル名で処理を分けることができます。
{
  Records: [{
    eventVersion: '2.1',
    eventSource: 'aws:s3',
    awsRegion: 'ap-northeast-1',
    eventTime: '2021-06-03T06:20:49.297Z',
    eventName: 'ObjectCreated:Put',
    userIdentity: [Object],
    requestParameters: [Object],
    responseElements: [Object],
    s3: {
      s3SchemaVersion: '1.0',
      configurationId: '',
      bucket: {
        name: 'xxxxxxx',
        ownerIdentity: {
          principalId: 'xxxxxx'
        },
        arn: 'arn:aws:s3:::xxxxxxxx'
      },
      object: {
        key: 'dir1/testfile',
        size: 18,
        eTag: 'xxxxxx',
        sequencer: 'xxxxx'
      }
    }
  }]
}これで、S3のバケットにファイルが保存されたタイミングで、メールが送信されるようになります。

最後に
2回に分けて、「S3を利用してファイルを共有する方法」と、「S3にファイルが保存されたらメール送信する方法」を解説しました。
AWSで提供されているサービスを組み合わせることで、クライアントとファイルを共有したいという要望を手軽に実現することができました。
オンサイトでは、共に働いてくれるエンジニアを募集中です!ぜひ下記採用ページからお気軽にご連絡ください!

エンジニア
2018年に中途入社。
Ruby, Rails, AWSなどを利用して、社内向けの業務アプリを開発しています。
兼務でシステム機器やSaasの管理など情シス的な仕事も担当。



















