既存の Amazon SES SMTP IAM ユーザーのアクセスキーを更新するにはどうすればよいですか?

最終更新日: 2022 年 5 月 18 日

AWS Identity and Access Management (IAM) で Amazon Simple Email Service (Amazon SES) Simple Mail Transfer Protocol (SMTP) 認証情報を更新したいと考えています。Amazon SES と互換性のあるユーザー名とパスワードを作成するにはどうすればよいですか?

解決方法

SMTP ユーザー用に IAM コンソールで作成するアクセスキーは、お客様が SES API エンドポイントに接続しているときには機能しますが、Amazon SES SMTP インターフェイスでは機能しません。IAM コンソールで生成されるキーは、Amazon SES SMTP サーバーに必要な認証情報に求められる形式とは異なる形式です。

既存のシークレットアクセスキーを変換する代わりに、新しい Amazon SES SMTP 認証情報を作成することがベストプラクティスです。 

Amazon SES SMTP インターフェイスの認証情報をセットアップするには、次のいずれかを実行します。

新しい Amazon SES SMTP 認証情報を作成する (推奨)

1.    Amazon SES コンソールを使用して、新しい Amazon SES SMTP 認証情報を作成します。

2.    新しい認証情報を取得した後、不要な IAM の既存の Amazon SES 認証情報を削除することができます。

既存のシークレットアクセスキーを Amazon SES SMTP 形式に変換する

注: 以降の手順で Python 3 以降のバージョンを使用する必要があります。

1.    少なくとも ses:SendRawEmail のアクセス許可を付与するように、既存の IAM ユーザーのポリシーを更新します。

2.    以下の Python コードをテキストエディタに貼り付け、ファイルを seskey.py という名前で保存します。

#!/usr/bin/env python3

import hmac
import hashlib
import base64
import argparse

SMTP_REGIONS = [
    'us-east-2',       # 米国東部 (オハイオ)
    'us-east-1',       # 米国東部 (バージニア北部)
    'us-west-2',       # 米国西部 (オレゴン)
    'ap-south-1',      # アジアパシフィック (ムンバイ)
    'ap-northeast-2',  # アジアパシフィック (ソウル)
    'ap-southeast-1',  # アジアパシフィック (シンガポール)
    'ap-southeast-2',  # アジアパシフィック (シドニー)
    'ap-northeast-1',  # アジアパシフィック (東京)
    'ca-central-1',    # カナダ (中部)
    'eu-central-1',    # 欧州 (フランクフルト)
    'eu-west-1',       # 欧州 (アイルランド)
    'eu-west-2',       # 欧州 (ロンドン)
    'sa-east-1',       # 南米 (サンパウロ)
    'us-gov-west-1',   # AWS GovCloud (米国)
]

# これらの値は、署名を計算するために必要です。変更しないでください。
DATE = "11111111"
SERVICE = "ses"
MESSAGE = "SendRawEmail"
TERMINAL = "aws4_request"
VERSION = 0x04


def sign(key, msg):
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()


def calculate_key(secret_access_key, region):
    リージョンが SMTP_REGIONS にない場合:
        raise ValueError(f"The {region} Region doesn't have an SMTP endpoint.")

    signature = sign(("AWS4" + secret_access_key).encode('utf-8'), DATE)
    signature = sign(signature, region)
    signature = sign(signature, SERVICE)
    signature = sign(signature, TERMINAL)
    signature = sign(signature, MESSAGE)
    signature_and_version = bytes([VERSION]) + signature
    smtp_password = base64.b64encode(signature_and_version)
    return smtp_password.decode('utf-8')


def main():
    parser = argparse.ArgumentParser(
        description='Convert a Secret Access Key for an IAM user to an SMTP password.')
    parser.add_argument(
        'secret', help='The Secret Access Key to convert.')
    parser.add_argument(
        'region',
        help='The AWS Region where the SMTP password will be used.',
        choices=SMTP_REGIONS)
    args = parser.parse_args()
    print(calculate_key(args.secret, args.region))


if __name__ == '__main__':
    main()

3.    Python スクリプトを実行するには、既存のシークレットアクセスキーを入力します。その後、スペースと SMTP パスワードを使用する AWS リージョンを入力します。次のコマンドを実行します。

python3 seskey.py YOURKEYrrpg/JHpyvtStUVcAV9177EAKKmDP37P us-east-1

重要:必ず認証情報を入力し、このスクリプトを安全で信頼できるマシンで実行してください。

4.    このスクリプトは、Amazon SES で使用できる新しいシークレットアクセスキーを出力します。生成された SMTP 認証情報をアプリケーションに保存し、その認証情報を使用して SES SMTP エンドポイントに接続します。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?