ClientError: Произошла ошибка (AccessDenied) при вызове операции SendEmail: - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу использовать лямбду, чтобы отправлять автоматические электронные письма всякий раз, когда файл попадает в указанную c область s3-корзины. Когда я помещаю файл в корзину в указанном месте и он пытается запуститься, я получаю следующую ошибку в логах cloudwatch:

[ERROR] ClientError: An error occurred (AccessDenied) when calling the SendEmail operation: User `arn:aws:sts::123456789012:assumed-role/my-bot-role-abcdefg/my-bot' is not authorized to perform `ses:SendEmail' on resource `arn:aws:ses:eu-west-1:123456789012:identity/my_address@gmail.com'
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 44, in lambda_handler
    Message = message   )
  File "/var/runtime/botocore/client.py", line 316, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/var/runtime/botocore/client.py", line 626, in _make_api_call
    raise error_class(parsed_response, operation_name)

Я записал следующие разрешения в политику json:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": [
                "ses:SendEmail"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:ses:eu-west-1:123456789012:identity/*"
        }
    ]
}

Основа кода, который я использую в лямбда-дескрипторе, прежде чем я планирую модифицировать его для конкретных c целей, не является моей собственностью:

import json
import boto3

email_defaults = {
    "port" : 465,  # For SSL
    "smtp_server" : "smtp.gmail.com",
    "sender_email" : "my_sender_address@gmail.com", #replace as needed in testing
    "receiver_email" : "my_reciever_address@gmail.co.uk" #replace as needed in testing
    }

def lambda_handler(event, context):

    for i in event["Records"]:
        action = i["eventName"]
        ip = i["requestParameters"]["sourceIPAddress"]
        bucket_name = i["s3"]["bucket"]["name"]
        object = i["s3"]["object"]["key"]

    client = boto3.client("ses")

    subject = str(action) + 'Event from ' + bucket_name
    body = """
        <br>
        This email is to notify you regarding {} event.
        The object {} has been uploaded.
        Source IP: {}
    """.format(action, object, ip)

    message = {"Subject": {"Data": subject}, "Body": {"Html": {"Data": body}}}

    response = client.send_email(   Source = email_defaults["sender_email"], 
                                    Destination = {"ToAddresses": [email_defaults["receiver_email"]]}, 
                                    Message = message   )

    return "Hello world"

Любые указания на все, что я возможно, упустили бы из виду, но в настоящее время я весьма озадачен.

1 Ответ

0 голосов
/ 24 апреля 2020

Вы должны добавить политику, которая разрешает отправку электронной почты вашей роли.

в консоли, go в службу IAM IAM Service

затем слева выберите роли:

choose roles

выберите свою роль: select role

затем добавить встроенную политику inline policy

choose SES as service, then all SES Actions, and all resources (you can reduce this permissions if needed)

, затем просмотрите и сохраните. и сделано! вы готовы отправлять электронные письма через lambda

...