Laravel

AWS 문자서비스(SNS) 연동

짱구를왜말려? 2020. 3. 25. 17:57
반응형
SMALL

1. 설치 및 세팅

 

@ composer.json

composer require aws/aws-sdk-php-laravel

 

@ config/app.php

 'providers' => array(
        // ...
        Aws\Laravel\AwsServiceProvider::class,
    )
    
    => 버전 8 기준으로는 이거 안해도 되는듯
 'aliases' => array(
        // ...
        'AWS' => Aws\Laravel\AwsFacade::class,
    )

 

@ env에 다음 값들 세팅

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
php artisan vendor:publish  --provider="Aws\Laravel\AwsServiceProvider"

@ aws.php의 AWS_REGION을 AWS_DEFAULT_REGION으로 바꿔놓기

 

 

2. AWS sns 서비스 신청

1) sns 주제 생성(이 때 화면 오른쪽 위 region을 tokyo로 해놔야돼, 서울 지원안함)

 

2) 한도 추가 요청 미리 보내놓기(샌드박스 해제)

-> 이거 해야만 문자 보낼 수 있어, 안그러면 문자가 안가

-> 처음부터 10000$ 이렇게 요청하면 정지당하니까 400$정도로 요청

 

(support history 참고해)

-> 한도 추가되면 계정지출한도 늘려야돼(안그러면 메세지 몇개 못보내)

3) 기존 IAM 계정에 AmazonSNSFullAccess 권한 주기

 

4) Simple Queue Service 설정

- 대기열 이름을 [프로젝트명_용도]처럼 지어

(habito_verification)

 

- 표준 대기열(Standard Queue)로 대기열 빠른 생성

 

- 만든 대기열 클릭 후 "작업" > "Amazon SNS 주제 구독" 클릭 후 아까 만든 주제 연결

 

5) 실제 테스트해보기

@ .env

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=

 

@web.php

Route::get('/', function () {
    $snsClient = new \Aws\Sns\SnsClient([
        "region" => "ap-northeast-1",
        "version" => "2010-03-31",
    ]);

    $message = "테스트";
    $phone = "+8201030254488"; // 한국은 앞에 +82 붙여야돼

    if (!$result = $snsClient->checkIfPhoneNumberIsOptedOut(['phoneNumber' => $phone])) { // 번호확인 실패
        return;
    }

    if ($result['isOptedOut']) { // 잘못된 번호 맞다면
        return;
    }

    return $snsClient->publish([
        'Message' => $message,
        'PhoneNumber' => $phone
    ]);
});

 

3. SMS 클래스로 만들어놓기

@ SMS.php

<?php

namespace App\Models;

use Aws\Sns\SnsClient;

class SMS
{
    protected $client;

    public function __construct()
    {
        $this->client = new \Aws\Sns\SnsClient([
            "region" => "ap-northeast-1",
            "version" => "2010-03-31",
        ]);
    }

    public function send($to, $message)
    {
        if (!$result = $this->client->checkIfPhoneNumberIsOptedOut(['phoneNumber' => $to])) { // 번호확인 실패
            return;
        }

        if ($result['isOptedOut']) { // 잘못된 번호 맞다면
            return;
        }

        return $this->client->publish([
            "Message" => $message,
            "PhoneNumber" => $to
        ]);
    }
}

 

LIST