Comment puis-je diffuser des notifications SES sur différents comptes Kinesis Data Streams ?

Date de la dernière mise à jour : 13/05/2020

Je souhaite configurer les notifications d'événements Amazon Simple Email Service (Amazon SES) pour envoyer des données à un flux de données Amazon Kinesis dans un autre compte. Comment puis-je procéder ?

Brève description

Procédez comme suit pour configurer des notifications d'événements Amazon SES vers un flux de données Amazon Kinesis d'un autre compte :

1.    Démarrez à la source SES. Mettez à jour vos paramètres de configuration dans SES pour effectuer une transmission vers une rubrique Amazon Simple Notification Service (Amazon SNS). Le paramètre mis à jour configure AWS Lambda pour s'abonner à la rubrique en tant que déclencheur.

2.    Abonnez-vous à SNS.

3.    Configurez l'accès entre comptes.

4.    Configurez Lambda pour envoyer des données vers Amazon Kinesis Data Streams. Lambda utilise ensuite le code pour récupérer l'événement complet dans la rubrique Amazon SNS. Lambda endosse également un rôle dans un autre compte, notamment en ce qui concerne le placement des enregistrements dans le flux de données.

5.    Utilisez Amazon Kinesis Client Library (KCL) pour traiter les enregistrements dans le flux.

Résolution

Commencer à la source SES

Créez un environnement SES et ajoutez votre compte de messagerie à la liste. Vérifiez le compte de messagerie pour envoyer des e-mails via le service à votre propre adresse e-mail. Configurez un jeu de configurations pour les e-mails afin de suivre tous les types d'événements possibles qui peuvent se produire pendant les tests. Dans le jeu de configurations, définissez Simple Notification Service (SNS) comme destination en utilisant le domaine de suivi par défaut.

Remarque : vous pouvez créer la rubrique lors de la création de votre jeu de configurations. Vous aussi pouvez la créer avant de créer le jeu.

Pour plus d'informations sur les jeux de configurations, consultez Utilisation des jeux de configurations Amazon SES.

S'abonner à SNS

Pour tester la rubrique de notification créée, vous pouvez abonner temporairement votre propre adresse e-mail à la rubrique SNS. Ainsi, vous recevez les notifications des messages envoyés par SES. Veuillez noter que vous devrez référencer la liste des abonnements lors de la configuration de Lambda.

Important : lors du test, n'importe quel événement d'ouverture ou de clic peut être suivi uniquement dans les e-mails au format HTML. Cela est dû au fait qu'AWS intègre une image GIF invisible, qui contient un jeton de suivi. Ce jeton de suivi suit tous les e-mails de notification ouverts, en particulier en envoyant des commentaires pour l'événement à la rubrique.

Une fois SES et SNS intégrés, vous pouvez vérifier que l'intégration a abouti en utilisant la console SES. Choisissez Adresses e-mail dans la partie gauche de la console SES. Ensuite, choisissez le bouton Envoyer un e-mail de test et sélectionnez brut comme format d'e-mail.

Remarque : si vous utilisez l'option formatée, l'e-mail n'est pas envoyé au format HTML. Par conséquent, les commentaires pour les événements d'e-mail d'ouverture et de clic ne sont pas envoyés.

Vous pouvez utiliser le modèle suivant dans la console :

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>

Dans cet exemple de modèle, notez que le nom du jeu de configurations est inclus dans les en-têtes. Le nom du jeu de configurations est inclus pour utiliser la configuration pour les événements choisis. Ce jeu de configurations vous envoie un e-mail et des notifications pour toutes les actions effectuées avec l'e-mail dans votre boîte de réception. Pour en savoir plus sur SNS, consultez Configuration des notifications Amazon SNS.

Configurer l'accès entre comptes

Créez la configuration pour envoyer les messages à un autre compte. Cela nécessite des rôles et des stratégies pour vous permettre d'endosser des rôles dans un autre compte.

Remarque : vous devez obligatoirement endosser un rôle dans le compte de destination. Le rôle d'exécution pour Lambda et le rôle qui doit être endossé doivent être également créés. Le rôle qui doit être endossé dispose des autorisations nécessaires pour interagir avec les services nécessaires.

Voici un exemple de modèle pour le compte avec SES et Lambda, que vous devez attacher au rôle d'exécution Lambda :

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

Voici un exemple de modèle pour le compte avec le flux de données, qui doit être attaché au nouveau rôle endossé par Lambda :

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

Ce modèle définit la relation d'approbation d'un rôle d'exécution Lambda. Le rôle d'exécution Lambda endosse le rôle qui transmet les données au flux de données Kinesis.

Remarque : le rôle endossé par Lambda doit disposer d'autorisations pour placer des enregistrements dans un flux de données Kinesis.

Configurer Lambda pour envoyer des données vers Kinesis Data Streams

Vous pouvez configurer Lambda pour envoyer des données à Data Streams à l'aide d'un modèle comme celui-ci :

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")

Dans cet exemple de code Python, remplacez RoleArn par le nom de votre flux et la région correspondant à votre environnement. Cette fonction prend le message SNS reçu de SES, en particulier en endossant le rôle du compte de destination. Le rôle endossé place ensuite les messages dans le flux de destination.

Pour configurer Lambda en tant qu'abonné à la rubrique SNS, procédez comme suit :

1.    Connectez-vous à la console d'Amazon SNS.

2.    Sur le volet de navigation, choisissez Rubriques.

3.    Sur la page Rubriques, choisissez une rubrique.

4.    Dans la section Abonnements, choisissez Créer un abonnement.

5.    Sur la page Créer un abonnement , vérifiez l'ARN de rubriquechoisi.

6.    Choisissez AWS Lambda comme type de protocole.

7.    Saisissez l'Amazon Resource Name (ARN) de votre fonction pour établir le point de terminaison.

8.    Sélectionnez Créer un abonnement.

Pour plus d'informations sur l'utilisation de Lambda en tant qu'abonné à SNS, consultez Utilisation d'Amazon SNS pour la messagerie système à système avec une fonction AWS Lambda en tant qu'abonné.

Si un message est publié dans une rubrique SNS abonnée par Lambda, Lambda est appelé avec la charge utile du message publié. Pour plus d'informations sur la création d'un exemple de magasin d'historique des messages, consultez Appel de fonctions AWS Lambda via Amazon SNS.

Remarque : si vous ne souhaitez pas configurer l'accès entre comptes, les sections Informations d'identification peuvent être supprimées et écrites dans un flux de données Kinesis local. Pour plus d'informations sur l'utilisation de Kinesis avec Lambda et Python, consultez Kinesis dans la documentation AWS Boto3.

Utiliser KCL pour traiter les enregistrements

Vous pouvez utiliser KCL pour traiter les enregistrements dans le flux de données Kinesis. Une fois que les données sont dans le flux de données Kinesis, vous pouvez créer des applications personnalisées et implémenter Kinesis Data Analytics à des fins d'analyse et de visualisation.


Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?