AWS chalice를 이용해, 이메일을 전송해보자

아카·2021년 4월 18일
0

AWS

목록 보기
6/6

이해를 위해, 앞의 튜토리얼들을 읽고 오시기를 권장합니다,

AWS Chalice는 Serverless Framework 중의 하나로, 특히 AWS 내부의 자원을 활용하는 것에 특화되어 있습니다. 다른 Serverless 프레임워크에 비해 성능이 특별히 우수한 것은 아니지만, 파이썬과 AWS Lambda를 사용하는 프로그래머라면 익혀두면 편한 프레임워크 중 하나입니다.

예를 들어, Lambda로 간단한 작업을 구현해야 한다고 생각해 봅시다. 이런 경우에는 프레임워크를 사용해서 처리하는 것보다 그냥 AWS 웹 콘솔에서 간단하게 코드를 작성해서 배포할 수 있을 것입니다.

하지만 구현한 작업이 복잡해지면 이야기는 달라집니다. 특정 이벤트의 실행시에 수행되어야 하는 작업이나, 여러 리소스(AWS 내의 Queue나, AWS SES를 이용해야 하는 경우 등)를 사용해야하는 경우 등이 생기면 웹 콘솔에서 간단하게 배포하기란 거의 불가능합니다(가능은 하지만, 간단하지는 않겠죠..). 이런 경우에 사용하는 프레임워크가 Chalice로, 공식 문서를 보시면 여러가지 활용법이 나와있습니다. 특히, 정해진 시간에 실행해야 하는 작업 혹은 이벤트(S3, SNS, CloudWatch)가 발생했을 때 처리해야 하는 간단한 작업들은 Chalice를 이용하면 관리하기 쉽고 편하게 구현할 수 있습니다.

이 튜토리얼에서는 사용자가 접속을 하면(즉, API 호출이 되면) 그 사용자의 이메일로 메일을 보내는 간단한 튜토리얼을 만들어보도록 하겠습니다.

준비사항

  • AWS Lambda가 이메일을 보낼 수 있도록, AWS SES(Simple Email Service)에서 사용자의 이메일을 Verify(인증)할 필요가 있습니다.
    • 인증을 하지 않으면, Lambda가 아무리 이메일을 보내려고 해도 인증된 사용자가 아니라고 거부합니다.
    • 실제로 인증된 사용자 이외의 사용자에게 이메일을 보내기 위해서는 프로덕션 엑세스 권한을 얻어야 합니다. AWS 콘솔 → SES에서 프로덕션 액세스 권한을 얻을 수 있습니다.
    • SES에서 인증된 사용자끼리는 프로덕션 액세스 권한 없이 이메일을 보내고 받을 수 있으므로 이번 튜토리얼에서는 이를 이용하겠습니다. 테스트할 이메일 2개 정도를 인증해주세요(왼쪽의 Verified Identify에서 이메일을 입력한 다음에, 입력한 이메일에서 오는 메일을 통해 인증하면 됩니다).
  • 여기서는 다루지 않지만, Queue를 사용할 경우에는 Queue를 사용할 수 있게 하는 권한을 부여해야 합니다.

구현

첫 번째로, Chalice를 이용한 프로젝트를 하나 만들어봅시다. 아래의 명령을 입력해주세요.

$ python3 -m venv venv37
$ . venv37/bin/activate
$ python3 -m pip install chalice
$ chalice new-project app
$ cd app

설명하자면,

  • 첫 번째 줄은 가상 환경을 만들고,
  • 두 번째 줄은 만든 가상 환경에 연결하고,
  • 세 번째 줄은 가상 환경에 chalice를 설치하고,
  • 네 번째 줄은 app이라는 chalice 프로젝트를 만듭니다.
  • 마지막 줄은 그 프로젝트로 이동합니다.

app 디렉토리에는 여러 파일들이 있지만, 이 튜토리얼에서는 주로 app.py를 수정하겠습니다. 일단은, chalice가 바르게 작동하는지 테스트를 해 봅시다.

$ chalice deploy
...
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-2:862165648636:function:gt3-dev
  - Rest API URL: https://XXXXX.execute-api.ap-northeast-2.amazonaws.com/api/

이렇게 나오면 성공입니다. 크롬 혹은 다른 웹 브라우저를 켜서 저 https://~~~~~.amazonaws.com/api로 접속이 되는지 확인해보세요.

이제 app.py를 수정해서, https://~~~~.amazonaws.com/api/request/<email address>로 접속하면 그 <email address>에 메일을 전송하도록 만들어봅시다.

boto3를 이용하면 AWS Lambda 내에서 SES를 사용할 수 있습니다(즉, AWS Lambda 내에서 이메일을 보낼 수 있다는 말이 되죠). 우선은, boto3 내의 example을 참조해서 적당한 코드를 작성해 봅시다.

from chalice import Chalice
import boto3

app = Chalice(app_name='app')

SENDER = "<verified email>"

@app.route('/request/{email}')
def index(email):    
    RECIPIENT = str(email)

    AWS_REGION = "ap-northeast-2"

    SUBJECT = "Email Test"

    BODY_TEXT = ("Amazon SES Test (Python)\r\n"
                "This email was sent with Amazon SES using the "
                "AWS SDK for Python (Boto)."
                )
                
    BODY_HTML = """<html>
    <head></head>
    <body>
    <h1>Amazon SES Test (SDK for Python)</h1>
    <p>This email was sent with
        <a href='https://aws.amazon.com/ses/'>Amazon SES</a> using the
        <a href='https://aws.amazon.com/sdk-for-python/'>
        AWS SDK for Python (Boto)</a>.</p>
    </body>
    </html>
                """

    # The character encoding for the email.
    CHARSET = "UTF-8"

    # Create a new SES resource and specify a region.
    client = boto3.client('ses',region_name=AWS_REGION)

    # Try to send the email.
    try:
        #Provide the contents of the email.
        response = client.send_email(
            Destination={
                'ToAddresses': [
                    RECIPIENT,
                ],
            },
            Message={
                'Body': {
                    'Html': {
                        'Charset': CHARSET,
                        'Data': BODY_HTML,
                    },
                    'Text': {
                        'Charset': CHARSET,
                        'Data': BODY_TEXT,
                    },
                },
                'Subject': {
                    'Charset': CHARSET,
                    'Data': SUBJECT,
                },
            },
            Source=SENDER,
        )
    # Display an error if something goes wrong.	
    except Exception as e:
        return {"error": str(e)}
    return {'status': 200, 'message': '이메일을 성공적으로 보냈습니다!'}

이 코드에 대한 대략적인 설명은 다음과 같습니다.

  • SENDER는 이메일을 보내는 사람의 계정으로, 이메일을 받은 사람이 보게 될 "송신자"의 계정입니다. 아까 Verify(인증)한 이메일 주소를 입력해 주세요.
  • @app.route('/request/<email> 은, 주소에서 request 뒤의 부분을 email이라는 변수에 넣겠다는 의미입니다. flask와 유사한 방식입니다.

이제 이 API를 테스트해봅시다. chalice deploy를 하고, 받은 API 주소(https://i1qzwf79q4.execute-api.ap-northeast-2.amazonaws.com/api/)에 request/my-account@gmail.com을 붙여서 접속해 봅시다(즉, [https://XXXXXX.execute-api.ap-northeast-2.com/api/request/my-account@gmail.com으](https://xxxxxx.execute-api.ap-northeast-2.com/api/request/my-account@gmail.com으로)로 접속해봅시다).

접속하고 이메일 보내기까지 성공했다면, {'status':200, 'message': '이메일을 성공적으로 보냈습니다}라는 화면이 나올 것이고, 조금 기다리면 이메일이 오게 됩니다.

저번 튜토리얼에서 배운 를 사용해서 AWS Lambda를 구성할 수도 있습니다.

profile
코딩한량.

0개의 댓글