Comment configurer le streaming entre comptes de Kinesis Data Firehose à Amazon Elasticsearch Service ?

Date de la dernière mise à jour : 24/11/2020

Je souhaite configurer un flux Amazon Kinesis Data Firehose qui envoie des données vers un cluster Amazon Elasticsearch Service (Amazon ES) dans un autre compte. Comment diffuser en continu mes ressources de données sur différents comptes ?

Brève description

Vous pouvez configurer Kinesis Data Firehose et ses dépendances, par exemple Amazon Simple Storage Service (Amazon S3) et Amazon CloudWatch, pour diffuser en continu sur différents comptes. La diffusion de données en streaming fonctionne uniquement si le cluster Amazon ES est accessible publiquement et que le chiffrement nœud à nœud est désactivé. Pour désactiver la fonction de chiffrement nœud à nœud, vous devez désactiver le paramètre Activer le contrôle précis des accès.

Pour configurer un flux Data Firehose de manière à ce qu'il envoie des données à un cluster Amazon ES, procédez comme suit :

1.    Créez un compartiment Amazon S3 dans le compte A.

2.    Créez un groupe de journaux CloudWatch et un flux de journaux dans le compte A.

3.    Créez un rôle Data Firehose et une stratégie dans le compte A.

4.    Créez un cluster Elasticsearch dans le compte B et appliquez une stratégie qui autorise les données provenant du rôle Data Firehose dans le compte A.

5.    Modifiez la stratégie dans le rôle Data Firehose du compte A de manière à ce qu'il puisse envoyer des données au cluster Elasticsearch du compte B.

6.    Créez le Data Firehose dans le compte A.

7.    Testez les flux entre comptes.

Résolution

Créer un compartiment Amazon S3 dans le compte A

Créez un compartiment S3 dans le compte A. Le compartiment S3 génère un Amazon Resource Name (ARN).

Remarque : l'ARN complet est utilisé ultérieurement pour accorder à Data Firehose l'accès pour enregistrer et récupérer des enregistrements à partir de ce compartiment S3.

Créer un groupe de journaux CloudWatch et un flux de journaux dans le compte A

Pour créer un groupe de journaux CloudWatch, effectuez les opérations suivantes :

1.    Ouvrez la console CloudWatch.

2.    Dans le volet de navigation, sélectionnez Groupes de journaux.

3.    Sélectionnez Actions.

4.    Sélectionnez Créer un groupe de journaux.

5.    Saisissez un nom de Groupe de journaux.

6.    Cliquez sur le bouton Créer un groupe de journaux pour enregistrer votre nouveau groupe de journaux.

7.    Recherchez le groupe de journaux que vous venez de créer et sélectionnez-le. Cette tâche vous permet de savoir si vous pouvez maintenant créer un flux de journaux.

Pour créer un flux de journaux CloudWatch, effectuez les opérations suivantes :

1.    Sélectionnez Créer un flux de journaux.

2.    Saisissez un Nom du flux de journaux.

3.    Sélectionnez Créer un flux de journaux. Cette action enregistre le flux de journaux que vous venez de créer.

Important : les noms de groupes de journaux et de flux de journaux CloudWatch sont requis lors de la création de stratégies de rôle Data Firehose.

Créer un rôle Data Firehose et une stratégie dans le compte A

1.    Accédez à la console AWS Identity and Access Management (IAM).

2.    Créez une stratégie IAM qui autorise Data Firehose à enregistrer les journaux de flux dans CloudWatch, les enregistrements dans S3 et les flux de données dans le cluster Elasticsearch :

{
    "Version": "2012-10-17",
    "Statement": [
        {          
            "Effect": "Allow",    
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
    "Resource": [
                "<Bucket ARN>",
                "<Bucket ARN>/*"    
            ]
        },
        {    
            "Effect": "Allow",
                "Action": [
                "logs:PutLogEvents"
            ],           
                "Resource": [
                "arn:aws:logs:<region>:<account-id>:log-group:<log-group-name>:log-stream:<log-stream-name>"           
            ]
        }
    ]
}

Remarque : vous ajouterez les autorisations appropriées ultérieurement pour diffuser en continu la stratégie du cluster Elasticsearch, car le cluster du compte B doit d'abord être créé.

3.    Enregistrez la stratégie.

4.    Sélectionnez Créer un rôle.

5.    Ajoutez la stratégie que vous venez de créer à votre rôle Kinesis Data Firehose.

Créer un cluster Elasticsearch dans le compte B et appliquer une stratégie qui autorise les données provenant du rôle Data Firehose dans le compte A

Créez un cluster Elasticsearch avec le paramètre Accessible publiquement activé. Assurez-vous également que le paramètre chiffrement nœud à nœud est désactivé pour le compte B. Pour désactiver le chiffrement nœud à nœud, vous devez désactiver le paramètre Activer le contrôle précis des accès.

Important: vous devez configurer les paramètres de sécurité pour permettre à votre rôle de diffuser en continu via Data Firehose.

Dans Stratégie d'accès, sélectionnez Stratégie d'accès personnalisée, puis IAM et Autoriser. Saisissez ensuite l'ARN utilisateur de votre console IAM.

Une fois le cluster créé, l'ARN du domaine Amazon ES devrait apparaître. Accédez à Actions pour modifier la stratégie du cluster. Ensuite, modifiez le paramètre Gérer la stratégie d'accès comme suit :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "<Firehose Role ARN in Account A>"
      },
      "Action": [
        "es:ESHttpPost",
        "es:ESHttpPut"
      ],
      "Resource": [
        "<ES Domain ARN in Account B>",
        "<ES Domain ARN in Account B>/*"
      ]
    },
    {    
      "Effect": "Allow",
      "Principal": {
        "AWS": "<Firehose Role ARN in Account A>"
      },
      "Action": "es:ESHttpGet",
      "Resource": [
        "<ES Domain ARN in Account B>/_all/_settings",
        "<ES Domain ARN in Account B>/_cluster/stats",
        "<ES Domain ARN in Account B>/index-name*/_mapping/type-name",
        "<ES Domain ARN in Account B>/roletest*/_mapping/roletest",
        "<ES Domain ARN in Account B>/_nodes",
        "<ES Domain ARN in Account B>/_nodes/stats",
        "<ES Domain ARN in Account B>/_nodes/*/stats",
        "<ES Domain ARN in Account B>/_stats",
        "<ES Domain ARN in Account B>/index-name*/_stats",
        "<ES Domain ARN in Account B>/roletest*/_stats"
      ]
    }
  ]
}

Pour plus d'informations sur les autorisations dans la stratégie Elasticsearch, consultez Diffusion entre comptes vers une destination Amazon ES.

Modifier la stratégie dans le rôle Data Firehose du compte A de manière à ce qu'elle puisse envoyer des données au cluster Elasticsearch du compte B

Modifiez la stratégie Data Firehose afin qu'elle puisse envoyer des données au cluster Elasticsearch :

{
    "Version": "2012-10-17",
    "Statement": [
        {          
            "Effect": "Allow",    
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "<Bucket ARN>",
                "<Bucket ARN>/*"    
            ]
        },
        {    
            "Effect": "Allow",
                "Action": [
                "logs:PutLogEvents"
            ],           
                "Resource": [
                "arn:aws:logs:<region>:<account-id>:log-group:<log-group-name>:log-stream:<log-stream-name>"
            ]
        },    
         {
            "Effect": "Allow",
            "Action": [
                "es:ESHttpPost",
                "es:ESHttpPut",
                "es:DescribeElasticsearchDomain",    
                "es:DescribeElasticsearchDomains",
                "es:DescribeElasticsearchDomainConfig"
            ],
            "Resource": [
                "<ES Domain ARN in Account B>",
                "<ES Domain ARN in Account B>/*"
            ]
        },
        {        
            "Effect": "Allow",
            "Action": [
                "es:ESHttpGet"
            ],
            "Resource": [
                "<ES Domain ARN in Account B>/_all/_settings",
                "<ES Domain ARN in Account B>/_cluster/stats",
                "<ES Domain ARN in Account B>/index-name*/_mapping/superstore",
                "<ES Domain ARN in Account B>/_nodes",
                "<ES Domain ARN in Account B>/_nodes/stats",
                "<ES Domain ARN in Account B>/_nodes/*/stats",
                "<ES Domain ARN in Account B>/_stats",
                "<ES Domain ARN in Account B>/index-name*/_stats"
            ]
        }
    ]
}

Pour plus d'informations sur la transmission de données Data Firehose à votre cluster Elasticsearch, consultez Attribution de l'accès à une destination Amazon ES à Kinesis Data Firehose.

Créer le Data Firehose dans le compte A

Pour créer un Data Firehose avec un cluster Elasticsearch entre comptes, utilisez et configurez l'interface de ligne de commande AWS (AWS CLI).

Vérifiez que votre interface de ligne de commande AWS (AWS CLI) est à jour :

aws --version

Remarque : si vous recevez des erreurs lors de l'exécution de commandes depuis AWS CLI, assurez-vous d'utiliser la version la plus récente d'AWS CLI.

Une fois l'interface de ligne de commande AWS (AWS CLI) mise à jour, créez un fichier nommé input.json avec le contenu suivant :

{
    "DeliveryStreamName": "<Firehose name>",
    "DeliveryStreamType": "DirectPut",
    "ElasticsearchDestinationConfiguration": {
        "RoleARN": "<Firehose Role ARN of Account A>",
        "ClusterEndpoint": "<ES Domain cluster Endpoint of Account B>",
        "IndexName": "local",
        "TypeName": "TypeName",
        "IndexRotationPeriod": "OneDay",
        "BufferingHints": {
            "IntervalInSeconds": 60,
            "SizeInMBs": 50
        },
        "RetryOptions": {
            "DurationInSeconds": 60
        },
        "S3BackupMode": "FailedDocumentsOnly",
        "S3Configuration": {
            "RoleARN": "<Firehose Role ARN of Account A>",
            "BucketARN": "<S3 Bucket ARN of Account A>",
            "Prefix": "",
            "BufferingHints": {
                "SizeInMBs": 128,
                "IntervalInSeconds": 128
            },
            "CompressionFormat": "UNCOMPRESSED"
        },
        "CloudWatchLoggingOptions": {
            "Enabled": true,
            "LogGroupName": "<Log group name>",
            "LogStreamName": "<Log stream name>"
        }
    }
}

Assurez-vous que la valeur du point de terminaison est correctement saisie dans le champ d'attribut ClusterEndpoint.

Remarque : les types sont obsolètes dans Elasticsearch version 7.x. Si vous utilisez Elasticsearch version 7.x, veillez à supprimer l'attribut TypeName .

Exécutez ensuite la commande de l'interface de ligne de commande AWS (AWS CLI) suivante dans le même répertoire que l'emplacement du fichier input.json :

aws firehose create-delivery-stream --cli-input-json file://input.json

Ainsi, un Data Firehose est créé dans le compte A et un cluster Elasticsearch dans le compte B.

Tester les flux entre comptes

Utilisez Kinesis Data Generator pour diffuser en continu des enregistrements dans le Data Firehose du compte A.

Kinesis Data Generator (KDG) génère de nombreux enregistrements par seconde. Avec ce niveau de productivité, Amazon ES dispose de suffisamment de points de données pour déterminer le mappage approprié de la structure d'enregistrement.

Voici la structure de modèle utilisée dans Kinesis Data Generator :

{
    "device_id": {{random.number(5)}},
    "device_owner": "{{name.firstName}}  {{name.lastName}}",
    "temperature": {{random.number(
        {
            "min":10,
            "max":150
        }
    )}},
    "timestamp": "{{date.now("DD/MMM/YYYY:HH:mm:ss Z")}}"
}

Pour vérifier si la diffusion en continu entre comptes a réussi, vérifiez s'il existe un index local nommé « local » sous l'onglet Indices du cluster Elasticsearch.

Remarque : quelques minutes peuvent être nécessaires pour qu'Amazon ES détermine le mappage approprié.


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


Besoin d'aide pour une question technique ou de facturation ?