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

最終更新日: 2021 年 2 月 18 日

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

解決方法

SMTP ユーザー用に IAM コンソールで作成したアクセスキーは、Amazon SES SMTP インターフェイスでは機能しません。IAM コンソールで生成されるキーは、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.    シークレットアクセスキーを Amazon SES SMTP パスワードに変換するための Python コードをコピーします。

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

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

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

5.    このスクリプトは、Amazon SES で使用できる新しいシークレットアクセスキーを出力します。

#!/usr/bin/env python3

import hmac
import hashlib
import base64
import argparse

SMTP_REGIONS = [
    'us-east-2',       # US East (Ohio)
    'us-east-1',       # US East (N. Virginia)
    'us-west-2',       # US West (Oregon)
    'ap-south-1',      # Asia Pacific (Mumbai)
    'ap-northeast-2',  # Asia Pacific (Seoul)
    'ap-southeast-1',  # Asia Pacific (Singapore)
    'ap-southeast-2',  # Asia Pacific (Sydney)
    'ap-northeast-1',  # Asia Pacific (Tokyo)
    'ca-central-1',    # Canada (Central)
    'eu-central-1',    # Europe (Frankfurt)
    'eu-west-1',       # Europe (Ireland)
    'eu-west-2',       # Europe (London)
    'sa-east-1',       # South America (Sao Paulo)
    'us-gov-west-1',   # AWS GovCloud (US)
]

# These values are required to calculate the signature. Do not change them.
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):
    if region not in 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()

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


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