AWS Lambda отправлять SMS через AWS-PHP-SDK не работает

Описание проблемы:

Я не могу отправлять SMS с AWS Lambda.

Код контроллера

          try {
        $sms = AwsFacade::createClient('sns');
        $result = $sms->publish([
            'MessageAttributes' => [
                'AWS.SNS.SMS.SenderID' => [
                    'DataType' => 'String',
                    'StringValue' => 'CyQuer',
                ],
                'AWS.SNS.SMS.SMSType' => [
                    'DataType' => 'String',
                    'StringValue' => 'Transactional',
                ],
            ],
            'Message' => "Hello John Doe".PHP_EOL."Use following Code to Login:".PHP_EOL."123456",
            'PhoneNumber' => $phone,
        ]);
        Log::info($result);
    } catch (Exception $e) {
        Log::error($e->getMessage());
    }

Сообщение об ошибке:

через Интернет
{"message": "Internal server error"}
Время ожидания задачи истекло через 28.00 секунд

через Artisan
Задание истекло через 120.00 секунд

Настраивать


Было создано приложение Laravel, работающее на AWS Lambda с использованием IAM-пользователя bref / laravel-bridge для этого приложения. Локально все работает. В сети тоже все работает, кроме отправки смс.

Опробованные решения:

Были опробованы следующие пакеты.

https://github.com/aws/aws-sdk-php

https://github.com/aws/aws-sdk-php-laravel

Все описанные ниже подходы работали локально на AWS Lambda, но не работали.
Запишите AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY прямо в config / aws.php
Запишите AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY прямо в коде

              $sms = AwsFacade::createClient('sns',[
            'credentials' => [
                'key'    => '********************',
                'secret' =>  '****************************************',
            ],
            'region' => env('AWS_REGION', 'eu-central-1'),
            'version' => 'latest',
            'ua_append' => [
                'L5MOD/' . AwsServiceProvider::VERSION,
            ],
        ]);

Не сработало и предоставление всем пользователям IAM полного административного доступа.

Локально все альтернативные решения тоже всегда работали!

Кто-нибудь знает проблему и есть решение? Я пытаюсь найти способ больше 24 часов. Моим последним подходом было бы перестроить полный вызов через CURL и попробовать его, но я надеюсь, что кто-то найдет / найдет решение.

2 ответа

Для тех, кто сталкивается с подобной проблемой, это может быть / скорее всего связано с тем, что лямбда настроена в VPC (скорее всего, чтобы предоставить ей доступ к RDS) и, следовательно, теряет подключение к Интернету и, как следствие, доступ к другим сервисам AWS. Один из способов обойти это — разрешить доступ в Интернет к вашей лямбде, связанной с VPC, путем настройки шлюза NAT (руководство здесь). Кроме того, вы также можете использовать конечные точки VPC, если нужный сервис AWS поддерживается. Больше информации здесь.

По моему опыту, у меня были проблемы с невозможностью использовать определенные учетные данные для определенных клиентов в AWS PHP SDK. Я видел, что лучшим решением является включение разрешений IAM, необходимых в утверждения политики для самой лямбда-функции.

Например, в этом случае вам может потребоваться включить соответствующее заявление для SNS, как показано ниже:

      {
    "Action": [
        "ses:*"
    ],
    "Resource": "*",
    "Effect": "Allow"
}

Если вы используете для развертывания, вы можете определить его в разделе в файл, как показано ниже:

      provider:
  name: aws
  iamRoleStatements:
    - Effect: Allow
      Action:
        - sns:*
      Resource: '*'

ВАЖНО: Предоставляйте только минимальные разрешения, необходимые вашей лямбде. Приведенные выше утверждения являются лишь примерами.

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

Другие вопросы по тегам