はじめに
RailsでAmazon SESの署名バージョンを3から4に対応させたときの備忘録です。
SESのライブラリはgem 'aws-ses'
を使っていました。
人によってファイルの設定やリージョンなどは異なるので、あくまで参考程度にしてください。
環境
- Rails 6.0.3.7
- ruby 2.6.5
- MacOS
gem 'aws-ses', '~> 0.6'
エラー内容
FATAL -- :
AWS::SES::ResponseError (InvalidClientTokenId - 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):
google翻訳
致命的-:
AWS :: SES :: ResponseError(InvalidClientTokenId-署名バージョン3のリクエストは2021年3月1日から非推奨になりました。その日以降、このようなリクエストは段階的に拒否されます。問題を解決するには、署名バージョン4に移行する必要があります。 -リクエストに署名するには、署名バージョン4 [2]を使用したAmazonSES API [1]へのリクエストの認証に関するドキュメントを参照してください。リクエストに自己署名しない場合は、SDK / CLIを最新バージョンに更新してください。[ 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):
エラーの内容通り、署名バージョンを4に移行させる必要があるそうです。
やったこと
gem 'aws-ses', '~> 0.6'
を gem aws-ses-v4
に変えた。
aws-sesのissuesをみると、バージョン4に移行することについて結構多くの人が話していました。
gem aws-ses-v4
はgem 'aws-ses'
を署名バージョン4に対応させたgemです。
他にもAWSが推奨しているaws-sdk-rails
というGemがあるそうですが、そちらに移行させる時間はなさそうだったので今回はaws-ses-v4
を使うことにしました。
できれば公式が推奨している方を使うべきだと思います。
Gemを変更
- gem 'aws-ses', '~> 0.6'
+ gem "aws-ses-v4", require: "aws/ses"
$ bundle install
aws.rbの変更
ここら辺は人によって違うかもしれません。
各々のメールの設定に合わせてください。
ちなみに私は最終的に以下のようになりました。
ActionMailer::Base.add_delivery_method :ses,
AWS::SES::Base,
access_key_id: Rails.application.credentials.aws_ses_access_key_id,
secret_access_key: Rails.application.credentials.aws_ses_secret_access_key,
server: 'email.リージョン名.amazonaws.com', #人によって違います
region: 'リージョン名' #SESのリージョンを指定。 例:us-east-2
以下のエラーが出た時はSESのリージョンが間違っている可能性があります。
SignatureDoesNotMatch - Credential should be scoped to a valid region, not 'ap-northeast-1'
また、awsのアクセスキーなどを記載するcredentials.yml.encには、以下のコマンドで確認・編集できます。
EDITOR=vim rails credentials:edit
以上です。