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

Date de la dernière mise à jour : 15/04/2020

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

Brève description

Vous pouvez configurer Kinesis Data Firehose et ses dépendances, comme 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.

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 groupe de journaux et de flux de journaux CloudWatch sont requis lorsque vous créez des 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 la stratégie de 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 et sélectionnez IAM puis Autoriser, et saisissez 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 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'il puisse envoyer des données au cluster Elasticsearch du compte B

Modifiez la stratégie du Data Firehose afin qu'il 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 Kinesis Data Firehose à Amazon ES.

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.

Assurez-vous que l'interface de ligne de commande AWS est à jour à l'aide de la commande suivante :

aws --version

Une fois l'interface de ligne de commande AWS 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 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 est créé dans le compte B.

Tester les flux entre comptes

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

Kinesis Data Generator génère de nombreux enregistrements par seconde. Cela permet à Amazon ES d'avoir suffisamment de points de données pour déterminer le mappage correct 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 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 correct.


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

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


Vous avez besoin d’aide ?