---
title: "Connecter Amazon Athena"
description: "Connecter Datarelix à Amazon Athena : modes d’authentification IAM, portée du Glue Data Catalog, stratégie en lecture seule, coûts de requête et droits Lake Formation."
canonical: https://docs.datarelix.ai/fr/guides/connections/athena/
---

# Connecter Amazon Athena

Datarelix se connecte à AWS Athena via un service de requêtes en lecture seule. Athena parle le SQL Trino/Presto et lit les métadonnées de table depuis l'AWS Glue Data Catalog — voir [Getting started with Athena](https://docs.aws.amazon.com/athena/latest/ug/getting-started.html).

## Prérequis

- Un compte AWS avec Athena activé dans votre région cible.
- Un **bucket S3** pour la mise en attente des résultats de requête, dans la **même région qu'Athena** (Athena y écrit les résultats intermédiaires avant que Datarelix ne les télécharge).
- Un **Glue Data Catalog** contenant les bases et les tables que vous voulez analyser. Les tables doivent être cataloguées — Athena ne découvre pas automatiquement le schéma à partir d'objets S3 bruts.
- Des autorisations IAM sur le principal utilisé pour l'authentification. Au minimum : `athena:StartQueryExecution`, `athena:GetQueryExecution`, `athena:GetQueryResults`, `glue:GetDatabase(s)`, `glue:GetTable(s)`, `s3:GetObject` sur les chemins S3 des données, et `s3:GetObject`/`s3:PutObject` sur le préfixe S3 de mise en attente.

## Formulaire de connexion

```ini
AWS region:           us-east-1
S3 output location:   s3://your-bucket/athena-staging/
Workgroup:            primary             (default)
Catalog:              AwsDataCatalog      (default)
Auth mode:            one of the two below
```

Le champ **Allowed schema** (schéma autorisé), défini par connexion, limite l'introspection et les requêtes à une seule base Glue.

## Modes d'authentification

### IAM access keys

Clé d'accès AWS et secret à longue durée de vie. Les identifiants sont stockés chiffrés. La voie la plus simple pour se connecter depuis l'extérieur d'AWS, quand aucun rôle IAM ambiant n'est disponible.

**Configuration — créer un utilisateur IAM dédié**

1. Dans la console AWS, [créez un utilisateur IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html) (**IAM → Users → Create user**). Donnez-lui un nom explicite (par exemple `datarelix-athena-reader`).
2. Choisissez **Attach policies directly** et attachez une stratégie avec les autorisations minimales suivantes (ou créez une stratégie personnalisée — voir [Athena IAM policies](https://docs.aws.amazon.com/athena/latest/ug/managed-policies.html)) :

   ```json
   {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "athena:StartQueryExecution",
           "athena:GetQueryExecution",
           "athena:GetQueryResults",
           "athena:StopQueryExecution",
           "athena:GetWorkGroup"
         ],
         "Resource": "arn:aws:athena:<region>:<account-id>:workgroup/primary"
       },
       {
         "Effect": "Allow",
         "Action": ["glue:GetDatabase", "glue:GetDatabases", "glue:GetTable", "glue:GetTables", "glue:GetPartitions"],
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": ["s3:GetBucketLocation"],
         "Resource": "arn:aws:s3:::your-data-bucket"
       },
       {
         "Effect": "Allow",
         "Action": ["s3:GetObject"],
         "Resource": "arn:aws:s3:::your-data-bucket/*"
       },
       {
         "Effect": "Allow",
         "Action": ["s3:GetObject", "s3:PutObject"],
         "Resource": "arn:aws:s3:::your-bucket/athena-staging/*"
       },
       {
         "Effect": "Allow",
         "Action": ["s3:ListBucket"],
         "Resource": "arn:aws:s3:::your-bucket"
       }
     ]
   }
   ```

3. Une fois l'utilisateur créé, [créez une clé d'accès](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html) (utilisateur → **Security credentials → Access keys → Create access key**). Choisissez **Application running outside AWS**. Copiez l'**Access key ID** (identifiant de clé d'accès) et la **Secret access key** (clé d'accès secrète) — le secret n'est affiché qu'une seule fois.

**Où trouver vos identifiants**

- **Access key ID** et **Secret access key** : IAM → Users → [votre utilisateur] → **Security credentials → Access keys** (vous devez créer une nouvelle clé si vous n'avez pas copié le secret au moment de la création).

**Ce qu'il faut saisir**

```ini
AWS region:           us-east-1
S3 output location:   s3://your-bucket/athena-staging/
Auth mode:            IAM access keys
Access Key ID:        AKIAIOSFODNN7EXAMPLE
Secret Access Key:    ••••••••
```

---

### Assume Role

L'identité appelante endosse un rôle IAM cible via AWS STS avant d'interroger Athena. Adapté aux accès **inter-comptes** : vos identifiants vivent dans un compte, les données Athena et les autorisations vivent dans le rôle IAM d'un autre compte.

**Configuration — créer le rôle endossable dans le compte de données**

1. Dans le **compte AWS propriétaire des données**, allez dans **IAM → Roles → Create role**.
2. Choisissez **Another AWS account** comme entité de confiance et saisissez l'ID de votre compte appelant.
3. Attachez la même stratégie Athena + Glue + S3 que dans le mode IAM access keys ci-dessus.
4. Si vous voulez utiliser un [**External ID**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) (identifiant externe, recommandé pour prévenir les attaques de type « confused deputy »), ajoutez une condition à la stratégie de confiance :
   ```json
   {
     "Version": "2012-10-17",
     "Statement": [{
       "Effect": "Allow",
       "Principal": { "AWS": "arn:aws:iam::<your-calling-account>:root" },
       "Action": "sts:AssumeRole",
       "Condition": {
         "StringEquals": { "sts:ExternalId": "your-external-id" }
       }
     }]
   }
   ```
5. Copiez le **Role ARN** (ARN du rôle) depuis la page de résumé du rôle.

L'identité appelante (résolue depuis votre connexion **IAM access keys** ou depuis des identifiants ambiants) doit disposer de l'autorisation `sts:AssumeRole` sur l'ARN du rôle cible.

**Où trouver vos identifiants**

| Champ | Où le trouver |
|-------|----------------|
| Role ARN | IAM (compte de données) → Roles → [votre rôle] → **ARN** dans le résumé (par exemple `arn:aws:iam::123456789012:role/AthenaReaderRole`) |
| External ID | La valeur définie dans la condition de la stratégie de confiance, le cas échéant |

**Ce qu'il faut saisir**

```ini
AWS region:           us-east-1
S3 output location:   s3://your-bucket/athena-staging/
Auth mode:            Assume Role
Role ARN:             arn:aws:iam::123456789012:role/AthenaReaderRole
External ID:          your-external-id    (leave blank if not required by the trust policy)
```

---

## Glue Data Catalog

Athena lit les métadonnées de schéma et de table depuis le Glue Data Catalog. **Une table n'existe pas dans Athena tant qu'elle n'est pas cataloguée dans Glue.**

- Vérifiez que vos tables sont visibles : console AWS → **Glue → Data Catalog → Databases** → cliquez sur votre base → regardez **Tables**.
- Si vos données sont dans S3 mais qu'aucune table Glue n'existe, exécutez une fois un [crawler AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html) pour remplir le catalogue.
- Le champ **Allowed schema** de la connexion correspond à une base Glue.
- Les catalogues personnalisés (catalogues Glue fédérés, Hive Metastore via Lake Formation) fonctionnent via le champ `Catalog` — la valeur par défaut est `AwsDataCatalog`.

### IAM seul ou Lake Formation

La façon d'accorder l'accès en lecture dépend de la gouvernance de la base par AWS Lake Formation :

- **Catalogue géré par IAM** — les autorisations `glue:Get*` + `s3:GetObject` de la stratégie IAM ci-dessus suffisent.
- **Catalogue gouverné par Lake Formation** — les autorisations IAM ne suffisent **pas**. Vous devez *aussi* accorder au principal `SELECT` (et `DESCRIBE`) sur la base et les tables dans [Lake Formation](https://docs.aws.amazon.com/athena/latest/ug/lf-athena-limitations.html), et accorder `DESCRIBE` sur la base `default`. Sans cela, les requêtes échouent avec `Insufficient Lake Formation permissions`, même quand IAM est correct.

En cas de doute, console AWS → **Lake Formation → Data lake locations** : si vos chemins S3 y sont enregistrés, le catalogue est gouverné par Lake Formation.

## Répertoire de mise en attente S3

Athena écrit les [résultats de requête dans S3](https://docs.aws.amazon.com/athena/latest/ug/querying.html) avant qu'ils puissent être téléchargés. L'emplacement peut aussi être défini sur le [workgroup](https://docs.aws.amazon.com/athena/latest/ug/workgroups.html).

- **La région doit correspondre à celle d'Athena.** Un bucket `us-west-2` avec une requête Athena en `us-east-1` échoue avec `Query result location is invalid`.
- Athena ne supprime **pas** automatiquement les fichiers de résultats. Ajoutez une règle de cycle de vie S3 sur le préfixe de mise en attente (expiration après 7 jours, par exemple) pour contenir les coûts.

## Sémantique de la portée

Le champ **Allowed schema** limite l'introspection et les requêtes à une seule base Glue. Une portée vide n'est pas prise en charge : vous devez indiquer une base explicitement. Pour analyser plusieurs bases, créez plusieurs connexions.

## Découverte

Le module d'introspection interroge `INFORMATION_SCHEMA` via Athena (ce sont de petites requêtes Athena, comptabilisées sur votre workgroup). Glue ne suit pas les clés étrangères — la passe d'enrichissement par le modèle déduit les relations à partir des conventions de noms de colonnes, si vous l'activez.

## Limites

- **Lecture seule** — le validateur rejette les instructions d'écriture et les instructions DDL.
- **Une seule base Glue par connexion.**
- **Latence de téléchargement des résultats** — Athena passe toujours par S3, puis Datarelix récupère les fichiers. Cela ajoute environ 100 à 500 ms par requête, en plus du temps de calcul.

## Dépannage

| Symptôme | Cause probable | Solution |
|---------|--------------|-----|
| `AccessDenied` sur `glue:GetDatabase`/`GetTables` | Autorisations Glue manquantes | Ajoutez les actions IAM de l'extrait de stratégie ci-dessus. |
| `Insufficient permissions to execute the query` | `s3:GetObject` manquant sur les données sources | Vérifiez que le principal IAM peut lire les chemins S3 enregistrés dans Glue. |
| `Query result location not set` / `is invalid` | Répertoire de mise en attente vide ou région incohérente | Réglez **S3 output location** (emplacement de sortie S3) sur un `s3://bucket/prefix/` situé dans la **même région qu'Athena**. |
| `AccessDenied: ... is not authorized to perform sts:AssumeRole` | Identité appelante non autorisée par la stratégie de confiance du rôle cible | Mettez à jour la stratégie de confiance du rôle pour autoriser le principal appelant. |
| `AccessDenied` avec ExternalId | External ID absent ou incorrect | Renseignez le champ **External ID** avec la valeur attendue par la stratégie de confiance (sensible à la casse). |
| `Insufficient Lake Formation permissions` | Lake Formation activé sur le catalogue | Accordez `SELECT` au principal via la console Lake Formation, en plus d'IAM. |
| `Table not found` alors que Glue la liste | Mauvais catalogue | Vérifiez que le champ **Catalog** correspond au nom du catalogue dans Glue (généralement `AwsDataCatalog`). |
