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

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.

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

チェック

署名バージョン3のリクエストは、2021年3月1日から非推奨になりました。その日以降、このようなリクエストは段階的に拒否されます。 この問題を解決するには、Signatureバージョン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を使っている人は、最新バージョンに更新することで解決します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

エンジニアを目指す方必見!おすすめプログラミングスクール

最短でエンジニアになるには、いかに効率よく学習するかが重要です。モチベーションを維持しながら最短でエンジニアを目指すならプログラミングスクールを利用するのもおすすめです。

コメント

コメントする

目次