やりたかったこと
AWS SDKを使ったメール送信システムはVPCエンドポイントに対応していなかったので、Node.jsのnodemailerを使い、VPC内からSMTPメールを送信したかった。
大まかな手順
1.VPCエンドポイントを作成する
2.Amazon SES SMTP認証情報を取得する
3.nodemailerを使い、メール送信部分を構築する
1.VPCエンドポイントを作成する
こちらに関しては、AWSの公式を読んだ方がわかりやすいと思います。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-email-set-up-vpc-endpoints.html
作成するエンドポイントのサービス名は「com.amazonaws.us-west-2.email-smtp」
エンドポイント作成時に表示されるこの箇所で検索すると、一発で出てきます。
リージョンの部分は、各々が利用されるリージョンで置き換えてください。
VPCエンドポイントが作成できたら、次は認証情報を取得します。
2.Amazon SES SMTP認証情報を取得する
ここも、AWSの公式を見てもらえばすぐにできます。
後ほどnodemailerの記述の中でUserNameとPasswordを読み込みますが、その際はこの認証情報を取得した際の「アクセスキー」と「パスワード」を使用します。キーはダウンロードしておくのがおすすめです。
3.nodemailerを使い、メール送信部分の構築
上記2つの準備ができたら、nodemailerを使った構築に移ります。
まずは実際に実装したコードを載せさせていただきます。
import { createTransport } from 'nodemailer';
// smtpの設定定義
const smtpEndpoint = process.env.IS_OFFLINE ? "email-smtp.us-west-2.amazonaws.com" : process.env.SMTP_ENDPOINT;
const port = 587;
const smtpUsername = process.env.SES_USER;
const smtpPassword = process.env.SES_PASSWORD;
// メール送信の根幹部分
export async function SendMail() {
// SMTPサーバの設定
const smtp = createTransport({
host: smtpEndpoint,
port: port,
secure: false,
auth: {
user: smtpUsername,
pass: smtpPassword
}
});
const message = {
from: "example@example.co.jp", // 送信元名
to: "example@example.co.jp", // 送信先
subject: "送信テスト", // 件名
text: "送信テストです", // 通常のメール本文
};
let info = await smtp.sendMail(message)
console.log("Message sent! Messsage ID: ", info.messageId)
}
メール送信部分はこれだけで実装できます。
// smtpの設定定義
const smtpEndpoint = process.env.IS_OFFLINE ? "email-smtp.us-west-2.amazonaws.com" : process.env.SMTP_ENDPOINT;
const port = 587;
const smtpUsername = process.env.SES_USER;
const smtpPassword = process.env.SES_PASSWORD;
この部分だけ少し説明をすると、
smtpEndpointについては、ローカル環境で実行する場合、エンドポイント「email-smtp.us-west-2.amazonaws.com」でメール送信できたのですが、本番環境で実行するとメール送信が動きませんでした。そのため、本番環境では、環境変数に設定したエンドポイント「vpce-xxxxxxxxxxxx.email-smtp.us-west-2.vpce.amazonaws.com」を指定するとメール送信がうまくできました。
おそらく、前者のエンドポイントだけではVPCを介したエンドポイントに繋がっていなかったと考えられます。
※この部分について謝りがあればご指摘ください🙇♂️
次に今回の例では、STARTTLS接続でSMTPエンドポイントに接続しているため、ポート番号は「587」で設定しています。
※SMTPエンドポイント接続についてはコチラ
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-connect.html
最後に、「smtpUsername」と「smtpPassword」についてですが、ここは先ほどSMTP認証した際に取得したアクセスキーとパスワードが当てはまりますので、環境変数に設定して読み込んでください。
以上の設定が終われば、AWS SESとnodemailerを使い、VPCを介したメール送信ができるはずです。
※肝心な箇所が抜けていたら、ご指摘いただけると幸いです🙇♂️
最後に
僕が実装していた時はエンドポイントの接続で詰まってしまい時間を要しましたが、半日あれば十分実装できると思います。
メール送信部分に関しては、各々で作成されているAPIを走らせるメソッドに組み込んじゃってください。
なお、昨年の夏頃?には東京リージョンにもSESが来たみたいですので、そちらもまた設定していこうと考えています。
追伸 AWSの公式をしっかり読めば、大抵のことは実装できるんだなと実感しました。