여러 Kinesis Data Streams 계정에 걸쳐 SES 알림을 스트리밍하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 5월 13일

다른 계정의 Amazon Kinesis 데이터 스트림으로 데이터를 전송하도록 Amazon Simple Email Service(Amazon SES) 이벤트 알림을 설정하려고 합니다. 어떻게 해야 합니까?

간략한 설명

다른 계정의 Amazon Kinesis 데이터 스트림으로 Amazon SES 이벤트 알림을 설정하려면 다음을 수행하십시오.

1.    SES 소스에서 시작합니다. SES에서 구성 설정을 업데이트하여 Amazon Simple Notification Service(Amazon SNS) 주제로 푸시합니다. 업데이트된 설정은 이 주제를 트리거로 구독하도록 AWS Lambda를 구성합니다.

2.    SNS를 구독합니다.

3.    교차 계정 액세스를 설정합니다.

4.    Amazon Kinesis Data Streams로 데이터를 전송하도록 Lambda를 설정합니다. 그러면 Lambda가 코드를 사용하여 Amazon SNS 주제에서 전체 이벤트를 가져옵니다. 또한 Lambda는 다른 계정에서 레코드를 데이터 스트림에 배포하는 역할을 합니다.

5.    Amazon Kinesis Client Library(KCL)를 사용하여 스트림의 레코드를 처리합니다.

​해결 방법

SES 소스에서 시작

SES 환경을 생성하고 이메일 계정을 목록에 추가합니다. 이 서비스를 통해 자신의 이메일 주소로 이메일을 보낼 이메일 계정을 확인합니다. 테스트 중에 발생할 수 있는 가능한 모든 이벤트 유형을 추적하기 위해 이메일에 대한 구성 세트를 설정합니다. 구성 세트에서 기본 추적 도메인을 사용하여 대상을 Simple Notification Service(SNS)로 설정합니다.

참고: 구성 세트를 생성할 때 주제를 생성하거나 세트를 생성하기 전에 주제를 생성할 수 있습니다.

구성 세트에 대한 자세한 내용은 Amazon SES 구성 세트 사용을 참조하십시오.

SNS 구독

생성된 알림 주제를 테스트하기 위해 SNS 주제에서 자신의 이메일 주소를 일시적으로 구독할 수 있습니다. 이렇게 하면 SES에서 온 메시지의 알림을 수신할 수 있습니다. Lambda를 구성할 때는 구독 목록을 참조해야 합니다.

중요: 테스트할 때 열기 또는 클릭 이벤트는 HTML 형식의 이메일에서만 추적할 수 있습니다. 이는 AWS에 추적 토큰이 들어 있는 보이지 않는 GIF 이미지가 포함되기 때문입니다. 이 추적 토큰은 열려 있는 알림 이메일을 추적하여 이벤트에 대한 피드백을 주제로 다시 제출합니다.

SES와 SNS가 통합되고 나면 SES 콘솔을 사용하여 통합이 성공했는지 확인할 수 있습니다. SES 콘솔의 왼쪽에서 [이메일 주소]를 선택합니다. 그런 다음 [테스트 이메일 보내기] 버튼을 선택하고 이메일 형식으로 [원시]를 선택합니다.

참고: 서식 지정된 옵션을 사용하는 경우 이메일은 HTML로 전송되지 않습니다. 따라서 열기 및 클릭 이메일 이벤트에 대한 피드백도 전송되지 않습니다.

콘솔에서 다음 템플릿을 사용할 수 있습니다.

Subject: Amazon SES Raw Email Test
MIME-Version: 1.0
Content-Type: text/html
X-SES-CONFIGURATION-SET: SESxLMxKIN
<!DOCTYPE html>
<html>
<body>
<h1>This text should be large, because it is formatted as a header in HTML.</h1>
<p>Here is a formatted link: <a href="https://docs.aws.amazon.com/ses/latest/DeveloperGuide/Welcome.html">Amazon Simple Email Service Developer Guide</a>.</p>
</body>
</html>

이 예제 템플릿에서는 구성 세트 이름이 헤더에 포함되어 있습니다. 선택한 이벤트에 적합한 구성을 사용할 수 있도록 구성 세트 이름이 포함됩니다. 이 구성 세트는 받은 편지함에서 이메일로 수행한 모든 작업에 대한 이메일 및 알림을 보냅니다. SNS에 대한 추가 자료는 Amazon SNS 알림 설정을 참조하십시오.

교차 계정 액세스 설정

다른 계정으로 메시지를 전송하는 설정을 생성합니다. 이렇게 하려면 다른 계정에서 역할을 위임할 수 있게 하는 역할과 정책이 필요합니다.

참고: 대상 계정에서 위임할 역할이 있어야 합니다. Lambda에 대한 실행 역할과 위임할 역할도 생성해야 합니다. 위임할 역할에는 필요한 서비스와 상호 작용할 수 있는 권한이 있습니다.

다음은 SES 및 Lambda를 사용하는 계정에 대한 예제 템플릿으로, Lambda 실행 역할에 연결해야 합니다.

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::222222222222:role/role-on-source-account"
    }
}

다음은 데이터 스트림이 있는 계정에 대한 예제 템플릿으로, Lambda가 위임하는 새 역할에 연결되어야 합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:role/my-lambda-executionrole-source-account"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

이 템플릿은 Lambda 실행 역할의 신뢰 관계를 정의합니다. Lambda 실행 역할은 Kinesis 데이터 스트림으로 데이터를 전달하는 역할을 위임합니다.

참고: Lambda가 위임하는 역할에는 Kinesis 데이터 스트림에 레코드를 배포할 수 있는 권한이 있어야 합니다.

Kinesis Data Streams로 데이터를 전송하도록 Lambda 설정

다음과 같은 템플릿을 사용하여 데이터를 Data Streams로 전송하도록 Lambda를 설정할 수 있습니다.

from __future__ import print_function
import base64 #Kinesis only accepts base64 encoded payloads. 
import boto3  #Allow programmatic access to AWS services.
import json
print('Loading function')
def lambda_handler(event, context):
    # Setting up the assumeRole for cross-account
    sts_connection = boto3.client('sts')
    acct_b = sts_connection.assume_role(
        RoleArn="arn:aws:iam::[ADD_ACCOUNT_ID]:role/AssumeLambdaCrossAccount", #TODO: Add relevant role ARN
        RoleSessionName="cross_acct_lambda"
    )
    print(acct_b)
    
    ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
    SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
    SESSION_TOKEN = acct_b['Credentials']['SessionToken']
    
    #Gets the SNS message that was posted (cliks, opens, sends, deliveries etc.)
    message = event['Records'][0]['Sns']['Message'] #Fetching the message in the JSON structure received.
    print("From SNS: " + message) #Checking the message received from SNS.
    
    #TODO:Generate a random partitionKey for kinesis. 
    #If a random partitionKey is not used in a multi shard stream it will lead to performance problems
    #PartitionKey = RandomKey
    
    print("Add data to cross-account stream")
    kinesis_client = boto3.client('kinesis',region_name="us-east-1",aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY,aws_session_token=SESSION_TOKEN) #Initiates the kinesis service with cross-account credentials.. 
    kinesis_client.put_record(StreamName="CrossAccountTest",Data=json.dumps(message),PartitionKey="partitionKey")

이 Python 코드 예제에서는 환경에 맞게 RoleArn을 스트림 이름 및 리전으로 바꿉니다. 이 함수는 SES에서 수신한 SNS 메시지를 받아 대상 계정의 역할을 위임합니다. 그러고 나면 위임된 역할이 메시지를 대상 스트림에 배포합니다.

Lambda를 SNS 주제의 구독자로 구성하려면 다음 단계를 따르십시오.

1.    Amazon SNS 콘솔에 로그인합니다.

2.    탐색 창에서 [주제]를 선택합니다.

3.    [주제] 페이지에서 주제를 선택합니다.

4.    [구독] 섹션에서 [구독 생성]을 선택합니다.

5.    [구독 생성] 페이지에서 선택한 [주제 ARN]을 확인합니다.

6.    프로토콜 유형으로 [AWS Lambda]를 선택합니다.

7.    엔드포인트를 설정할 함수의 Amazon 리소스 이름(ARN)을 입력합니다.

8.    [구독 생성]을 선택합니다.

Lambda를 SNS 구독자로 사용하는 방법에 대한 자세한 내용은 AWS Lambda 함수가 구독자인 경우 시스템 간 메시징에 Amazon SNS 사용을 참조하십시오.

Lambda가 구독하는 SNS 주제에 메시지가 게시되면, 게시된 메시지의 페이로드와 함께 Lambda가 호출됩니다. 샘플 메시지 기록 스토어를 생성하는 방법에 대한 자세한 내용은 Amazon SNS를 통해 AWS Lambda 함수 호출을 참조하십시오.

참고: 교차 계정 액세스를 설정하지 않으려면 [자격 증명 ] 섹션을 제거하고 로컬 Kinesis 데이터 스트림에 작성할 수 있습니다. Lambda 및 Python과 함께 Kinesis를 사용하는 방법에 대한 자세한 내용은 AWS Boto3 설명서의 Kinesis를 참조하십시오.

KCL을 사용하여 레코드 처리

KCL을 사용하여 Kinesis 데이터 스트림의 레코드를 처리할 수 있습니다. 데이터가 Kinesis 데이터 스트림에 있으면 사용자 지정 애플리케이션을 구축하고 분석과 시각화를 위해 Kinesis Data Analytics를 구현할 수 있습니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?