이 방법은 AWS Lambda에서 NBP의 문자 서비스를 활용하는 예시입니다.

Runtime: Python 3.7

Python 3.7
import hashlib
import hmac
import base64
import requests
import time
import json
import os

def	make_signature(uri, access_key, timestamp):
	secret_key = os.environ['NBP_SECRET_KEY']
	secret_key = bytes(secret_key, 'UTF-8')
	method = "POST"
	message = method + " " + uri + "\n" + timestamp + "\n" + access_key
	message = bytes(message, 'UTF-8')
	signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())
	return signingKey

def lambda_handler(event, context):
    # TODO implement
    timestamp = int(time.time() * 1000) 
    timestamp = str(timestamp)
    
    url = "https://sens.apigw.ntruss.com"
    requestUrl = "/sms/v2/services/"
    requestUrl2 = "/messages"
    serviceId = os.environ['NBP_SERVICE_ID']
    access_key = os.environ['NBP_ACCESS_KEY']
    
    uri = requestUrl + serviceId + requestUrl2
    apiUrl = url + uri
    
    messages = { "to" : os.environ['RECV_PHONE_NUMBER'] }
    body = {
        "type" : "SMS",
        "contentType" : "COMM",
        "from" : os.environ['SEND_PHONE_NUMBER'],
        "subject" : "제목은 SMS에서는 안가요.",
        "content" : "내용이 전달됩니다. 하하하.",
        "messages" : [messages]
    }
    body2 = json.dumps(body)
    headers = {
        'Content-Type': 'application/json; charset=utf-8',
        'X-ncp-apigw-timestamp': timestamp,
        'x-ncp-iam-access-key': access_key,
        'x-ncp-apigw-signature-v2': make_signature(uri, access_key, timestamp)
        }

    res = requests.post(apiUrl, headers=headers, data=body2)
    return {
        'statusCode': res.status_code,
        'body': res.json()
    }


실서비스 추가를 고려한다면, 예외 처리, 반복 호출 방지, 안전한 환경 변수 보관(AWS Secrets Manager) 등을 고려하는 것이 좋을 것입니다.

예를 들면, Step function을 활용하거나, 외부에 최근 호출한 시간을 조회하여 다른 외부 API 활용을 제한합니다. (상대적으로 훨신 저렴해 질 수 있도록)

이외에 Amazon Pinpoint의 커스텀 채널로 국가별로 SNS 채널을 확장할때 활용할 수 있습니다.

  • 레이블 없음