본문 바로가기
AWS

[Amazon] AWS SES 사용해서 Lambda 에서 E-mail 보내기

by bryan.oh 2023. 8. 25.
반응형

SES는 바다, 유진, 슈 의 약자로.. SeaEugeneShoo

가.. 아니고

Simple Email Service

 

1. AWS Console 에서 simple email... 검색

 

일 200건까지 이메일 발송이 무료 입니다. (리소스가 제한된 샌드박스에서 프로덕션으로 넘어가면 리소스를 더 사용할 수 있습니다.)

프로덕션 엑세스 요청으로 더 많이 발송 가능합니다.

 

 

2. 자격 증명 생성

 

email 입력 후 [자격 증명 생성] 클릭

 

이제 위에 입력한 본인의 이메일을 확인해주세요.

이 링크를 클릭해서 이메일 소유를 증명합니다.

클릭해서 뜨는 페이지는 닫아도 되고, 다시 AWS 콘솔의 Amazon SES 페이지에서

[테스트 이메일 전송] 버튼을 누릅니다.

 

3. 테스트 발송

gmail 가서 확인해보면,

잘 옵니다.

 

4. Lambda 함수 생성

서비스에서 Lambda 검색

함수 생성

아무 Python 버전을 선택해도 됩니다. 전 3.11 을 선택했습니다. 

잠깐이면 함수가 생성됩니다.

 

5. Lambda 함수 이메일 전송 코드 작성

import json
import boto3
import botocore

def lambda_handler(event, context):
    sender = event.get('sender', 'com.bryan.oh@gmail.com')
    to_email = event.get('to_email')
    subject = event.get('subject')
    content = event.get('content')
    content_type = event.get('content_type', 'Text')  # Html / Text
    

    client = boto3.client("ses", region_name="ap-northeast-2")

    try:
        response = client.send_email(
            Destination={
                "ToAddresses": [
                    to_email,
                ],
            },
            Message={
                "Body": {
                    content_type: {
                        "Charset": "UTF-8",
                        "Data": content,
                    }
                },
                "Subject": {
                    "Charset": "UTF-8",
                    "Data": subject,
                },
            },
            Source=sender,
        )
    except botocore.exceptions.ClientError as e:
        err_message = e.response.get("Error", {}).get("Message")
        print(err_message)
        return {
            'statusCode': 500,
            'body': json.dumps(err_message)
        }

    return {
        'statusCode': 200,
        'body': json.dumps('Success Message ID : ' + response.get('MessageId', ''))
    }

 

6. Deploy 후 Test

Test 버튼을 누르면 이벤트를 구성하는 다이알로그가 나옵니다.

아래와 같이 입력합니다.

{
  "sender": "SES에서 인증을 받았던 이메일",
  "to_email": "받는 사람 이메일 주소",
  "subject": "메일 제목입니다",
  "content": "안녕, \nhello-bryan.tistory.com \n반가워",
  "content_type": "Text"
}

sender, to_email, subject, content 를 바꿔주세요.

content 에 html 을 보내려면 html 로 입력하고,  content_type 을 "Html" 로 합니다.

 

그리고 실행해보면,

Response
{
  "statusCode": 500,
  "body": "\"User `arn:aws:sts::11111:assumed-role/EmailSender-role-zzzzzz/EmailSender' is not authorized to perform `ses:SendEmail' on resource `arn:aws:ses:ap-northeast-2:111111111:identity/com.bryan.oh@gmail.com'\""
}

이런 오류가 발생합니다.

원인은 Lambda 함수가 이메일 보낼 권한이 없어서 그렇습니다.

 

권한을 추가하는 방법은 여러가지 있지만, 여기에서는 두가지만 해보겠습니다.

7-1. 권한 추가  (Lambda 실행 역할에 SES 권한주기)

구성 -> 권한 -> 역할 이름 을 클릭합니다. Lambda 함수 이름으로 시작되는 역할입니다.

권한추가 -> 정책연결 을 클릭합니다.

 

권한 검색란에 SES를 입력하고, 아래 항목에 체크, 하단에 [권한추가] 버튼을 누릅니다.

이제 Lambda 함수를 실행하는 역할에 SES 권한이 추가되었습니다.

다시 Lambda 함수로 가서 Test 버튼을 눌러보면,

발송 성공 메시지가 뜹니다.

 

7-2. 권한 추가 ( SES 에 Lambda 함수 권한 추가하기 )

권한을 추가하는 두번째 방법입니다.

서비스 콘솔에서 Simple Email Service 를 검색하고, 

확인된 자격 증명 -> 위에서 등록했던 이메일 클릭.

권한부여 탭에 [정책 생성기 사용]버튼 클릭

 

브라우저에서 AWS 콘솔 탭을 하나 더 띄우고,
Lambda 로 돌아와서, 권한이 없다는 메시지에서 User : 뒤에 문자를 복사합니다. 아래 빨간색 부분.

 

복사한 User arn 을 아래의 "보안주체" 에 붙혀넣기 하고, 바로 아래 추가 버튼을 누릅니다.

그리고 작업 추가 드랍다운을 누르고 
ses:SendEmail, ses:SendRawEmail, ses:SendTemplatedEmail 을 추가합니다.
(지금 테스트하는것은 ses:SendEmail 만 있어도 됩니다.)

다음 버튼 -> 다음 버튼 -> [정책 적용] 버튼까지 클릭.

 

그리고 Lambda 에서 Test 해보면, 

성공.

 

참고

lambda 의 기본 실행 시간은 3초로 되어있습니다.
이메일은 보통 1~2초 걸리는데, 아슬아슬하니까 실행 시간을 늘려주세요~
구성 -> 일반구성 -> 제한시간 

 

이제 이 Lambda 함수 URL을 호출해서 파라메터를 넘겨 받아서 메일 발송을 하면 됩니다.

requestBody 로 파라메터를 받아야겠네요.

이건 시간될 때 포스트 작성하도록 하겠습니다.

 

728x90
반응형

댓글