AWSのSESを使ってDjangoからメールを送信していますが、2021年3月頃から以下のようなエラーが頻発するようになりました。
BotoServerError: 403 Forbidden
<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
<Error>
<Type>Sender</Type>
<Code>InvalidClientTokenId</Code>
<Message>Signature Version 3 requests are deprecated from March 1, 2021. From that date on, we are progressively rejecting such requests. To resolve the issue you must migrate to Signature Version 4. If you are self-signing your requests, refer to the documentation for Authenticating requests to the Amazon SES API [1] with Signature Version 4 [2]. If you are not self-signing your requests, simply update your SDK/CLI to the latest version. [1] https://docs.aws.amazon.com/ses/latest/DeveloperGuide/using-ses-api-authentication.html [2] https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html</Message>
</Error>
<RequestId>8adae7d9-8c5b-49be-aeab-4504a1d200eb</RequestId>
</ErrorResponse>
このエラーには次のことが書かれています。
- 署名バージョン3のリクエストは、2021年3月1日から非推奨
- その日以降、このようなリクエストは段階的に拒否
- リクエストに自己署名する場合は、署名バージョン4 を使用したAmazonSES API へのリクエストの認証に関するドキュメントを参照
- リクエストに自己署名しない場合は、SDK / CLIを最新バージョンに更新
解決方法はSDK / CLIを最新バージョンに更新
僕はdjango-sesを使ってメールを送信ているので、「リクエストに自己署名しない場合は、SDK / CLIを最新バージョンに更新」に従って、django-sesを更新します。
https://github.com/django-ses/django-ses
今のdjango-sesの最新バージョンが2.0.0です。
使っているdjango-sesのバージョン確認してみるとだいぶ古いですね。
$ pip list
Package Version
------------------- ---------
...
boto3 1.12.2
...
django-ses 0.8.14
...
pipを使ってdjango-sesの最新バージョンに更新します。
django-sesのバージョンが2.0.0に更新を確認。
$ pip install -U django-ses
$ pip list
Package Version
------------------- ---------
...
boto3 1.17.55
...
django-ses 2.0.0
...
最後に忘れずにWSGIサーバーをリスタートしましょう。
これで更新したdjango-sesでメール送信でき、エラーが解消されます。
$ sudo systemctl restart gunicorn
原因は署名バージョン4への移行
署名バージョン4への移行に伴い、署名バージョン3のリクエストは2021年3月1日から非推奨となりました。
そして、段階的にAWS側で拒否されていたことが原因でエラーが出ます。
Signature Version 3 requests are deprecated from March 1, 2021. From that date on, we are progressively rejecting such requests. To resolve the issue you must migrate to Signature Version 4.
エラーのこの部分を日本語に訳すと以下のようになります。
https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-version-4.html
django-sesでも2020年6月から署名バージョン4への移行に対応する動きがありました。
https://github.com/django-ses/django-ses/pull/183
まとめ
2021年3月1日から署名バージョン3のリクエスト非推奨となり、AWS側で拒否されていたことが原因でエラーが出ていました。
このエラーの解決方法は次の2つです。
- リクエストに自己署名する場合は、署名バージョン4 を使用したAmazonSES API へのリクエストの認証に関するドキュメントを参照
- リクエストに自己署名しない場合は、SDK / CLIを最新バージョンに更新
僕のようにSDK / CLIを使っている人は、最新バージョンに更新することで解決します。
コメント