Отправить SMS через AWS SNS с помощью boto3 в функции AWS Lambda?

Я хотел бы отправить SMS-сообщение из функции AWS Lambda, используя метод публикации boto3, чтобы уведомить пользователя о проблемах с помощью SMS. Моя лямбда-функция написана на Python, и я использую модуль boto3. Моя лямбда-функция имеет полные права на SNS. У меня есть этот код,

sns = boto3.client('sns')
sns.publish(
    PhoneNumber = '+11234567890',
    Message = 'Simple text message'
)

В соответствии с документацией boto3 метод публикации принимает следующие параметры:

response = client.publish(
    TopicArn='string',
    TargetArn='string',
    PhoneNumber='string',
    Message='string',
    Subject='string',
    MessageStructure='string',
    MessageAttributes={
        'string': {
            'DataType': 'string',
            'StringValue': 'string',
            'BinaryValue': b'bytes'
        }
    }
)

Для этого требуется параметр "Сообщение" и один из следующих трех параметров, как описано в документах:

ТемаArn (строка) - тема, которую вы хотите опубликовать.

Если вы не указали значение параметра TopicArn, вы должны укажите значение для параметров PhoneNumber или TargetArn.

TargetArn (строка) - либо TopicArn, либо EndpointArn, но не оба.

Если вы не укажете значение для параметра TargetArn, вы должны укажите значение для параметров PhoneNumber или TopicArn.

PhoneNumber (строка) - номер телефона, которому вы хотите доставить SMS-сообщение. Используйте формат E.164.

Если вы не укажете значение для параметра PhoneNumber, вы должны укажите значение для параметров TargetArn или TopicArn.

Когда мой код выполняется, возвращается ошибка проверки параметров. В нем указано,

Неизвестный параметр на входе: "PhoneNumber", должен быть одним из: TopicArn, TargetArn, > Message, Subject, MessageStructure, MessageAttributes ".

Поэтому в документации, по-видимому, указывается, что PhoneNumber является допустимым параметром, но при использовании возникает ошибка, и обратная связь от ошибки указывает, что PhoneNumber не является возможным параметром. Я подозреваю, что упускаю что-то очевидное и простое, но могу использовать некоторую помощь.

Я знаю, что есть другие способы отправлять SMS-сообщения, такие как шлюзы электронной почты и другие поставляемые поставщиком решения, такие как Twilio, но я хотел бы продолжить маршрут на основе SNS и понять, где я поступил неправильно.

Ответ 1

На самом деле ваш пример выглядит правильно. Вот что я пробовал

import boto3
sns = boto3.client('sns')
number = '+17702233322'
sns.publish(PhoneNumber = number, Message='example text message' )

Работал как шарм. Я рекомендую сначала использовать awscli, настроенный с учетными данными учетной записи root, и взять код для тестового диска. После его создания либо создайте нового пользователя с правами, которые вам нужны, либо примените его к роли экземпляра.

Вам необходимо создать политику, которая позволяет SNS: публиковать на ресурсе: * (разрешить текстовое сообщение всем) или ресурс: '+17702233322' (разрешить текст конкретному номеру).