이 방법은 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 채널을 확장할때 활용할 수 있습니다.