

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Surveillance d’Amazon Aurora à l’aide des flux d’activité de base de données
<a name="DBActivityStreams"></a><a name="das"></a>

En utilisant les flux d’activité de base de données, vous pouvez surveiller en temps quasi réel les flux d’activité de base de données.

**Topics**
+ [Présentation des flux d’activité de base de données](#DBActivityStreams.Overview)
+ [Prérequis réseau pour les flux d’activité de base de données Aurora MySQL](DBActivityStreams.Prereqs.md)
+ [Démarrage d’un flux d’activité de base de données](DBActivityStreams.Enabling.md)
+ [Obtention de l'état d'un flux d'activité de base de données](DBActivityStreams.Status.md)
+ [Arrêt d’un flux d’activité de base de données](DBActivityStreams.Disabling.md)
+ [Surveillance des flux d’activité de base de données](DBActivityStreams.Monitoring.md)
+ [Exemples de politique IAM pour les flux d’activité de base de données](DBActivityStreams.ManagingAccess.md)

## Présentation des flux d’activité de base de données
<a name="DBActivityStreams.Overview"></a>

En tant qu’administrateur de base de données Amazon Aurora, vous devez protéger votre base de données et satisfaire aux exigences en matière de conformité et de réglementation. Une politique consiste à intégrer les flux d’activités de base de données avec vos outils de surveillance. De cette façon, vous surveillez l’activité d’audit dans votre cluster Amazon Aurora et définissez des alarmes.

Les menaces de sécurité sont à la fois externes et internes. Pour vous protéger contre des menaces internes, vous pouvez contrôler l’accès administrateur aux flux de données à l’aide de la fonction Database Activity Streams. DBAs n'a pas accès à la collecte, à la transmission, au stockage et au traitement des flux.

**Contents**
+ [Fonctionnement des flux d’activité de base de données](#DBActivityStreams.Overview.how-they-work)
+ [Mode asynchrone et synchrone pour les flux d'activité de base de données](#DBActivityStreams.Overview.sync-mode)
+ [Exigences et limites pour les flux d’activité de base de données](#DBActivityStreams.Overview.requirements)
+ [Disponibilité des régions et des versions](#DBActivityStreams.Overview.Availability)
+ [Classes d’instance de base de données prises en charge pour les flux d’activité de base de données](#DBActivityStreams.Overview.requirements.classes)

### Fonctionnement des flux d’activité de base de données
<a name="DBActivityStreams.Overview.how-they-work"></a>

Dans Amazon Aurora, vous démarrez un flux d’activité de base de données au niveau du cluster. Toutes les instances de base de données de votre cluster disposent de flux d’activité de base de données activés.

Votre cluster de base de données Aurora envoie (push) les activités vers un flux de données Amazon Kinesis en temps quasi réel. Le flux Kinesis est créé automatiquement. Kinesis vous permet de configurer des AWS services tels qu'Amazon Data Firehose, de consommer le flux et AWS Lambda de stocker les données.

**Important**  
L’utilisation de la fonction de flux d’activité de base de données dans Amazon Aurora est gratuite, mais Amazon Kinesis facture un flux de données. Pour plus d’informations, consultez la [Tarification d’Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams/pricing/).

Si vous utilisez une base de données globale Aurora, démarrez un flux d’activité de base de données sur chaque cluster de bases de données séparément. Chaque cluster fournit des données d'audit à son propre flux Kinesis au sein de sa propre Région AWS. Les flux d’activité ne fonctionnent pas différemment lors d’un basculement. Ils continuent à auditer votre base de données globale comme d’habitude.

Vous pouvez configurer les applications de gestion de la conformité pour qu’elles consomment les flux d’activité des bases de données. Pour Aurora PostgreSQL, les applications de conformité incluent Security Guardium d'IBM et Imperva Database Audit and Protection SecureSphere . Ces applications peuvent utiliser le flux pour générer des alertes et auditer l’activité sur votre cluster de bases de données Aurora.

Le graphique suivant montre un cluster de bases de données Aurora configuré avec Amazon Data Firehose.

![\[Diagramme d’architecture illustrant les flux d’activité de base de données provenant d’un cluster de bases de données Aurora consommé par Firehose\]](http://docs.aws.amazon.com/fr_fr/AmazonRDS/latest/AuroraUserGuide/images/aurora-das.png)


### Mode asynchrone et synchrone pour les flux d'activité de base de données
<a name="DBActivityStreams.Overview.sync-mode"></a>

Vous pouvez choisir que la session de base de données gère les événements d’activité de base de données dans l’un des modes suivants :
+ **Mode asynchrone** : quand une session de base de données génère un événement de flux d’activité, la session revient immédiatement aux activités normales. En arrière-plan, l’événement du flux d’activité est converti en enregistrement durable. Si une erreur se produit pendant la tâche en arrière-plan, un événement RDS est envoyé. Cet événement indique le début et la fin de toute fenêtre de temps au cours de laquelle des enregistrements d’événement de flux d’activité ont pu être perdus.

  Le mode asynchrone favorise les performances de la base de données plutôt que la précision du flux d’activité.
**Note**  
 Le mode asynchrone est disponible pour Aurora PostgreSQL et Aurora MySQL. 
+ **Mode synchrone** : quand une session de base de données génère un événement de flux d’activité, la session bloque d’autres activités jusqu’à ce que l’événement devienne durable. Si l’événement ne peut pas devenir durable pour une raison quelconque, la session de base de données reprend une activité normale. Cependant, un événement RDS est envoyé, indiquant que ces enregistrements de flux peuvent être perdus pour un certain temps. Un deuxième événement RDS est envoyé après que le système est redevenu sain.

  Le mode synchrone favorise la précision du flux d’activité plutôt que les performances de la base de données.
**Note**  
 Le mode synchrone est disponible pour Aurora PostgreSQL. Vous ne pouvez pas utiliser le mode synchrone avec Aurora MySQL. 

### Exigences et limites pour les flux d’activité de base de données
<a name="DBActivityStreams.Overview.requirements"></a>

Dans Aurora, les flux d’activité de base de données présentent les limites et les exigences suivantes :
+ Amazon Kinesis est nécessaire pour les flux d’activité des bases de données.
+ AWS Key Management Service (AWS KMS) est obligatoire pour les flux d'activité de base de données car ils sont toujours chiffrés.
+ L'application d'un chiffrement supplémentaire à votre flux de données Amazon Kinesis est incompatible avec les flux d'activité de base de données, qui sont déjà chiffrés avec votre AWS KMS clé.
+ Démarrez le flux d’activité de votre base de données au niveau du cluster de bases de données. Si vous ajoutez une instance de base de données à votre cluster, vous n’avez pas besoin de lancer un flux d’activité sur l’instance : elle est automatiquement auditée.
+ Dans une base de données globale Aurora, assurez-vous de démarrer un flux d’activité sur chaque cluster de bases de données séparément. Chaque cluster fournit des données d’audit à son propre flux Kinesis au sein de sa propre Région AWS.
+ Dans Aurora PostgreSQL, arrêtez le flux d’activité de la base de données avant une mise à niveau majeure de la version. Vous pouvez lancer le flux d’activité de la base de données une fois la mise à niveau terminée.

### Disponibilité des régions et des versions
<a name="DBActivityStreams.Overview.Availability"></a>

La disponibilité et la prise en charge des fonctions varient selon les versions spécifiques de chaque moteur de base de données Aurora, et selon les Régions AWS. Pour plus d’informations sur la disponibilité des versions et des régions avec Aurora et les flux d’activité des bases de données, consultez [Régions et moteurs de base de données Aurora pris en charge pour les flux d’activité de base de données](Concepts.Aurora_Fea_Regions_DB-eng.Feature.DBActivityStreams.md). 

### Classes d’instance de base de données prises en charge pour les flux d’activité de base de données
<a name="DBActivityStreams.Overview.requirements.classes"></a>

Pour Aurora MySQL, vous pouvez utiliser des flux d’activité de base de données avec les classes d’instance de base de données suivantes :
+ db.r8g.\$1large
+ db.r7g.\$1large
+ db.r7i.\$1large
+ db.r6g.\$1large
+ db.r6i.\$1large
+ db.r5.\$1large
+ db.x2g.\$1

Pour Aurora PostgreSQL, vous pouvez utiliser des flux d’activité de base de données avec les classes d’instance de base de données suivantes :
+ db.r8g.\$1large
+ db.r7i.\$1large
+ db.r7g.\$1large
+ db.r6g.\$1large
+ db.r6i.\$1large
+ db.r6id.\$1large
+ db.r5.\$1large
+ db.r4.\$1large
+ db.x2g.\$1

# Prérequis réseau pour les flux d’activité de base de données Aurora MySQL
<a name="DBActivityStreams.Prereqs"></a>

Dans la section suivante, vous trouverez comment configurer votre cloud privé virtuel (VPC) pour l’utiliser avec des flux d’activité de base de données.

**Note**  
Les prérequis du réseau Aurora MySQL s’appliquent aux versions de moteur suivantes :  
Aurora MySQL versions 2 à 2.11.3
Aurora MySQL version 2.12.0
Aurora MySQL versions 3 à 3.04.2

**Topics**
+ [Prérequis pour les points de terminaison AWS KMS](#DBActivityStreams.Prereqs.KMS)
+ [Conditions préalables à la mise à disposition du public](#DBActivityStreams.Prereqs.Public)
+ [Conditions préalables à la disponibilité privée](#DBActivityStreams.Prereqs.Private)

## Prérequis pour les points de terminaison AWS KMS
<a name="DBActivityStreams.Prereqs.KMS"></a>

Les instances d’un cluster MySQL Aurora qui utilisent des flux d’activité doivent pouvoir accéder aux points de terminaison AWS KMS. Assurez-vous que cette exigence est satisfaite avant d’activer les flux d’activité de base de données pour votre cluster Aurora MySQL. Si le cluster Aurora est accessible au public, cette exigence est remplie automatiquement. 

**Important**  
Si le cluster de bases de données Aurora MySQL ne peut pas accéder au point de terminaison AWS KMS, le flux d’activité s’arrête. Dans ce cas, Aurora vous informe de ce problème à l’aide d’événements RDS. 

## Conditions préalables à la mise à disposition du public
<a name="DBActivityStreams.Prereqs.Public"></a>

Pour qu’un cluster de bases de données Aurora soit public, il doit répondre aux exigences suivantes :
+ **Accessible publiquement** est **Oui** sur la page de détails du cluster AWS Management Console.
+ Le cluster de base de données se trouve dans un sous-réseau public Amazon VPC. Pour plus d’informations sur les instances de base de données accessibles publiquement, consultez [Utilisation d’un cluster de bases de données dans un VPC](USER_VPC.WorkingWithRDSInstanceinaVPC.md). Pour plus d’informations sur les sous-réseaux Amazon VPC publics, consultez [VPC et sous-réseaux](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html).

## Conditions préalables à la disponibilité privée
<a name="DBActivityStreams.Prereqs.Private"></a>

Si votre cluster de bases de données Aurora se trouve dans un sous-réseau public VPC et n’est pas accessible publiquement, il est privé. Pour conserver votre cluster privé et l’utiliser avec des flux d’activité de base de données, vous disposez des options suivantes :
+ Configurez la traduction d’adresses réseau (NAT) dans votre VPC. Pour plus d’informations, consultez [Passerelles NAT](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html).
+ Créez un point de terminaison AWS KMS dans votre VPC. Cette option est recommandée car elle est plus facile à configurer.

**Pour créer un point de terminaison AWS KMS dans votre VPC**

1. Ouvrez la console Amazon VPC à l’adresse [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/).

1. Dans le panneau de navigation, choisissez **Points de terminaison**.

1. Choisissez **Create Endpoint** (Créer un point de terminaison).

   La page **Créer un point de terminaison** s’affiche.

1. Procédez comme suit :
   + Pour **Catégorie de service**, choisissez **Services AWS**.
   + Pour **Service Name** (Nom du service), choisissez **com.amazonaws.*region*.kms**, où *region* correspond à la Région AWS dans laquelle votre cluster est situé.
   + Pour **VPC**, choisissez le VPC dans lequel votre cluster est situé.

1. Choisissez **Create Endpoint** (Créer un point de terminaison).

Pour plus d’informations sur la configuration des points de terminaison d’un VPC, consultez [Points de terminaison d’un VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html).

# Démarrage d’un flux d’activité de base de données
<a name="DBActivityStreams.Enabling"></a>

Pour surveiller l’activité de la base de données pour toutes les instances de votre cluster de bases de données Aurora, démarrez un flux d’activité au niveau du cluster. Les instances de base de données que vous ajoutez au cluster sont automatiquement surveillées. Si vous utilisez une base de données globale Aurora, démarrez un flux d’activité de base de données sur chaque cluster de bases de données séparément. Chaque cluster fournit des données d’audit à son propre flux Kinesis au sein de sa propre Région AWS.

Lorsque vous démarrez un flux d’activité, chaque événement d’activité de base de données que vous avez configuré dans la politique d’audit génère un événement de flux d’activité. Des commandes SQL telles que `CONNECT` et `SELECT` génèrent des événements d’accès. Des commandes SQL telles que `CREATE` et `INSERT` génèrent des événements de modification.

------
#### [ Console ]

**Pour démarrer un flux d’activité de base de données**

1. Ouvrez la console Amazon RDS à l’adresse [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/).

1. Dans la panneau de navigation, choisissez **Bases de données**.

1. Choisissez le cluster de bases de données sur lequel vous souhaitez démarrer un flux d’activité. 

1. Pour **Actions**, choisissez **Start activity stream** (Démarrer le flux d’activité). 

   La fenêtre **Démarrer un flux d’activité de base de données : ***nom* s’affiche, où *nom* est votre cluster de bases de données.

1. Définissez les paramètres suivants :
   + Pour une **AWS KMS key**, choisissez une clé dans la liste des AWS KMS keys.
**Note**  
 Si votre cluster Aurora MySQL ne parvient pas à accéder aux clés KMS, suivez les instructions indiqué dans [Prérequis réseau pour les flux d’activité de base de données Aurora MySQL](DBActivityStreams.Prereqs.md) pour activer cet accès au préalable. 

     Aurora utilise la clé KMS pour chiffrer la clé qui va à son tour chiffrer l’activité de base de données. Choisissez une clé KMS différente de la clé par défaut. Pour plus d’informations sur les clés de chiffrement et AWS KMS, consultez [Présentation d’AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) dans le *Manuel du développeur AWS Key Management Service*.
   + Pour le **Database activity stream mode** (Mode de flux d’activité de base de données), choisissez **Asynchronous** (Asynchrone) ou **Synchronous** (Synchrone).
**Note**  
Ce choix s’applique uniquement à Aurora PostgreSQL. Pour Aurora MySQL, vous ne pouvez utiliser que le mode asynchrone.
   + Choisissez **Immédiatement**.

     Lorsque vous choisissez **Immédiatement**, le cluster de base de donnéesredémarre tout de suite. Si vous choisissez **Pendant la prochaine fenêtre de maintenance**, le cluster DB ne redémarre pas tout de suite. Dans ce cas, le flux d’activité de base de données ne démarre pas avant la prochaine fenêtre de maintenance.

1. Choisissez **Démarrer le flux d’activité de base de données**.

   Le statut pour le cluster de bases de données indique que le flux d’activité démarre.
**Note**  
Si l’erreur `You can't start a database activity stream in this configuration` s’affiche, vérifiez [Classes d’instance de base de données prises en charge pour les flux d’activité de base de données](DBActivityStreams.md#DBActivityStreams.Overview.requirements.classes) pour voir si votre cluster de bases de données utilise une classe d’instance prise en charge.

------
#### [ AWS CLI ]

Pour démarrer des flux d’activité de base de données pour un cluster de bases de données, configurez le cluster de bases de données à l’aide de la commande AWS CLI [start-activity-stream](https://docs.aws.amazon.com/cli/latest/reference/rds/start-activity-stream.html).
+ `--resource-arn arn` – Spécifie l’Amazon Resource Name (ARN) du cluster de base de données.
+ `--mode sync-or-async` – Spécifie le mode synchrone (`sync`) ou asynchrone (`async`). Pour Aurora PostgreSQL, vous pouvez choisir l’une ou l’autre valeur. Pour Aurora MySQL, spécifiez `async`. 
+ `--kms-key-id key` – Spécifie l’identifiant de clé KMS pour le chiffrement des messages dans le flux d’activité de base de données. L’identifiant de clé KMS AWS est l’ARN de clé, l’ID de clé, l’ARN d’alias ou le nom d’alias pour la AWS KMS key.

L’exemple suivant démarre un flux d’activité de base de données pour un cluster de bases de données en mode asynchrone.

Pour Linux, macOS ou Unix :

```
aws rds start-activity-stream \
    --mode async \
    --kms-key-id my-kms-key-arn \
    --resource-arn my-cluster-arn \
    --apply-immediately
```

Pour Windows :

```
aws rds start-activity-stream ^
    --mode async ^
    --kms-key-id my-kms-key-arn ^
    --resource-arn my-cluster-arn ^
    --apply-immediately
```

------
#### [ Amazon RDS API ]

Pour démarrer des flux d’activité de base de données pour un cluster de bases de données, configurez le cluster à l’aide de l’opération [StartActivityStream](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_StartActivityStream.html).

Appelez l’action avec les paramètres ci-dessous :
+ `Region`
+ `KmsKeyId`
+ `ResourceArn`
+ `Mode`

------

**Note**  
Si un message d’erreur vous informe que la version actuelle d’Aurora PostgreSQL ne permet pas de démarrer un flux d’activité de base de données, appliquez le dernier correctif pour Aurora PostgreSQL avant de démarrer un flux d’activité de base de données. Pour plus d’informations sur la mise à niveau de la base de données Aurora PostgreSQL, consultez [Mise à niveau des clusters de bases de données Amazon Aurora](Aurora.VersionPolicy.Upgrading.md).  
Voici les versions de correctif minimales pour démarrer les flux d’activité de base de données avec Aurora PostgreSQL.  
3.4.15 (11.9.15), 11.21.10
12.9.15, 12.15.9, 12.16.10, 12.17.7, 12.18.5, 12.19.4, 12.20.3, 12.22.3
13.9.12, 13.11.9, 13.12.10, 13.13.7, 13.14.5, 13.15.4, 13.16.3, 13.18.3
14.6.12, 14.8.9, 14.9.10, 14.10.7, 14.11.5, 14.12.4, 14.13.3, 14.15.3
15.3.9, 15.4.10, 15.5.7, 15.6.5, 15.7.4, 15.8.3, 15.10.3
16.1.7, 16.2.5, 16.3.4, 16.4.3, 16.6.3

# Obtention de l'état d'un flux d'activité de base de données
<a name="DBActivityStreams.Status"></a>

Vous pouvez obtenir le statut d'un flux d'activité en utilisant la console ou AWS CLI.

## console
<a name="DBActivityStreams.Status-collapsible-section-S1"></a>

**Obtention de l'état d'un flux d'activité de base de données**

1. Ouvrez la console Amazon RDS à l'adresse [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/).

1. Dans le panneau de navigation, choisissez **Bases de données**, puis le lien du cluster de base de données.

1. Choisissez l'onglet **Configuration** et cochez l'option **Flux d'activité de base de données** pour obtenir l'état.

## AWS CLI
<a name="DBActivityStreams.Status-collapsible-section-S2"></a>

Vous pouvez obtenir la configuration du flux d'activité pour un cluster de base de données en réponse à une demande CLI [describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) .

L'exemple suivant décrit *my-cluster*.

```
aws rds --region my-region describe-db-clusters --db-cluster-identifier my-cluster
```

Voici un exemple de réponse JSON. Les champs suivants s'affichent :
+ `ActivityStreamKinesisStreamName`
+ `ActivityStreamKmsKeyId`
+ `ActivityStreamStatus`
+ `ActivityStreamMode`
+ 

Ces champs sont les mêmes pour Aurora PostgreSQL et Aurora MySQL, sauf que `ActivityStreamMode` est toujours `async` pour Aurora MySQL, tandis que pour Aurora PostgreSQL il peut être `sync` ou `async`.

```
{
    "DBClusters": [
        {
      "DBClusterIdentifier": "my-cluster",
            ...
            "ActivityStreamKinesisStreamName": "aws-rds-das-cluster-A6TSYXITZCZXJHIRVFUBZ5LTWY",
            "ActivityStreamStatus": "starting",
            "ActivityStreamKmsKeyId": "12345678-abcd-efgh-ijkl-bd041f170262",
            "ActivityStreamMode": "async",
            "DbClusterResourceId": "cluster-ABCD123456"
            ...
        }
    ]
}
```

## API RDS
<a name="DBActivityStreams.Status-collapsible-section-S3"></a>

Vous pouvez obtenir la configuration du flux d'activité pour un cluster de base de données en réponse à une opération [DescribeDBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html) .

# Arrêt d’un flux d’activité de base de données
<a name="DBActivityStreams.Disabling"></a>

Vous pouvez arrêter un flux d’activité à partir de la console ou d’AWS CLI.

Si vous supprimez votre cluster de bases de données, le flux d’activité est arrêté et le flux Amazon Kinesis sous-jacent est supprimé automatiquement.

## Console
<a name="DBActivityStreams.Disabling-collapsible-section-D1"></a>

**Pour désactiver un flux d’activité**

1. Ouvrez la console Amazon RDS à l’adresse [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/).

1. Dans la panneau de navigation, choisissez **Databases (Bases de données)**.

1. Choisissez un cluster de bases de données pour lequel vous souhaitez arrêter le flux d’activité de base de données.

1. Pour **Actions**, choisissez **Stop activity stream** (Arrêter le flux d’activité). La fenêtre **Database Activity Stream** (Flux d’activité de base de données) apparaît.

   1. Choisissez **Immédiatement**.

      Lorsque vous choisissez **Immédiatement**, le cluster de base de donnéesredémarre tout de suite. Si vous choisissez **Pendant la prochaine fenêtre de maintenance**, le cluster DB ne redémarre pas tout de suite. Dans ce cas, le flux d’activité de base de données ne s’arrête pas avant la prochaine fenêtre de maintenance.

   1. Choisissez **Continuer**.

## AWS CLI
<a name="DBActivityStreams.Disabling-collapsible-section-D2"></a>

Pour arrêter les flux d’activité de base de données pour votre cluster de bases de données, configurez le cluster de bases de données à l’aide de la commande AWS CLI [stop-activity-stream](https://docs.aws.amazon.com/cli/latest/reference/rds/stop-activity-stream.html). Identifiez la région AWS pour le cluster de base de données avec le paramètre `--region`. Le paramètre `--apply-immediately` est facultatif.

Pour Linux, macOS ou Unix :

```
aws rds --region MY_REGION \
    stop-activity-stream \
    --resource-arn MY_CLUSTER_ARN \
    --apply-immediately
```

Pour Windows :

```
aws rds --region MY_REGION ^
    stop-activity-stream ^
    --resource-arn MY_CLUSTER_ARN ^
    --apply-immediately
```

## API RDS
<a name="DBActivityStreams.Disabling-collapsible-section-D3"></a>

Pour arrêter les flux d’activité de base de données pour votre cluster de bases de données, configurez ce cluster à l’aide de l’opération [StopActivityStream](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_StopActivityStream.html). Identifiez la région AWS pour le cluster de base de données avec le paramètre `Region`. Le paramètre `ApplyImmediately` est facultatif.

# Surveillance des flux d’activité de base de données
<a name="DBActivityStreams.Monitoring"></a>

Les flux d’activité de base de données surveillent et rapportent les activités. Le flux d’activité est collecté et transmis à Amazon Kinesis. Depuis Kinesis, vous pouvez surveiller le flux d’activité ou d’autres services et applications peuvent utiliser le flux d’activité pour une analyse plus approfondie. Vous pouvez trouver le nom du flux Kinesis sous-jacent à l’aide de la commande `describe-db-clusters` de AWS CLI ou de l’opération `DescribeDBClusters` de l’API RDS.

Aurora gère le flux Kinesis pour vous comme suit :
+ Aurora crée automatiquement le flux Kinesis avec une période de rétention de 24 heures. 
+  Aurora met à l’échelle le flux Kinesis si nécessaire. 
+  Si vous arrêtez le flux d’activité de base de données ou supprimez le cluster de bases de données, Aurora supprime le flux Kinesis. 

Les catégories d’activité suivantes sont surveillées et incluses dans le journal d’audit de flux d’activité :
+ **Commandes SQL** – Toutes les commandes SQL sont auditées, ainsi que les instructions préparées, les fonctions intégrées et les fonctions en PL/SQL. Les appels aux procédures stockées sont vérifiés. Toutes les instructions SQL émises dans des procédures ou fonctions stockées sont également vérifiées.
+ **Autres informations de bases de données** – L’activité surveillée inclut l’instruction SQL complète, le nombre des lignes affectées par les commandes DML, les objets consultés et le nom unique de base de données. Pour Aurora PostgreSQL, les flux d’activité de base de données surveillent également les variables de liaison et les paramètres de procédure stockée. 
**Important**  
Le texte SQL complet de chaque instruction est visible dans le journal d’audit du flux d’activité, y compris les données sensibles. Cependant, les mots de passe des utilisateurs de base de données sont expurgés si Aurora peut les déterminer d’après le contexte, comme dans l’instruction SQL suivante.   

  ```
  ALTER ROLE role-name WITH password
  ```
+ **Informations de connexion** – L’activité surveillée inclut les informations de session et de réseau, l’ID de processus serveur et les codes de sortie.

Si un flux d’activité rencontre un échec pendant la surveillance de votre instance de base de données, vous en êtes informé via des événements RDS.

Les sections ci-après vous permettent d’accéder aux flux d’activité des bases de données, de les auditer et de les traiter.

**Topics**
+ [Accès à un flux d’activité depuis Amazon Kinesis](DBActivityStreams.KinesisAccess.md)
+ [Contenu du journal d’audit et exemples pour les flux d’activité de base de données](DBActivityStreams.AuditLog.md)
+ [Tableau JSON databaseActivityEventList pour les flux d’activité de base de données](DBActivityStreams.AuditLog.databaseActivityEventList.md)
+ [Traitement d’un flux d’activité de base de données à l’aide du kit AWS SDK](DBActivityStreams.CodeExample.md)

# Accès à un flux d’activité depuis Amazon Kinesis
<a name="DBActivityStreams.KinesisAccess"></a>

Lorsque vous activez un flux d’activité pour un cluster de bases de données, un flux Kinesis est créé pour vous. Depuis Kinesis, vous pouvez surveiller l’activité de votre base de données en temps réel. Pour effectuer des analyses plus poussées de l’activité de base de données, vous pouvez connecter votre flux Kinesis à des applications grand public. Vous pouvez également connecter le flux à des applications de gestion de la conformité telles que Security Guardium d’IBM ou SecureSphere Database Audit and Protection d’Imperva.

Vous pouvez accéder à votre flux Kinesis à partir de la console RDS ou de la console Kinesis.

**Pour accéder à un flux d’activité depuis Kinesis avec la console RDS**

1. Ouvrez la console Amazon RDS à l’adresse [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/).

1. Dans la panneau de navigation, choisissez **Bases de données**.

1. Choisissez le cluster de bases de données où vous souhaitez démarrer un flux d’activité.

1. Choisissez **Configuration**.

1. Sous **Database activity stream** (Flux d’activité de la base de données), choisissez le lien sous **Kinesis stream** (Flux Kinesis).

1. Dans la console Kinesis, choisissez **Monitoring** (Surveillance) pour commencer à observer l’activité de la base de données.

**Pour accéder à un flux d’activité depuis Kinesis avec la console Kinesis**

1. Ouvrez la console Kinesis à l’adresse [https://console.aws.amazon.com/kinesis](https://console.aws.amazon.com/kinesis).

1. Choisissez votre flux d’activité dans la liste des flux Kinesis.

   Le nom d’un flux d’activité comprend le préfixe `aws-rds-das-cluster-` suivi de l’ID de ressource du cluster de bases de données. Voici un exemple. 

   ```
   aws-rds-das-cluster-NHVOV4PCLWHGF52NP
   ```

   Pour utiliser la console Amazon RDS afin de trouver l’ID de ressource pour le cluster de bases de données, choisissez votre cluster de bases de données dans la liste des bases de données, puis choisissez l’onglet **Configuration**.

   Pour trouver le nom complet de flux Kinesis pour un flux d’activité à l’aide de AWS CLI, utilisez une demande de CLI [describe-db-clusters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-clusters.html) et notez la valeur de `ActivityStreamKinesisStreamName` dans la réponse.

1. Choisissez **Surveillance** pour commencer à observer l’activité de base de données.

Pour plus d’informations sur l’utilisation d’Amazon Kinesis, consultez [En quoi consiste le service Amazon Kinesis Data Streams ?](https://docs.aws.amazon.com/streams/latest/dev/introduction.html).

# Contenu du journal d’audit et exemples pour les flux d’activité de base de données
<a name="DBActivityStreams.AuditLog"></a>

Les événements surveillés sont représentés dans le flux d’activité de base de données sous la forme de chaînes JSON. La structure se compose d’un objet JSON contenant un `DatabaseActivityMonitoringRecord`, qui contient lui-même un tableau des événements d’activité `databaseActivityEventList`. 

**Note**  
Pour les flux d’activité de base de données, le tableau JSON `paramList` n’inclut pas les valeurs null des applications Hibernate.

**Topics**
+ [Exemples de journaux d’audit de flux d’activité](#DBActivityStreams.AuditLog.Examples)
+ [DatabaseActivityMonitoringRecords Objet JSON](#DBActivityStreams.AuditLog.DatabaseActivityMonitoringRecords)
+ [databaseActivityEvents Objet JSON](#DBActivityStreams.AuditLog.databaseActivityEvents)

## Exemples de journaux d’audit de flux d’activité
<a name="DBActivityStreams.AuditLog.Examples"></a>

Vous trouverez ci-après des exemples de journaux d’audits JSON déchiffrés d’enregistrements d’événements d’activité.

**Example Enregistrement d'événement d'activité d'une instruction SQL Aurora PostgreSQL**  
L’enregistrement d’événement d’activité suivant indique une connexion à l’aide d’une instruction SQL `CONNECT` (`command`) par un client psql (`clientApplication`).  

```
{
  "type":"DatabaseActivityMonitoringRecords",
  "version":"1.1",
  "databaseActivityEvents": 
    {
      "type":"DatabaseActivityMonitoringRecord",
      "clusterId":"cluster-4HNY5V4RRNPKKYB7ICFKE5JBQQ",
      "instanceId":"db-FZJTMYKCXQBUUZ6VLU7NW3ITCM",
      "databaseActivityEventList":[
        {
          "startTime": "2019-10-30 00:39:49.940668+00",
          "logTime": "2019-10-30 00:39:49.990579+00",
          "statementId": 1,
          "substatementId": 1,
          "objectType": null,
          "command": "CONNECT",
          "objectName": null,
          "databaseName": "postgres",
          "dbUserName": "rdsadmin",
          "remoteHost": "172.31.3.195",
          "remotePort": "49804",
          "sessionId": "5ce5f7f0.474b",
          "rowCount": null,
          "commandText": null,
          "paramList": [],
          "pid": 18251,
          "clientApplication": "psql",
          "exitCode": null,
          "class": "MISC",
          "serverVersion": "2.3.1",
          "serverType": "PostgreSQL",
          "serviceName": "Amazon Aurora PostgreSQL-Compatible edition",
          "serverHost": "172.31.3.192",
          "netProtocol": "TCP",
          "dbProtocol": "Postgres 3.0",
          "type": "record",
          "errorMessage": null
        }
      ]
    },
   "key":"decryption-key"
}
```

**Example Enregistrement d’événement d’activité d’une instruction Aurora MySQL CONNECT SQL**  
L’enregistrement d’événement d’activité suivant indique une connexion à l’aide d’une instruction SQL `CONNECT` (`command`) par un client mysql (`clientApplication`).   

```
{
  "type":"DatabaseActivityMonitoringRecord",
  "clusterId":"cluster-some_id",
  "instanceId":"db-some_id",
  "databaseActivityEventList":[
    {
      "logTime":"2020-05-22 18:07:13.267214+00",
      "type":"record",
      "clientApplication":null,
      "pid":2830,
      "dbUserName":"rdsadmin",
      "databaseName":"",
      "remoteHost":"localhost",
      "remotePort":"11053",
      "command":"CONNECT",
      "commandText":"",
      "paramList":null,
      "objectType":"TABLE",
      "objectName":"",
      "statementId":0,
      "substatementId":1,
      "exitCode":"0",
      "sessionId":"725121",
      "rowCount":0,
      "serverHost":"master",
      "serverType":"MySQL",
      "serviceName":"Amazon Aurora MySQL",
      "serverVersion":"MySQL 5.7.12",
      "startTime":"2020-05-22 18:07:13.267207+00",
      "endTime":"2020-05-22 18:07:13.267213+00",
      "transactionId":"0",
      "dbProtocol":"MySQL",
      "netProtocol":"TCP",
      "errorMessage":"",
      "class":"MAIN"
    }
  ]
}
```

**Example Registre d’événement d’activité d’une instruction Aurora PostgreSQL CREATE TABLE**  
L’exemple suivant montre un événement `CREATE TABLE` pour Aurora PostgreSQL.  

```
{
  "type":"DatabaseActivityMonitoringRecords",
  "version":"1.1",
  "databaseActivityEvents": 
    {
      "type":"DatabaseActivityMonitoringRecord",
      "clusterId":"cluster-4HNY5V4RRNPKKYB7ICFKE5JBQQ",
      "instanceId":"db-FZJTMYKCXQBUUZ6VLU7NW3ITCM",
      "databaseActivityEventList":[
        {
          "startTime": "2019-05-24 00:36:54.403455+00",
          "logTime": "2019-05-24 00:36:54.494235+00",
          "statementId": 2,
          "substatementId": 1,
          "objectType": null,
          "command": "CREATE TABLE",
          "objectName": null,
          "databaseName": "postgres",
          "dbUserName": "rdsadmin",
          "remoteHost": "172.31.3.195",
          "remotePort": "34534",
          "sessionId": "5ce73c6f.7e64",
          "rowCount": null,
          "commandText": "create table my_table (id serial primary key, name varchar(32));",
          "paramList": [],
          "pid": 32356,
          "clientApplication": "psql",
          "exitCode": null,
          "class": "DDL",
          "serverVersion": "2.3.1",
          "serverType": "PostgreSQL",
          "serviceName": "Amazon Aurora PostgreSQL-Compatible edition",
          "serverHost": "172.31.3.192",
          "netProtocol": "TCP",
          "dbProtocol": "Postgres 3.0",
          "type": "record",
          "errorMessage": null
        }
      ]
    },
   "key":"decryption-key"
}
```

**Example Enregistrement d’événement d’activité d’une instruction CREATE TABLE Aurora MySQL**  
L’exemple suivant montre une instruction `CREATE TABLE` pour Aurora MySQL. L’opération est représentée sous la forme de deux enregistrements d’événements distincts. Un événement a `"class":"MAIN"`. L’autre événement a `"class":"AUX"`. Les messages peuvent arriver dans n’importe quel ordre. Le champ `logTime` de l’événement `MAIN` est toujours antérieur au champ `logTime` des événements `AUX` correspondants.  
L’exemple suivant montre l’événement avec une valeur `class` de `MAIN`.   

```
{
  "type":"DatabaseActivityMonitoringRecord",
  "clusterId":"cluster-some_id",
  "instanceId":"db-some_id",
  "databaseActivityEventList":[
    {
      "logTime":"2020-05-22 18:07:12.250221+00",
      "type":"record",
      "clientApplication":null,
      "pid":2830,
      "dbUserName":"master",
      "databaseName":"test",
      "remoteHost":"localhost",
      "remotePort":"11054",
      "command":"QUERY",
      "commandText":"CREATE TABLE test1 (id INT)",
      "paramList":null,
      "objectType":"TABLE",
      "objectName":"test1",
      "statementId":65459278,
      "substatementId":1,
      "exitCode":"0",
      "sessionId":"725118",
      "rowCount":0,
      "serverHost":"master",
      "serverType":"MySQL",
      "serviceName":"Amazon Aurora MySQL",
      "serverVersion":"MySQL 5.7.12",
      "startTime":"2020-05-22 18:07:12.226384+00",
      "endTime":"2020-05-22 18:07:12.250222+00",
      "transactionId":"0",
      "dbProtocol":"MySQL",
      "netProtocol":"TCP",
      "errorMessage":"",
      "class":"MAIN"
    }
  ]
}
```
 L’exemple suivant montre l’événement correspondant avec une valeur `class` de `AUX`.  

```
{
  "type":"DatabaseActivityMonitoringRecord",
  "clusterId":"cluster-some_id",
  "instanceId":"db-some_id",
  "databaseActivityEventList":[
    {
      "logTime":"2020-05-22 18:07:12.247182+00",
      "type":"record",
      "clientApplication":null,
      "pid":2830,
      "dbUserName":"master",
      "databaseName":"test",
      "remoteHost":"localhost",
      "remotePort":"11054",
      "command":"CREATE",
      "commandText":"test1",
      "paramList":null,
      "objectType":"TABLE",
      "objectName":"test1",
      "statementId":65459278,
      "substatementId":2,
      "exitCode":"",
      "sessionId":"725118",
      "rowCount":0,
      "serverHost":"master",
      "serverType":"MySQL",
      "serviceName":"Amazon Aurora MySQL",
      "serverVersion":"MySQL 5.7.12",
      "startTime":"2020-05-22 18:07:12.226384+00",
      "endTime":"2020-05-22 18:07:12.247182+00",
      "transactionId":"0",
      "dbProtocol":"MySQL",
      "netProtocol":"TCP",
      "errorMessage":"",
      "class":"AUX"
    }
  ]
}
```

**Example Registre d’événement d’activité d’une instruction Aurora PostgreSQL SELECT**  
L’exemple suivant montre un événement `SELECT` .  

```
{
  "type":"DatabaseActivityMonitoringRecords",
  "version":"1.1",
  "databaseActivityEvents": 
    {
      "type":"DatabaseActivityMonitoringRecord",
      "clusterId":"cluster-4HNY5V4RRNPKKYB7ICFKE5JBQQ",
      "instanceId":"db-FZJTMYKCXQBUUZ6VLU7NW3ITCM",
      "databaseActivityEventList":[
        {
          "startTime": "2019-05-24 00:39:49.920564+00",
          "logTime": "2019-05-24 00:39:49.940668+00",
          "statementId": 6,
          "substatementId": 1,
          "objectType": "TABLE",
          "command": "SELECT",
          "objectName": "public.my_table",
          "databaseName": "postgres",
          "dbUserName": "rdsadmin",
          "remoteHost": "172.31.3.195",
          "remotePort": "34534",
          "sessionId": "5ce73c6f.7e64",
          "rowCount": 10,
          "commandText": "select * from my_table;",
          "paramList": [],
          "pid": 32356,
          "clientApplication": "psql",
          "exitCode": null,
          "class": "READ",
          "serverVersion": "2.3.1",
          "serverType": "PostgreSQL",
          "serviceName": "Amazon Aurora PostgreSQL-Compatible edition",
          "serverHost": "172.31.3.192",
          "netProtocol": "TCP",
          "dbProtocol": "Postgres 3.0",
          "type": "record",
          "errorMessage": null
        }
      ]
    },
   "key":"decryption-key"
}
```

```
{
    "type": "DatabaseActivityMonitoringRecord",
    "clusterId": "",
    "instanceId": "db-4JCWQLUZVFYP7DIWP6JVQ77O3Q",
    "databaseActivityEventList": [
        {
            "class": "TABLE",
            "clientApplication": "Microsoft SQL Server Management Studio - Query",
            "command": "SELECT",
            "commandText": "select * from [testDB].[dbo].[TestTable]",
            "databaseName": "testDB",
            "dbProtocol": "SQLSERVER",
            "dbUserName": "test",
            "endTime": null,
            "errorMessage": null,
            "exitCode": 1,
            "logTime": "2022-10-06 21:24:59.9422268+00",
            "netProtocol": null,
            "objectName": "TestTable",
            "objectType": "TABLE",
            "paramList": null,
            "pid": null,
            "remoteHost": "local machine",
            "remotePort": null,
            "rowCount": 0,
            "serverHost": "172.31.30.159",
            "serverType": "SQLSERVER",
            "serverVersion": "15.00.4073.23.v1.R1",
            "serviceName": "sqlserver-ee",
            "sessionId": 62,
            "startTime": null,
            "statementId": "0x03baed90412f564fad640ebe51f89b99",
            "substatementId": 1,
            "transactionId": "4532935",
            "type": "record",
            "engineNativeAuditFields": {
                "target_database_principal_id": 0,
                "target_server_principal_id": 0,
                "target_database_principal_name": "",
                "server_principal_id": 2,
                "user_defined_information": "",
                "response_rows": 0,
                "database_principal_name": "dbo",
                "target_server_principal_name": "",
                "schema_name": "dbo",
                "is_column_permission": true,
                "object_id": 581577110,
                "server_instance_name": "EC2AMAZ-NFUJJNO",
                "target_server_principal_sid": null,
                "additional_information": "",
                "duration_milliseconds": 0,
                "permission_bitmask": "0x00000000000000000000000000000001",
                "data_sensitivity_information": "",
                "session_server_principal_name": "test",
                "connection_id": "AD3A5084-FB83-45C1-8334-E923459A8109",
                "audit_schema_version": 1,
                "database_principal_id": 1,
                "server_principal_sid": "0x010500000000000515000000bdc2795e2d0717901ba6998cf4010000",
                "user_defined_event_id": 0,
                "host_name": "EC2AMAZ-NFUJJNO"
            }
        }
    ]
}
```

**Example Enregistrement d’événement d’activité d’une instruction SELECT Aurora MySQL**  
L’exemple suivant montre un événement `SELECT`.  
 L’exemple suivant montre l’événement avec une valeur `class` de `MAIN`.   

```
{
  "type":"DatabaseActivityMonitoringRecord",
  "clusterId":"cluster-some_id",
  "instanceId":"db-some_id",
  "databaseActivityEventList":[
    {
      "logTime":"2020-05-22 18:29:57.986467+00",
      "type":"record",
      "clientApplication":null,
      "pid":2830,
      "dbUserName":"master",
      "databaseName":"test",
      "remoteHost":"localhost",
      "remotePort":"11054",
      "command":"QUERY",
      "commandText":"SELECT * FROM test1 WHERE id < 28",
      "paramList":null,
      "objectType":"TABLE",
      "objectName":"test1",
      "statementId":65469218,
      "substatementId":1,
      "exitCode":"0",
      "sessionId":"726571",
      "rowCount":2,
      "serverHost":"master",
      "serverType":"MySQL",
      "serviceName":"Amazon Aurora MySQL",
      "serverVersion":"MySQL 5.7.12",
      "startTime":"2020-05-22 18:29:57.986364+00",
      "endTime":"2020-05-22 18:29:57.986467+00",
      "transactionId":"0",
      "dbProtocol":"MySQL",
      "netProtocol":"TCP",
      "errorMessage":"",
      "class":"MAIN"
    }
  ]
}
```
 L’exemple suivant montre l’événement correspondant avec une valeur `class` de `AUX`.   

```
{
  "type":"DatabaseActivityMonitoringRecord",
  "instanceId":"db-some_id",
  "databaseActivityEventList":[
    {
      "logTime":"2020-05-22 18:29:57.986399+00",
      "type":"record",
      "clientApplication":null,
      "pid":2830,
      "dbUserName":"master",
      "databaseName":"test",
      "remoteHost":"localhost",
      "remotePort":"11054",
      "command":"READ",
      "commandText":"test1",
      "paramList":null,
      "objectType":"TABLE",
      "objectName":"test1",
      "statementId":65469218,
      "substatementId":2,
      "exitCode":"",
      "sessionId":"726571",
      "rowCount":0,
      "serverHost":"master",
      "serverType":"MySQL",
      "serviceName":"Amazon Aurora MySQL",
      "serverVersion":"MySQL 5.7.12",
      "startTime":"2020-05-22 18:29:57.986364+00",
      "endTime":"2020-05-22 18:29:57.986399+00",
      "transactionId":"0",
      "dbProtocol":"MySQL",
      "netProtocol":"TCP",
      "errorMessage":"",
      "class":"AUX"
    }
  ]
}
```

## DatabaseActivityMonitoringRecords Objet JSON
<a name="DBActivityStreams.AuditLog.DatabaseActivityMonitoringRecords"></a>

Les enregistrements d’événement d’activité de base de données se trouvent dans un objet JSON qui contient les informations suivantes.


****  

| Champ JSON | Type de données | Description | 
| --- | --- | --- | 
|  `type`  | chaîne |  Type de l’enregistrement JSON. La valeur est `DatabaseActivityMonitoringRecords`.  | 
| version | chaîne |  Version des enregistrements de surveillance d’activité de base de données. La version des enregistrements d’activité de base de données générés dépend de la version du moteur du cluster de bases de données. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.html)Tous les champs suivants sont à la fois dans la version 1.0 et dans la version 1.1, sauf indication spécifique. | 
|  [databaseActivityEvents](#DBActivityStreams.AuditLog.databaseActivityEvents)  | chaîne |  Objet JSON qui contient les événements d’activité.  | 
| key | chaîne | Clé de chiffrement que vous utilisez pour déchiffrer [Tableau JSON databaseActivityEventList](DBActivityStreams.AuditLog.databaseActivityEventList.md)  | 

## databaseActivityEvents Objet JSON
<a name="DBActivityStreams.AuditLog.databaseActivityEvents"></a>

L’objet JSON `databaseActivityEvents` contient les informations suivantes.

### Champs de niveau supérieur dans l’enregistrement JSON
<a name="DBActivityStreams.AuditLog.topLevel"></a>

 Chaque événement du journal d’audit est encapsulé dans un enregistrement au format JSON. Cet enregistrement contient les champs suivants. 

**type**  
 Ce champ a toujours la valeur `DatabaseActivityMonitoringRecords`. 

**version ;**  
 Ce champ représente la version du contrat ou du protocole de données de flux d’activité de base de données. Il définit les champs disponibles.  
La version 1.0 représente la prise en charge des flux d’activité de données d’origine pour Aurora PostgreSQL versions 10.7 et 11.4. La version 1.1 représente la prise en charge des flux d’activité de données pour Aurora PostgreSQL versions 10.10 et ultérieures et Aurora PostgreSQL version 11.5 et ultérieures. La version 1.1 inclut les champs supplémentaires `errorMessage` et `startTime`. La version 1.2 représente la prise en charge des flux d’activité de données pour Aurora MySQL version 2.08 et ultérieures. La version 1.2 inclut les champs supplémentaires `endTime` et `transactionId`.

**databaseActivityEvents**  
 Chaîne chiffrée représentant un ou plusieurs événements d’activité. Elle est représentée sou la forme d’un tableau base64 octets. Lorsque vous déchiffrez la chaîne, le résultat est un enregistrement au format JSON avec des champs comme ceux des exemples de cette section.

**key**  
 Clé de données chiffrée utilisée pour chiffrer la chaîne `databaseActivityEvents`. Il s'agit du même AWS KMS key que celui que vous avez fourni lorsque vous avez démarré le flux d'activité de la base de données.

 L’exemple suivant illustre le format de cet enregistrement.

```
{
  "type":"DatabaseActivityMonitoringRecords",
  "version":"1.1",
  "databaseActivityEvents":"encrypted audit records",
  "key":"encrypted key"
}
```

Pour déchiffrer le contenu du champ `databaseActivityEvents`, procédez comme suit :

1.  Déchiffrez la valeur dans le champ JSON `key` à l’aide de la clé KMS que vous avez fournie lors du démarrage du flux d’activité de base de données. Cette opération renvoie la clé de chiffrement des données en texte clair. 

1.  Décodez en base64 la valeur dans le champ JSON `databaseActivityEvents` pour obtenir le texte chiffré, au format binaire, de la charge utile d’audit. 

1.  Déchiffrez le chiffrement binaire avec la clé de chiffrement de données que vous avez décodée au cours de la première étape. 

1.  Décompressez la charge utile déchiffrée. 
   +  La charge utile chiffrée se trouve dans le champ `databaseActivityEvents`. 
   +  Le champ `databaseActivityEventList` contient un tableau d’enregistrements d’audits. Les champs `type` du tableau peuvent être `record` ou `heartbeat`. 

L’enregistrement d’événement d’activité du journal d’audit est un objet JSON qui contient les informations suivantes.


****  

| Champ JSON | Type de données | Description | 
| --- | --- | --- | 
|  `type`  | chaîne |  Type de l’enregistrement JSON. La valeur est `DatabaseActivityMonitoringRecord`.  | 
| clusterId | chaîne | Identifiant de ressource de cluster de base de données. Il correspond à l’attribut de cluster de bases de donnéesDbClusterResourceId. | 
| instanceId | chaîne | Identifiant de ressource d’instance de base de données. Il correspond à l’attribut d’instance de base de données DbiResourceId. | 
|  [Tableau JSON databaseActivityEventList](DBActivityStreams.AuditLog.databaseActivityEventList.md)   | chaîne |  Tableau d’enregistrements d’audits d’activité ou de messages de pulsations.  | 

# Tableau JSON databaseActivityEventList pour les flux d’activité de base de données
<a name="DBActivityStreams.AuditLog.databaseActivityEventList"></a>

Les données utiles du journal d’audit sont un tableau JSON `databaseActivityEventList` chiffré. Ci-dessous, les tableaux répertorient par ordre alphabétique les champs de chaque événement d’activité dans le tableau `DatabaseActivityEventList` déchiffré d’un journal d’audit. Les champs diffèrent selon que vous utilisez Aurora PostgreSQL ou Aurora MySQL. Consultez la table qui s’applique à votre moteur de base de données.

**Important**  
Il se peut que la structure d’événement change. Il se peut qu’Aurora ajoute de nouveaux champs aux événements d’activité à l’avenir. Dans les applications qui analysent les données JSON, assurez-vous que votre code peut ignorer ou prendre les mesures appropriées pour les noms de champs inconnus. 

## Champs databaseActivityEventList pour Aurora PostgreSQL
<a name="DBActivityStreams.AuditLog.databaseActivityEventList.apg"></a>

Voici les champs `databaseActivityEventList` pour Aurora PostgreSQL.


| Champ | Type de données | Description | 
| --- | --- | --- | 
| class | chaîne |  La classe d’un événement d’activité. Les valeurs possibles pour Aurora PostgreSQL sont les suivantes : [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html)  | 
| clientApplication | chaîne | Application utilisée par le client pour se connecter, telle que signalée par le client. Le client n’a pas à fournir cette information, la valeur peut être « null ». | 
| command | chaîne | Nom de la commande SQL sans aucun détail sur la commande | 
| commandText | chaîne |  Instruction SQL réelle transmise par l’utilisateur. Pour Aurora PostgreSQL, la valeur est identique à l’instruction SQL d’origine. Ce champ est utilisé pour tous les types d’enregistrements, excepté pour les enregistrements de connexion ou de déconnexion, auxquels cas la valeur est « null ».  Le texte SQL complet de chaque instruction est visible dans le journal d’audit du flux d’activité, y compris les données sensibles. Cependant, les mots de passe des utilisateurs de la base de données sont masqués si Aurora peut les deviner suivant le contexte, comme le montre l’exemple suivant.  <pre>ALTER ROLE role-name WITH password</pre>   | 
| databaseName | chaîne | Base de données à laquelle l’utilisateur s’est connecté. | 
| dbProtocol | chaîne | Le protocole de base de données, par exemple Postgres 3.0. | 
| dbUserName | chaîne | L’utilisateur de la base de données avec lequel le client s’est authentifié. | 
| errorMessage(enregistrements d’activité de base de données version 1.1 uniquement) | chaîne |  En cas d’erreur, ce champ contient le message d’erreur qui aurait été généré par le serveur de base de données. La valeur `errorMessage` est nulle pour les instructions normales qui n’ont pas donné lieu à une erreur.  Une erreur est définie comme étant une activité quelconque qui produirait un événement de journal d’erreurs PostgreSQL visible par le client avec un niveau de gravité égal ou supérieur à `ERROR`. Pour plus d’informations, consultez [Niveaux de gravité des messages PostgreSQL](https://www.postgresql.org/docs/current/runtime-config-logging.html#RUNTIME-CONFIG-SEVERITY-LEVELS). Par exemple, les erreurs de syntaxe et les annulations de requête génèrent un message d’erreur.  Les erreurs internes du serveur PostgreSQL, telles que les erreurs de processus du pointeur de contrôle en arrière-plan, ne génèrent pas de message d’erreur. Cependant, des enregistrements sont toujours émis pour des événements de ce type, quel que soit le paramètre du niveau de gravité du journal. Cela empêche les pirates informatiques de désactiver la journalisation pour tenter d’éviter la détection. Consultez également le champ `exitCode`.  | 
| exitCode | int | Valeur utilisée pour l’enregistrement en sortie de session. En cas de sortie sans problème, elle contient le code de sortie. Un code de sortie ne peut pas toujours être obtenu dans certains scénarios d’échec. Par exemple, si PostgreSQL effectue un exit() ou si un opérateur exécute une commande telle que kill -9.Si une erreur s’est produite, le champ `exitCode` affiche le code d’erreur SQL `SQLSTATE`, comme indiqué dans les [codes d’erreur PostgreSQL](https://www.postgresql.org/docs/current/errcodes-appendix.html). Consultez également le champ `errorMessage`. | 
| logTime | chaîne | Horodatage, tel qu’il est enregistré dans l’audit du chemin du code. Cela représente l’heure de fin d’exécution de l’instruction SQL. Consultez également le champ startTime. | 
| netProtocol | chaîne | Protocole de communication réseau. | 
| objectName | chaîne | Nom de l’objet de la base de données si l’instruction SQL agit sur l’un d’eux. Ce champ n’est utilisé que lorsque l’instruction SQL agit sur un objet de base de données. Si l’instruction SQL n’agit pas sur un objet, la valeur est « null ». | 
| objectType | chaîne | Type de l’objet de base de données, par exemple, table, index, vue, etc. Ce champ n’est utilisé que lorsque l’instruction SQL agit sur un objet de base de données. Si l’instruction SQL n’agit pas sur un objet, la valeur est « null ». Les valeurs valides sont notamment les suivantes :[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html) | 
| paramList | chaîne | Tableau de paramètres séparés par des virgules, transmis à l’instruction SQL. Si l’instruction SQL n’a pas de paramètres, la valeur est un tableau vide. | 
| pid | int | ID du processus de backend qui est dédié au service de la connexion du client. | 
| remoteHost | chaîne | L’adresse IP du client ou le nom d’hôte. Pour Aurora PostgreSQL, le paramètre log\$1hostname de la base de données détermine lequel est utilisé. La valeur remoteHost inclut également [local] et localhost qui indiquent l’activité de l’utilisateur rdsadmin. | 
| remotePort | chaîne | Numéro de port du client. | 
| rowCount | int | Numéro des lignes de la table affectées ou récupérées par l’instruction SQL. Ce champ n’est utilisé que pour les instructions SQL qui sont des instructions en langage de manipulation de données (DML). Si l’instruction SQL n’est pas une instruction DML, la valeur est « null ». | 
| serverHost | chaîne | Adresse IP de l’hôte du serveur de base de données. La valeur serverHost inclut également [local] et localhost qui indiquent l’activité de l’utilisateur rdsadmin. | 
| serverType | chaîne | Type du serveur de base de données, par exemple PostgreSQL. | 
| serverVersion | chaîne | Version du serveur de base de données, par exemple 2.3.1 pour Aurora PostgreSQL. | 
| serviceName | chaîne | Nom du service, par exemple Amazon Aurora PostgreSQL-Compatible edition.  | 
| sessionId | int | Identifiant de session à pseudo unique. | 
| sessionId | int | Identifiant de session à pseudo unique. | 
| startTime(enregistrements d’activité de base de données version 1.1 uniquement) | chaîne |  Heure à laquelle l’exécution a commencé pour l’instruction SQL.  Pour calculer le temps d’exécution approximatif de l’instruction SQL, utilisez `logTime - startTime`. Consultez également le champ `logTime`.  | 
| statementId | int | Identifiant de l’instruction SQL du client. Le compteur se trouve au niveau de la session et s’incrémente avec chaque instruction SQL entrée par le client.  | 
| substatementId | int | Identifiant d’une sous-instruction SQL. Cette valeur compte le nombre de sous-instructions pour chaque instruction identifiée par le champ statementId. | 
| type | chaîne | Type d’événement. Les valeurs valides sont record ou heartbeat. | 

## Champs databaseActivityEventList pour Aurora MySQL
<a name="DBActivityStreams.AuditLog.databaseActivityEventList.ams"></a>

Voici les champs `databaseActivityEventList` pour Aurora MySQL.


| Champ | Type de données | Description | 
| --- | --- | --- | 
| class | chaîne |  La classe d’un événement d’activité. Les valeurs possibles pour Aurora MySQL sont les suivantes : [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html)  | 
| clientApplication | chaîne | Application utilisée par le client pour se connecter, telle que signalée par le client. Le client n’a pas à fournir cette information, la valeur peut être « null ». | 
| command | chaîne |  Catégorie générale de l’instruction SQL. Les valeurs de ce champ dépendent de la valeur de `class`. Lorsque `class` est `MAIN` les valeurs sont notamment les suivantes : [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html) Lorsque `class` est `AUX` les valeurs sont notamment les suivantes : [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html)  | 
| commandText | chaîne |  Pour les événements dont la valeur `class` est `MAIN`, ce champ représente l’instruction SQL réelle transmise par l’utilisateur. Ce champ est utilisé pour tous les types d’enregistrements, excepté pour les enregistrements de connexion ou de déconnexion, auxquels cas la valeur est « null ».  Pour les événements dont la valeur `class` est `AUX`, ce champ contient des informations supplémentaires sur les objets impliqués dans l’événement.  Pour Aurora MySQL, les caractères tels que les guillemets sont précédés d’une barre oblique inverse, représentant un caractère d’échappement.  Le texte SQL complet de chaque instruction est visible dans le journal d’audit, y compris les données sensibles. Cependant, les mots de passe des utilisateurs de la base de données sont masqués si Aurora peut les deviner suivant le contexte, comme le montre l’exemple suivant.  <pre>mysql> SET PASSWORD = 'my-password';</pre> Spécifiez un mot de passe autre que celui indiqué ici, en tant que bonne pratique de sécurité.   | 
| databaseName | chaîne | Base de données à laquelle l’utilisateur s’est connecté. | 
| dbProtocol | chaîne | Protocole de la base de données. Actuellement, cette valeur est toujours MySQL pour Aurora MySQL. | 
| dbUserName | chaîne | L’utilisateur de la base de données avec lequel le client s’est authentifié. | 
| endTime(enregistrements d’activité de base de données version 1.2 uniquement) | chaîne |  Heure à laquelle l’exécution a fini pour l’instruction SQL. Il est représenté au format UTC (temps universel coordonné). Pour calculer le temps d’exécution de l’instruction SQL, utilisez `endTime - startTime`. Consultez également le champ `startTime`.  | 
| errorMessage(enregistrements d’activité de base de données version 1.1 uniquement) | chaîne |  En cas d’erreur, ce champ contient le message d’erreur qui aurait été généré par le serveur de base de données. La valeur `errorMessage` est nulle pour les instructions normales qui n’ont pas donné lieu à une erreur.  Une erreur est définie comme étant une activité quelconque qui produirait un événement de journal d’erreurs MySQL visible par le client avec un niveau de gravité égal ou supérieur à `ERROR`. Pour plus d’informations, consultez [Le journal d’erreurs](https://dev.mysql.com/doc/refman/5.7/en/error-log.html) dans le *Manuel de référence MySQL*. Par exemple, les erreurs de syntaxe et les annulations de requête génèrent un message d’erreur.  Les erreurs internes du serveur MySQL, telles que les erreurs de processus du pointeur de contrôle en arrière-plan, ne génèrent pas de message d’erreur. Cependant, des enregistrements sont toujours émis pour des événements de ce type, quel que soit le paramètre du niveau de gravité du journal. Cela empêche les pirates informatiques de désactiver la journalisation pour tenter d’éviter la détection. Consultez également le champ `exitCode`.  | 
| exitCode | int | Valeur utilisée pour l’enregistrement en sortie de session. En cas de sortie sans problème, elle contient le code de sortie. Un code de sortie ne peut pas toujours être obtenu dans certains scénarios d’échec. Dans de tels cas, cette valeur peut être nulle ou vide. | 
| logTime | chaîne | Horodatage, tel qu’il est enregistré dans l’audit du chemin du code. Il est représenté au format UTC (temps universel coordonné). Pour connaître la méthode la plus précise de calculer la durée de l’instruction, consultez les champs startTime et endTime. | 
| netProtocol | chaîne | Protocole de communication réseau. Actuellement, cette valeur est toujours TCP pour Aurora MySQL. | 
| objectName | chaîne | Nom de l’objet de la base de données si l’instruction SQL agit sur l’un d’eux. Ce champ n’est utilisé que lorsque l’instruction SQL agit sur un objet de base de données. Si l’instruction SQL n’agit pas sur un objet, cette valeur est vide. Pour construire le nom complet de l’objet, combinez databaseName et objectName. Si la requête comprend plusieurs objets, ce champ peut être une liste de noms séparés par des virgules. | 
| objectType | chaîne |  Type de l’objet de base de données, par exemple, table, index, etc. Ce champ n’est utilisé que lorsque l’instruction SQL agit sur un objet de base de données. Si l’instruction SQL n’agit pas sur un objet, la valeur est « null ». Les valeurs valides pour Aurora MySQL sont notamment les suivantes : [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/AmazonRDS/latest/AuroraUserGuide/DBActivityStreams.AuditLog.databaseActivityEventList.html)  | 
| paramList | chaîne | Ce champ n’est pas utilisé pour Aurora MySQL et est toujours « null ». | 
| pid | int | ID du processus de backend qui est dédié au service de la connexion du client. Lorsque le serveur de base de données est redémarré, les modifications pid et le compteur du champ statementId redémarrent. | 
| remoteHost | chaîne | L’adresse IP ou le nom d’hôte du client qui a émis l’instruction SQL. Pour Aurora MySQL, le paramètre skip\$1name\$1resolve de la base de données détermine lequel est utilisé. La valeur localhost indique l’activité de l’utilisateur spécial rdsadmin.  | 
| remotePort | chaîne | Numéro de port du client. | 
| rowCount | int | Nombre de lignes renvoyées par l’instruction SQL. Par exemple, si une instruction SELECT renvoie 10 lignes, rowCount est égal à 10. Pour les instructions INSERT ou UPDATE, rowCount est égal 0. | 
| serverHost | chaîne | Identifiant d’instance du serveur de base de données. | 
| serverType | chaîne | Type du serveur de base de données, par exemple MySQL. | 
| serverVersion | chaîne | Version du serveur de base de données. Actuellement, cette valeur est toujours MySQL 5.7.12 pour Aurora MySQL. | 
| serviceName | chaîne | Nom du service. Actuellement, cette valeur est toujours Amazon Aurora MySQL pour Aurora MySQL. | 
| sessionId | int | Identifiant de session à pseudo unique. | 
| startTime(enregistrements d’activité de base de données version 1.1 uniquement) | chaîne |  Heure à laquelle l’exécution a commencé pour l’instruction SQL. Il est représenté au format UTC (temps universel coordonné). Pour calculer le temps d’exécution de l’instruction SQL, utilisez `endTime - startTime`. Consultez également le champ `endTime`.  | 
| statementId | int | Identifiant de l’instruction SQL du client. Le compteur s’incrémente avec chaque instruction SQL saisie par le client. Le compteur est réinitialisé lorsque l’instance de base de données est redémarrée. | 
| substatementId | int | Identifiant d’une sous-instruction SQL. Cette valeur est 1 pour les événements de classe MAIN et 2 pour les événements de classe AUX. Utilisez le champ statementId pour identifier tous les événements générés par la même instruction. | 
| transactionId(enregistrements d’activité de base de données version 1.2 uniquement) | int | Identifiant d’une transaction. | 
| type | chaîne | Type d’événement. Les valeurs valides sont record ou heartbeat. | 

# Traitement d’un flux d’activité de base de données à l’aide du kit AWS SDK
<a name="DBActivityStreams.CodeExample"></a>

Vous pouvez traiter par programmation un flux d’activité à l’aide du kit AWS SDK. Les exemples suivants sont des exemples Java et Python entièrement fonctionnels de traitement du flux de données Kinesis.

------
#### [ Java ]

```
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.zip.GZIPInputStream;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.encryptionsdk.AwsCrypto;
import com.amazonaws.encryptionsdk.CryptoInputStream;
import com.amazonaws.encryptionsdk.jce.JceMasterKey;
import com.amazonaws.services.kinesis.clientlibrary.exceptions.InvalidStateException;
import com.amazonaws.services.kinesis.clientlibrary.exceptions.ShutdownException;
import com.amazonaws.services.kinesis.clientlibrary.exceptions.ThrottlingException;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessor;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessorCheckpointer;
import com.amazonaws.services.kinesis.clientlibrary.interfaces.IRecordProcessorFactory;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.InitialPositionInStream;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.KinesisClientLibConfiguration;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.ShutdownReason;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker;
import com.amazonaws.services.kinesis.clientlibrary.lib.worker.Worker.Builder;
import com.amazonaws.services.kinesis.model.Record;
import com.amazonaws.services.kms.AWSKMS;
import com.amazonaws.services.kms.AWSKMSClientBuilder;
import com.amazonaws.services.kms.model.DecryptRequest;
import com.amazonaws.services.kms.model.DecryptResult;
import com.amazonaws.util.Base64;
import com.amazonaws.util.IOUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class DemoConsumer {

    private static final String STREAM_NAME = "aws-rds-das-[cluster-external-resource-id]";
    private static final String APPLICATION_NAME = "AnyApplication"; //unique application name for dynamo table generation that holds kinesis shard tracking
    private static final String AWS_ACCESS_KEY = "[AWS_ACCESS_KEY_TO_ACCESS_KINESIS]";
    private static final String AWS_SECRET_KEY = "[AWS_SECRET_KEY_TO_ACCESS_KINESIS]";
    private static final String DBC_RESOURCE_ID = "[cluster-external-resource-id]";
    private static final String REGION_NAME = "[region-name]"; //us-east-1, us-east-2...
    private static final BasicAWSCredentials CREDENTIALS = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);
    private static final AWSStaticCredentialsProvider CREDENTIALS_PROVIDER = new AWSStaticCredentialsProvider(CREDENTIALS);

    private static final AwsCrypto CRYPTO = new AwsCrypto();
    private static final AWSKMS KMS = AWSKMSClientBuilder.standard()
            .withRegion(REGION_NAME)
            .withCredentials(CREDENTIALS_PROVIDER).build();

    class Activity {
        String type;
        String version;
        String databaseActivityEvents;
        String key;
    }

    class ActivityEvent {
        @SerializedName("class") String _class;
        String clientApplication;
        String command;
        String commandText;
        String databaseName;
        String dbProtocol;
        String dbUserName;
        String endTime;
        String errorMessage;
        String exitCode;
        String logTime;
        String netProtocol;
        String objectName;
        String objectType;
        List<String> paramList;
        String pid;
        String remoteHost;
        String remotePort;
        String rowCount;
        String serverHost;
        String serverType;
        String serverVersion;
        String serviceName;
        String sessionId;
        String startTime;
        String statementId;
        String substatementId;
        String transactionId;
        String type;
    }

    class ActivityRecords {
        String type;
        String clusterId;
        String instanceId;
        List<ActivityEvent> databaseActivityEventList;
    }

    static class RecordProcessorFactory implements IRecordProcessorFactory {
        @Override
        public IRecordProcessor createProcessor() {
            return new RecordProcessor();
        }
    }

    static class RecordProcessor implements IRecordProcessor {

        private static final long BACKOFF_TIME_IN_MILLIS = 3000L;
        private static final int PROCESSING_RETRIES_MAX = 10;
        private static final long CHECKPOINT_INTERVAL_MILLIS = 60000L;
        private static final Gson GSON = new GsonBuilder().serializeNulls().create();

        private static final Cipher CIPHER;
        static {
            Security.insertProviderAt(new BouncyCastleProvider(), 1);
            try {
                CIPHER = Cipher.getInstance("AES/GCM/NoPadding", "BC");
            } catch (NoSuchAlgorithmException | NoSuchPaddingException | NoSuchProviderException e) {
                throw new ExceptionInInitializerError(e);
            }
        }

        private long nextCheckpointTimeInMillis;

        @Override
        public void initialize(String shardId) {
        }

        @Override
        public void processRecords(final List<Record> records, final IRecordProcessorCheckpointer checkpointer) {
            for (final Record record : records) {
                processSingleBlob(record.getData());
            }

            if (System.currentTimeMillis() > nextCheckpointTimeInMillis) {
                checkpoint(checkpointer);
                nextCheckpointTimeInMillis = System.currentTimeMillis() + CHECKPOINT_INTERVAL_MILLIS;
            }
        }

        @Override
        public void shutdown(IRecordProcessorCheckpointer checkpointer, ShutdownReason reason) {
            if (reason == ShutdownReason.TERMINATE) {
                checkpoint(checkpointer);
            }
        }

        private void processSingleBlob(final ByteBuffer bytes) {
            try {
                // JSON $Activity
                final Activity activity = GSON.fromJson(new String(bytes.array(), StandardCharsets.UTF_8), Activity.class);

                // Base64.Decode
                final byte[] decoded = Base64.decode(activity.databaseActivityEvents);
                final byte[] decodedDataKey = Base64.decode(activity.key);

                Map<String, String> context = new HashMap<>();
                context.put("aws:rds:dbc-id", DBC_RESOURCE_ID);

                // Decrypt
                final DecryptRequest decryptRequest = new DecryptRequest()
                        .withCiphertextBlob(ByteBuffer.wrap(decodedDataKey)).withEncryptionContext(context);
                final DecryptResult decryptResult = KMS.decrypt(decryptRequest);
                final byte[] decrypted = decrypt(decoded, getByteArray(decryptResult.getPlaintext()));

                // GZip Decompress
                final byte[] decompressed = decompress(decrypted);
                // JSON $ActivityRecords
                final ActivityRecords activityRecords = GSON.fromJson(new String(decompressed, StandardCharsets.UTF_8), ActivityRecords.class);

                // Iterate throught $ActivityEvents
                for (final ActivityEvent event : activityRecords.databaseActivityEventList) {
                    System.out.println(GSON.toJson(event));
                }
            } catch (Exception e) {
                // Handle error.
                e.printStackTrace();
            }
        }

        private static byte[] decompress(final byte[] src) throws IOException {
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(src);
            GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream);
            return IOUtils.toByteArray(gzipInputStream);
        }

        private void checkpoint(IRecordProcessorCheckpointer checkpointer) {
            for (int i = 0; i < PROCESSING_RETRIES_MAX; i++) {
                try {
                    checkpointer.checkpoint();
                    break;
                } catch (ShutdownException se) {
                    // Ignore checkpoint if the processor instance has been shutdown (fail over).
                    System.out.println("Caught shutdown exception, skipping checkpoint." + se);
                    break;
                } catch (ThrottlingException e) {
                    // Backoff and re-attempt checkpoint upon transient failures
                    if (i >= (PROCESSING_RETRIES_MAX - 1)) {
                        System.out.println("Checkpoint failed after " + (i + 1) + "attempts." + e);
                        break;
                    } else {
                        System.out.println("Transient issue when checkpointing - attempt " + (i + 1) + " of " + PROCESSING_RETRIES_MAX + e);
                    }
                } catch (InvalidStateException e) {
                    // This indicates an issue with the DynamoDB table (check for table, provisioned IOPS).
                    System.out.println("Cannot save checkpoint to the DynamoDB table used by the Amazon Kinesis Client Library." + e);
                    break;
                }
                try {
                    Thread.sleep(BACKOFF_TIME_IN_MILLIS);
                } catch (InterruptedException e) {
                    System.out.println("Interrupted sleep" + e);
                }
            }
        }
    }

    private static byte[] decrypt(final byte[] decoded, final byte[] decodedDataKey) throws IOException {
        // Create a JCE master key provider using the random key and an AES-GCM encryption algorithm
        final JceMasterKey masterKey = JceMasterKey.getInstance(new SecretKeySpec(decodedDataKey, "AES"),
                "BC", "DataKey", "AES/GCM/NoPadding");
        try (final CryptoInputStream<JceMasterKey> decryptingStream = CRYPTO.createDecryptingStream(masterKey, new ByteArrayInputStream(decoded));
             final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            IOUtils.copy(decryptingStream, out);
            return out.toByteArray();
        }
    }

    public static void main(String[] args) throws Exception {
        final String workerId = InetAddress.getLocalHost().getCanonicalHostName() + ":" + UUID.randomUUID();
        final KinesisClientLibConfiguration kinesisClientLibConfiguration =
                new KinesisClientLibConfiguration(APPLICATION_NAME, STREAM_NAME, CREDENTIALS_PROVIDER, workerId);
        kinesisClientLibConfiguration.withInitialPositionInStream(InitialPositionInStream.LATEST);
        kinesisClientLibConfiguration.withRegionName(REGION_NAME);
        final Worker worker = new Builder()
                .recordProcessorFactory(new RecordProcessorFactory())
                .config(kinesisClientLibConfiguration)
                .build();

        System.out.printf("Running %s to process stream %s as worker %s...\n", APPLICATION_NAME, STREAM_NAME, workerId);

        try {
            worker.run();
        } catch (Throwable t) {
            System.err.println("Caught throwable while processing data.");
            t.printStackTrace();
            System.exit(1);
        }
        System.exit(0);
    }

    private static byte[] getByteArray(final ByteBuffer b) {
        byte[] byteArray = new byte[b.remaining()];
        b.get(byteArray);
        return byteArray;
    }
}
```

------
#### [ Python ]

```
import base64
import json
import zlib
import aws_encryption_sdk
from aws_encryption_sdk import CommitmentPolicy
from aws_encryption_sdk.internal.crypto import WrappingKey
from aws_encryption_sdk.key_providers.raw import RawMasterKeyProvider
from aws_encryption_sdk.identifiers import WrappingAlgorithm, EncryptionKeyType
import boto3

REGION_NAME = '<region>'                    # us-east-1
RESOURCE_ID = '<external-resource-id>'      # cluster-ABCD123456
STREAM_NAME = 'aws-rds-das-' + RESOURCE_ID  # aws-rds-das-cluster-ABCD123456

enc_client = aws_encryption_sdk.EncryptionSDKClient(commitment_policy=CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT)

class MyRawMasterKeyProvider(RawMasterKeyProvider):
    provider_id = "BC"

    def __new__(cls, *args, **kwargs):
        obj = super(RawMasterKeyProvider, cls).__new__(cls)
        return obj

    def __init__(self, plain_key):
        RawMasterKeyProvider.__init__(self)
        self.wrapping_key = WrappingKey(wrapping_algorithm=WrappingAlgorithm.AES_256_GCM_IV12_TAG16_NO_PADDING,
                                        wrapping_key=plain_key, wrapping_key_type=EncryptionKeyType.SYMMETRIC)

    def _get_raw_key(self, key_id):
        return self.wrapping_key


def decrypt_payload(payload, data_key):
    my_key_provider = MyRawMasterKeyProvider(data_key)
    my_key_provider.add_master_key("DataKey")
    decrypted_plaintext, header = enc_client.decrypt(
        source=payload,
        materials_manager=aws_encryption_sdk.materials_managers.default.DefaultCryptoMaterialsManager(master_key_provider=my_key_provider))
    return decrypted_plaintext


def decrypt_decompress(payload, key):
    decrypted = decrypt_payload(payload, key)
    return zlib.decompress(decrypted, zlib.MAX_WBITS + 16)


def main():
    session = boto3.session.Session()
    kms = session.client('kms', region_name=REGION_NAME)
    kinesis = session.client('kinesis', region_name=REGION_NAME)

    response = kinesis.describe_stream(StreamName=STREAM_NAME)
    shard_iters = []
    for shard in response['StreamDescription']['Shards']:
        shard_iter_response = kinesis.get_shard_iterator(StreamName=STREAM_NAME, ShardId=shard['ShardId'],
                                                         ShardIteratorType='LATEST')
        shard_iters.append(shard_iter_response['ShardIterator'])

    while len(shard_iters) > 0:
        next_shard_iters = []
        for shard_iter in shard_iters:
            response = kinesis.get_records(ShardIterator=shard_iter, Limit=10000)
            for record in response['Records']:
                record_data = record['Data']
                record_data = json.loads(record_data)
                payload_decoded = base64.b64decode(record_data['databaseActivityEvents'])
                data_key_decoded = base64.b64decode(record_data['key'])
                data_key_decrypt_result = kms.decrypt(CiphertextBlob=data_key_decoded,
                                                      EncryptionContext={'aws:rds:dbc-id': RESOURCE_ID})
                print (decrypt_decompress(payload_decoded, data_key_decrypt_result['Plaintext']))
            if 'NextShardIterator' in response:
                next_shard_iters.append(response['NextShardIterator'])
        shard_iters = next_shard_iters


if __name__ == '__main__':
    main()
```

------

# Exemples de politique IAM pour les flux d’activité de base de données
<a name="DBActivityStreams.ManagingAccess"></a>

Tout utilisateur disposant des privilèges de rôle Gestion des identités et des accès AWS (IAM) appropriés pour les flux d'activité de base de données peut créer, démarrer, arrêter et modifier les paramètres des flux d'activité pour une de base de données. Ces actions sont consignées dans le journal d’audit du flux. Pour des raisons de conformité optimales, nous vous recommandons de ne pas octroyer ces privilèges à DBAs.

Vous devrez paramétrer les accès aux flux d’activité de base de données à l’aide de politiques IAM. Pour plus d’informations sur l’authentification Aurora, consultez [Identity and Access Management pour Amazon Aurora](UsingWithRDS.IAM.md). Pour plus d’informations sur la création des stratégies IAM, consultez [Création et utilisation d'une politique IAM pour l'accès à une base de données IAM](UsingWithRDS.IAMDBAuth.IAMPolicy.md). 

**Example politique pour autoriser la configuration de Database Activity Streams**  
Pour donner aux utilisateurs des accès précis en vue de modifier les flux d’activité, utilisez les clés de contexte d’opération spécifiques au service `rds:StartActivityStream` et `rds:StopActivityStream` dans une stratégie IAM. L’exemple de politique IAM suivant autorise un utilisateur ou un rôle à configurer des flux d’activité.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ConfigureActivityStreams",
            "Effect": "Allow",
            "Action": [
                "rds:StartActivityStream",
                "rds:StopActivityStream"
            ],
            "Resource": "*"
        }
    ]
}
```

**Example politique pour autoriser le démarrage de Database Activity Streams**  
L’exemple de politique IAM suivant autorise un utilisateur ou un rôle à démarrer des flux d’activité.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"AllowStartActivityStreams",
            "Effect":"Allow",
            "Action":"rds:StartActivityStream",
            "Resource":"*"
        }
    ]
}
```

**Example politique pour autoriser l’arrêt de Database Activity Streams**  
L’exemple de politique IAM suivant autorise un utilisateur ou un rôle à arrêter des flux d’activité.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"AllowStopActivityStreams",
            "Effect":"Allow",
            "Action":"rds:StopActivityStream",
            "Resource":"*"
        }
     ]
}
```

**Example politique pour refuser le démarrage de Database Activity Streams**  
La politique IAM suivante empêche un utilisateur ou un rôle de démarrer des flux d’activité.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"DenyStartActivityStreams",
            "Effect":"Deny",
            "Action":"rds:StartActivityStream",
            "Resource":"*"
        }
     ]
}
```

**Example politique pour refuser l’arrêt de Database Activity Streams**  
La politique IAM suivante empêche un utilisateur ou un rôle d’arrêter des flux d’activité.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"DenyStopActivityStreams",
            "Effect":"Deny",
            "Action":"rds:StopActivityStream",
            "Resource":"*"
        }
    ]
}
```