LaravelでEC2のIAMロールからSESでメール送信する

2018-12-22
PHP
Laravel
AWS
SES

この記事はLaravel #2 Advent Calendar 2018 22日目の記事です。

「いやいや、公式ドキュメントに載ってるがな」と思ったあなた。公式ドキュメントの記述をよく読みましょう。

https://laravel.com/docs/5.7/mail

1
2
3
4
5
'ses' => [
'key' => 'your-ses-key',
'secret' => 'your-ses-secret',
'region' => 'ses-region', // e.g. us-east-1
],

公式ドキュメントの方法では、AWSのAPI用にkey, secret, regionを設定してあげる必要があります。要するに.envとかを使って設定するわけですが、これは面倒くさいのです。

EC2にはIAMロールを使って、AWSの他のサービスへのアクセス管理をする仕組みが提供されています。

Amazon EC2 の IAM ロール - Amazon Elastic Compute Cloud

EC2にロックインされることにはなるのですが、AWSの認証情報を自分たちが管理しなくて良いというのは、素晴らしく楽ちんです。

IAMロールからSESを使うときの注意点

通常、LaravelからAWSのサービスを利用する場合は、aws-sdk-phpを利用するのですが、ここに罠があります。S3などはaws-sdk-phpを導入すれば、それだけでIAMロールによる認証がうまくいくのですが、SESはそれだけでは動きません。

そのせいなのか、巷にあるEC2からSESを使ってメール送信するサンプルは、Laravelの公式ドキュメントと同じでkey, secretを使う方法がほとんどです。

ではどうしたら良いのかというと、aws-sdk-php-laravelを追加でインストールします。

え?それだけ?という感じですが、2時間程度ハマってしまいましたので…。

とりあえず、SESでIAMロールが使えるようになったのは、下記のPullRequestが取り込まれた後です。2015年の9月なんですね。使い始めた時期によっては、IAMロールを使ったメール送信が難しいタイミングもあったかもしれないです。

https://github.com/aws/aws-sdk-php-laravel/pull/84/files

おまけ

SESに限らずですが、メール送信の動作確認はtinker使うのが楽ちんです。

1
2
3
4
5
$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.12 — cli) by Justin Hileman
>>> Mail::raw('hoge',function($message) {$message->to('hoge@example.com')->subject('test');});
=> null
>>>

それでは素晴らしいLaravelライフを!

追伸

aws-sdk-php単体で動作するAWSのサービスと、aws-sdk-php-laravelが必要なサービスがなぜあるのか、こんど調べてみようかな。