BotoServerError: 403 Forbidden. Signature Version 3 requests are deprecated from March 1, 2021.

AWS
スポンサーリンク
language

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を更新します。

django-ses/django-ses
A Django email backend for Amazon's Simple Email Service - 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.

エラーのこの部分を日本語に訳すと以下のようになります。

チェック

署名バージョン3のリクエストは、2021年3月1日から非推奨になりました。その日以降、このようなリクエストは段階的に拒否されます。 この問題を解決するには、Signatureバージョン4に移行する必要があります。

署名バージョン 4 署名プロセス - AWS 全般的なリファレンス
署名バージョン 4 プロトコルを使用して AWS API リクエストに認証情報を追加します。

django-sesでも2020年6月から署名バージョン4への移行に対応する動きがありました。

Upgrade from boto to boto3, and use env variables by GitRon · Pull Request #183 · django-ses/django-ses
Hi guys, I started the migration from boto to boto3. I tried it out locally and now I can send from an email region which has this new auth type v4. Here's ...

まとめ

2021年3月1日から署名バージョン3のリクエスト非推奨となり、AWS側で拒否されていたことが原因でエラーが出ていました。

このエラーの解決方法は次の2つです。

  • リクエストに自己署名する場合は、署名バージョン4 を使用したAmazonSES API へのリクエストの認証に関するドキュメントを参照
  • リクエストに自己署名しない場合は、SDK / CLIを最新バージョンに更新

僕のようにSDK / CLIを使っている人は、最新バージョンに更新することで解決します。

タイトルとURLをコピーしました