

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.

# Connexion à SAP OData
<a name="connecting-to-data-sap-odata"></a>

SAP OData est un protocole Web standard utilisé pour interroger et mettre à jour les données présentes dans SAP à l'aide de l'ABAP (Advanced Business Application Programming), en appliquant et en s'appuyant sur des technologies Web telles que le HTTP pour fournir un accès aux informations provenant de diverses applications, plateformes et appareils externes. Le produit vous permet d’accéder à tout ce dont vous avez besoin pour vous intégrer parfaitement à votre système, à votre application ou à vos données SAP.

**Topics**
+ [AWS Glue support pour SAP OData](sap-odata-support.md)
+ [Création de connexions](sap-odata-creating-connections.md)
+ [Création d'un OData job SAP](sap-odata-creating-job.md)
+ [Écrire à SAP OData](sap-odata-writing.md)
+ [Utilisation du script de gestion OData d'état SAP](sap-odata-state-management-script.md)
+ [Partitionnement pour les entités non ODP](sap-odata-non-odp-entities-partitioning.md)
+ [Options de OData connexion SAP](sap-odata-connection-options.md)
+ [Détails de OData l'entité et du champ SAP](sap-odata-entity-field-details.md)

# AWS Glue support pour SAP OData
<a name="sap-odata-support"></a>

AWS Glue prend en charge SAP OData comme suit :

**Prise en charge en tant que source ?**  
Oui. Vous pouvez utiliser des tâches AWS Glue ETL pour interroger des données auprès de SAP OData.

**Prise en charge en tant que cible ?**  
Oui. Vous pouvez utiliser des tâches AWS Glue ETL pour écrire des enregistrements dans SAP OData.

**Versions d' OData API SAP prises en charge**  
Les versions d' OData API SAP suivantes sont prises en charge :
+ 2.0

**Sources prises en charge**  
Les sources suivantes sont prises en charge :
+ Sources ODP (Operational Data Provisioning) :
  + Extracteurs BW (1) DataSources
  + Vues CDS
  + SLT
+ Sources non ODP, par exemple :
  + Services d’affichage CDS
  + Services basés sur RFC
  + Services ABAP personnalisés

**Composants SAP pris en charge**  
Les exigences minimales sont les suivantes :
+ Vous devez activer le service de catalogue pour la découverte de service.
  + Configurez les sources de données ODP (Operational Data Provisioning) à extraire dans la passerelle SAP de votre système SAP.
  + **OData V2.0** : Activez le ou les services de catalogue OData V2.0 dans votre passerelle SAP via une transaction. `/IWFND/MAINT_SERVICE`
  + Activez les services OData V2.0 dans votre passerelle SAP via une transaction. `/IWFND/MAINT_SERVICE`
  + Votre OData service SAP doit prendre en charge pagination/query les options côté client telles que `$top` et`$skip`. Il doit également prendre en charge l’option de requête système `$count`.
  + Vous devez fournir l'autorisation requise pour que l'utilisateur puisse découvrir les services et extraire les données à l'aide des OData services SAP. Reportez-vous à la documentation de sécurité fournie par SAP.
+ Si vous souhaitez utiliser la OAuth version 2.0 comme mécanisme d'autorisation, vous devez activer la OAuth version 2.0 pour le OData service et enregistrer le OAuth client conformément à la documentation SAP.
+ Pour générer un OData service basé sur des sources de données ODP, SAP Gateway Foundation doit être installé localement dans votre ERP/BW stack ou dans une configuration de hub.
  + Pour vos ERP/BW applications, la pile SAP NetWeaver AS ABAP doit être 7.50 SP02 ou supérieure.
  + Pour le système de hub (SAP Gateway), le SAP NetWeaver AS ABAP du système de hub doit être 7.50 SP01 ou supérieur pour la configuration du hub distant.
+ Pour les sources non ODP, la version de votre NetWeaver stack SAP doit être 7.40 SP02 ou supérieure.

**Méthodes d’authentification prises en charge**  
Les méthodes d’authentification suivantes sont prises en charge :
+ Authentification de base
+ OAuth 2,0

# Conditions préalables
<a name="sap-odata-prerequisites"></a>

Avant de lancer une AWS Glue tâche d'extraction de données depuis SAP à OData l'aide de la OData connexion SAP, remplissez les conditions préalables suivantes :
+ Le OData service SAP correspondant doit être activé dans le système SAP, afin de garantir que la source de données est disponible pour la consommation. Si le OData service n'est pas activé, la tâche Glue ne pourra pas accéder aux données de SAP ni en extraire.
+ Les mécanismes d'authentification appropriés tels que l'authentification de base (personnalisée) ou OAuth 2.0 doivent être configurés dans SAP pour garantir que la AWS Glue tâche puisse établir avec succès une connexion avec le OData service SAP.
+ Configurez les politiques IAM pour accorder à la AWS Glue tâche les autorisations appropriées pour accéder à SAP, à Secrets Manager et aux autres AWS ressources impliquées dans le processus.
+ Si le système SAP est hébergé sur un réseau privé, la connectivité VPC doit être configurée pour garantir que la AWS Glue tâche puisse communiquer en toute sécurité avec SAP sans exposer de données sensibles sur Internet public.

AWS Secrets Manager peut être utilisé pour stocker en toute sécurité des informations sensibles telles que les informations d'identification SAP, que la AWS Glue tâche peut récupérer dynamiquement lors de l'exécution. Cette approche élimine le besoin de coder en dur les informations d’identification, et améliore ainsi la sécurité et la flexibilité.

Les prérequis suivants fournissent des step-by-step conseils sur la façon de configurer chaque composant pour une intégration fluide entre SAP AWS Glue et SAP OData.

**Topics**
+ [OData Activation de SAP](sap-odata-activation.md)
+ [politiques IAM](sap-odata-configuring-iam-permissions.md)
+ [Connectivité/connexion VPC](sap-odata-connectivity-vpc-connection.md)
+ [Authentification SAP](sap-odata-authentication.md)
+ [AWS Secrets Manager pour stocker votre secret d'authentification](sap-odata-aws-secret-manager-auth-secret.md)

# OData Activation de SAP
<a name="sap-odata-activation"></a>

Procédez comme suit pour la OData connexion SAP :

## Sources ODP
<a name="sap-odata-odp-sources"></a>

Avant de pouvoir transférer des données depuis un fournisseur ODP, vous devez respecter les conditions requises suivantes :
+ Vous disposez d'une instance SAP NetWeaver AS ABAP.
+ Votre NetWeaver instance SAP contient un fournisseur ODP à partir duquel vous souhaitez transférer des données. Les fournisseurs ODP incluent :
  + SAP DataSources (code de transaction RSO2)
  + Vues SAP Core Data Services ABAP CDS
  + Systèmes SAP BW ou SAP BW/4HANA (, Object) InfoObject DataStore 
  + Réplication en temps réel de tables et de vues de base de données depuis le système source SAP via SAP Landscape Replication Server (SAP SLT)
  + Vues d’informations SAP HANA dans des sources basées sur SAP ABAP
+ Votre NetWeaver instance SAP possède le composant SAP Gateway Foundation.
+ Vous avez créé un OData service qui extrait les données de votre fournisseur ODP. Pour créer le OData service, vous utilisez le SAP Gateway Service Builder. Pour accéder à vos données ODP, Amazon AppFlow appelle ce service à l'aide de l' OData API. Pour plus d'informations, consultez la section [Génération d'un service d'extraction de données ODP OData](https://help.sap.com/docs/SAP_BPC_VERSION_BW4HANA/dd104a87ab9249968e6279e61378ff66/69b481859ef34bab9cc7d449e6fff7b6.html?version=11.0) dans la documentation SAP BW/4HANA.
+ Pour générer un OData service basé sur des sources de données ODP, SAP Gateway Foundation doit être installé localement dans votre ERP/BW stack ou dans une configuration de hub.
  + Pour vos ERP/BW applications, la pile SAP NetWeaver AS ABAP doit être 7.50 SP02 ou supérieure.
  + Pour le système de hub (SAP Gateway), le SAP NetWeaver AS ABAP du système de hub doit être 7.50 SP01 ou supérieur pour la configuration du hub distant.

## Sources non ODP
<a name="sap-odata-non-odp-sources"></a>
+ Votre version de SAP NetWeaver Stack doit être 7.40 SP02 ou supérieure.
+ Vous devez activer le service de catalogue pour la découverte de service.
  + **OData V2.0** : Le ou les services de catalogue OData V2.0 peuvent être activés dans votre SAP Gateway via une transaction `/IWFND/MAINT_SERVICE`
+ Votre OData service SAP doit prendre en charge pagination/query les options côté client telles que `$top` et`$skip`. Il doit également prendre en charge l’option de requête système `$count`.
+ Pour la OAuth version 2.0, vous devez activer la OAuth version 2.0 pour le OData service, enregistrer le OAuth client conformément à la documentation SAP et définir l'URL de redirection autorisée comme suit :
  + `https://<region>.console.aws.amazon.com/gluestudio/oauth`, en `<region>` remplaçant par la région dans laquelle AWS Glue s'exécute, par exemple : us-east-1. 
  + Vous devez activer la configuration sécurisée pour vous connecter via HTTPS.
+ Vous devez fournir l'autorisation requise à l'utilisateur dans SAP pour découvrir les services et extraire les données à l'aide des OData services SAP. Reportez-vous à la documentation de sécurité fournie par SAP.

# politiques IAM
<a name="sap-odata-configuring-iam-permissions"></a>

## Politiques contenant les opérations API pour la création et l’utilisation des connexions
<a name="sap-odata-policies-api-operations"></a>

L'exemple de politique suivant décrit les autorisations AWS IAM requises pour créer et utiliser des connexions. Si vous créez un rôle, créez une politique contenant les éléments suivants :

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListConnectionTypes",
        "glue:DescribeConnectionType",
        "glue:RefreshOAuth2Tokens",
        "glue:ListEntities",
        "glue:DescribeEntity"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:DescribeSecret",
        "secretsmanager:GetSecretValue",
        "secretsmanager:PutSecretValue"
      ],
      "Resource": "*"
    }
  ]
}
```

------

Le rôle doit accorder l’accès à toutes les ressources utilisées par la tâche, par exemple Amazon S3. Si vous ne voulez pas utiliser la méthode ci-dessus, vous pouvez également utiliser les politiques IAM gérées suivantes.
+ [AWSGlueServiceRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole)— Accorde l'accès aux ressources dont AWS Glue les différents processus ont besoin pour s'exécuter en votre nom. Ces ressources incluent AWS Glue Amazon S3, IAM, CloudWatch Logs et Amazon EC2. Si vous suivez la convention de dénomination des ressources spécifiée dans cette politique, AWS Glue les processus disposent des autorisations requises. Cette politique est généralement attachée aux rôles spécifiés lorsque vous définissez les crawlers, les tâches et les points de terminaison de développement.
+ [AWSGlueConsoleFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess)— Accorde un accès complet aux AWS Glue ressources lorsqu'une identité à laquelle la politique est attachée utilise la console AWS de gestion. Si vous suivez la convention de dénomination pour les ressources spécifiées dans la politique, les utilisateurs bénéficient des capacités totales de la console. Cette politique s'applique généralement aux utilisateurs de la AWS Glue console.
+ [SecretsManagerReadWrite](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/SecretsManagerReadWrite)— Permet read/write d'accéder à AWS Secrets Manager via la console AWS de gestion. Remarque : Cela exclut les actions IAM, alors combinez-les avec `IAMFullAccess` si une configuration de rotation est requise.

**IAM Policies/Permissions nécessaire pour configurer le VPC**

Les autorisations IAM suivantes sont requises lors de l'utilisation d'une connexion VPC pour AWS Glue créer une connexion. Pour plus de détails, consultez [Create an IAM policy for AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/create-service-policy.html).

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateNetworkInterface",
        "ec2:DeleteNetworkInterface",
        "ec2:DescribeNetworkInterfaces"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

# Connectivité/connexion VPC
<a name="sap-odata-connectivity-vpc-connection"></a>

Étapes de connexion VPC :

1. Utilisez la connexion VPC existante ou créez-en une autre en suivant la [documentation Amazon VPC](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html).

1. Assurez-vous que vous disposez d’une passerelle NAT qui achemine le trafic vers Internet.

1. Choisissez Amazon S3 Gateway comme point de terminaison d’un VPC pour créer une connexion.

1. Activez la résolution DNS et le nom d'hôte DNS pour utiliser les services DNS AWS fournis.

1. Accédez au VPC créé et ajoutez les points de terminaison nécessaires pour différents services tels que STS AWS Glue, Secret Managers.

   1. Choisissez Créer un point de terminaison.

   1. Pour Catégorie de service, sélectionnez AWS Services.

   1. Pour Nom du service, choisissez le service auquel vous vous connectez.

   1. Choisissez VPC et Activer le nom DNS.

   1. Points de terminaison de VCP requis pour la connexion VPC :

      1. [STS](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sts_vpc_endpoint_create.html)

      1. [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/vpc-interface-endpoints.html)

      1. [Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)

## Configuration du groupe de sécurité
<a name="sap-odata-security-group-configuration"></a>

Le groupe de sécurité doit autoriser le trafic vers son port d'écoute depuis le AWS Glue VPC AWS Glue pour pouvoir s'y connecter. Il est recommandé de limiter autant que possible la plage d’adresses IP source. 

AWS Glue nécessite un groupe de sécurité spécial qui autorise tout le trafic entrant à partir de lui-même. Vous pouvez créer une règle de référence circulaire qui autorise tout le trafic provenant du groupe de sécurité. Vous pouvez modifier un groupe de sécurité existant et le spécifier en tant que source.

Ouvrez la communication depuis les ports HTTPS du point de terminaison de l’URL (instance NLB ou SAP).

## Options de connectivité
<a name="sap-odata-connectivity-options"></a>
+ Connexion HTTPS avec NLB interne et externe, certificat SSL de l’autorité de certification (CA), pas de certificat SSL non auto-signé
+ Connexion HTTPS avec certificat SSL d’instance SAP de l’autorité de certification (CA), pas de certificat SSL non auto-signé

# Authentification SAP
<a name="sap-odata-authentication"></a>

Le connecteur SAP prend en charge les méthodes d’authentification PERSONNALISÉES (authentification SAP DE BASE) et OAUTH.

## Authentification personnalisée
<a name="sap-odata-custom-authentication"></a>

AWS Glue prend en charge l'authentification personnalisée (authentification de base) comme méthode d'établissement de connexions à vos systèmes SAP, permettant l'utilisation d'un nom d'utilisateur et d'un mot de passe pour un accès sécurisé. Ce type d'authentification fonctionne bien pour les scénarios d'automatisation car il permet d'utiliser le nom d'utilisateur et le mot de passe dès le départ avec les autorisations d'un utilisateur particulier dans l' OData instance SAP. AWS Glue est capable d'utiliser le nom d'utilisateur et le mot de passe pour authentifier SAP OData APIs. Dans AWS Glue, l'autorisation de base est implémentée en tant qu'autorisation personnalisée.

Pour consulter la OData documentation SAP publique sur le flux d'authentification de base, consultez la section [Authentification de base HTTP](https://help.sap.com/docs/SAP_SUCCESSFACTORS_PLATFORM/d599f15995d348a1b45ba5603e2aba9b/5c8bca0af1654b05a83193b2922dcee2.html).

## OAuth 2.0 Authentification
<a name="sap-odata-oauth-2.0-authentication"></a>

AWS Glue prend également en charge la OAuth version 2.0 en tant que mécanisme d'authentification sécurisé pour établir des connexions à vos systèmes SAP. Cela permet une intégration fluide tout en garantissant la conformité aux normes d’authentification modernes et en renforçant la sécurité de l’accès aux données.

## Type d’autorisation AUTHORIZATION\$1CODE
<a name="sap-odata-authentication-code-grant-type"></a>

Le type de subvention détermine le AWS Glue mode de communication avec SAP OData pour demander l'accès à vos données. SAP ne OData prend en charge que le type de `AUTHORIZATION_CODE` subvention. Ce type de subvention est considéré comme « à trois étapes » OAuth car il repose sur la redirection des utilisateurs vers le serveur d'autorisation tiers pour authentifier l'utilisateur. Il est utilisé lors de la création de connexions via la AWS Glue console. 

Les utilisateurs peuvent toujours choisir de créer leur propre application connectée dans SAP OData et de fournir leur propre identifiant client et leur propre secret client lors de la création de connexions via la AWS Glue console. Dans ce scénario, ils seront toujours redirigés vers SAP pour OData se connecter et autoriser AWS Glue l'accès à leurs ressources.

Ce type d’autorisation donne lieu à un jeton d’actualisation et à un jeton d’accès. Le jeton d’accès est de courte durée et peut être actualisé automatiquement sans interaction de l’utilisateur à l’aide du jeton d’actualisation.

Pour consulter OData la documentation SAP publique sur la création d'une application connectée pour le OAuth flux de code d'autorisation, voir [Authentification Using OAuth 2.0](https://help.sap.com/docs/ABAP_PLATFORM_NEW/e815bb97839a4d83be6c4fca48ee5777/2e5104fd87ff452b9acb247bd02b9f9e.html).

# AWS Secrets Manager pour stocker votre secret d'authentification
<a name="sap-odata-aws-secret-manager-auth-secret"></a>

Vous devrez stocker les secrets de OData connexion SAP dans AWS Secrets Manager, configurer les autorisations nécessaires pour les récupérer, comme indiqué dans la [politiques IAM](sap-odata-configuring-iam-permissions.md) section, et les utiliser lors de la création d'une connexion.

Utilisez la console AWS de gestion de AWS Secrets Manager pour créer un secret pour votre source SAP. Pour plus d'informations, consultez la section [Créer un secret du Gestionnaire de AWS Secrets](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html). Les informations AWS contenues dans Secrets Manager doivent inclure les éléments du code suivant. 

## Secret d’authentification personnalisé
<a name="sap-odata-custom-auth-secret"></a>

Vous devrez saisir votre nom d’utilisateur du système SAP à la place de *<your SAP username>* et son mot de passe à la place de *<your SAP username password>*, ainsi que True ou False. Dans ce contexte, la définition de `basicAuthDisableSSO` sur `true` désactive l’authentification unique (SSO) pour les demandes d’authentification de base, en exigeant des informations d’identification utilisateur explicites pour chaque demande. Inversement, sa définition sur `false` autorise l’utilisation des sessions SSO existantes si elles sont disponibles.

```
{
   "basicAuthUsername": "<your SAP username>",
   "basicAuthPassword": "<your SAP username password>",
   "basicAuthDisableSSO": "<True/False>",
   "customAuthenticationType": "CustomBasicAuth"
}
```

## OAuth 2.0 Secret
<a name="sap-odata-oauth-2.0-secret"></a>

Si vous utilisez la OAuth version 2.0 comme mécanisme d'authentification, le secret du Gestionnaire de AWS Secrets doit avoir l'**application ClientId cliente gérée par l'utilisateur** au format suivant. Vous devrez saisir votre secret client SAP à la place de <your client secret>.

```
{"USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET": "<your client secret>"
}
```

# Création de connexions
<a name="sap-odata-creating-connections"></a>

Pour configurer une OData connexion SAP :

1. Connectez-vous à la console AWS de gestion et [AWS Glue ouvrez-la](https://console.aws.amazon.com/glue). Dans le AWS Glue Studio, créez une connexion en suivant les étapes ci-dessous :

   1. Cliquez sur Connexions de données sur le panneau de gauche.

   1. Cliquez sur Créer une connexion.

   1. Sélectionnez **SAP OData** dans **Choisir une source de données**

   1. Fournissez l'**URL de l'hôte de l'application** de l' OData instance SAP à laquelle vous souhaitez vous connecter. L’URL de l’hôte de l’application doit être accessible sur l’Internet public pour une connexion non-VPC.

   1. Indiquez le **chemin du service d'application** de l' OData instance SAP à laquelle vous souhaitez vous connecter. Il s’agit du même chemin d’accès que celui du service de catalogue. Par exemple :`/sap/opu/odata/iwfnd/catalogservice;v=2`. AWS Glue n'accepte pas le chemin d'un objet spécifique.

   1. Indiquez le **numéro de client** de l' OData instance SAP à laquelle vous souhaitez vous connecter. Les valeurs acceptables sont [001-999]. Exemple : 010

   1. Indiquez le **numéro de port** de l' OData instance SAP à laquelle vous souhaitez vous connecter. Exemple : 443

   1. Indiquez la **langue d'ouverture de session** de l' OData instance SAP à laquelle vous souhaitez vous connecter. Exemple : EN

   1. Sélectionnez le rôle AWS IAM qui AWS Glue peut assumer et qui dispose des autorisations décrites dans la [politiques IAM](sap-odata-configuring-iam-permissions.md) section.

   1. Sélectionnez le **type d'authentification** que vous souhaitez utiliser pour cette connexion dans AWS Glue la liste déroulante : OAUTH2 ou PERSONNALISÉ

      1. PERSONNALISÉ : sélectionnez le secret que vous avez créé comme indiqué dans la section [AWS Secrets Manager pour stocker votre secret d'authentification](sap-odata-aws-secret-manager-auth-secret.md).

      1. OAUTH 2.0 - entrez les entrées suivantes uniquement dans le cas de OAuth 2.0 :

         1. Sous **Application client gérée par l'utilisateur ClientId**, entrez votre identifiant client.

         1. `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`(votre secret client) dans le Gestionnaire de AWS Secrets que vous avez créé dans la [AWS Secrets Manager pour stocker votre secret d'authentification](sap-odata-aws-secret-manager-auth-secret.md) section.

         1. Sous **URL du code d’autorisation**, saisissez l’URL de votre code d’autorisation.

         1. Sous **URL des jetons d’autorisation**, saisissez l’URL de votre jeton d’autorisation.

         1. Sous **OAuth Étendue**, entrez vos OAuth portées en les séparant par un espace. Exemple : `/IWFND/SG_MED_CATALOG_0002 ZAPI_SALES_ORDER_SRV_0001`

   1. Sélectionnez les options réseau si vous souhaitez utiliser votre réseau. Pour en savoir plus, consultez [Connectivité/connexion VPC](sap-odata-connectivity-vpc-connection.md).

1. Accordez au rôle IAM associé à votre AWS Glue travail l'autorisation de lire`secretName`. Pour plus de détails, consultez [politiques IAM](sap-odata-configuring-iam-permissions.md).

1. Choisissez **Tester la connexion** et testez votre connexion. Si le test de connexion réussit, cliquez sur Suivant, saisissez le nom de votre connexion et enregistrez-la. La fonctionnalité de test de connexion n’est pas disponible si vous avez sélectionné Options réseau (VPC). 

# Création d'un OData job SAP
<a name="sap-odata-creating-job"></a>

Reportez-vous à la section [Création de tâches ETL visuelles avec AWS Glue Studio](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html)

# Sources ODP (Operational Data Provisioning)
<a name="sap-odata-operational-data-provisioning-sources"></a>

L’ODP (Operational Data Provisioning) fournit une infrastructure technique que vous pouvez utiliser pour prendre en charge l’extraction et la réplication des données pour diverses applications cible et prend en charge les mécanismes Delta dans ces scénarios. Dans le cas d’une procédure Delta, les données d’une source (fournisseur ODP) sont automatiquement écrites dans une file d’attente Delta (Operational Delta Queue, ODQ) à l’aide d’un processus de mise à jour ou transmises à la file d’attente Delta à l’aide d’une interface d’extracteur. Un fournisseur ODP peut être un DataSource (extracteurs), des vues ABAP Core Data Services (vues ABAP CDS), SAP BW ou SAP BW/4HANA, un serveur SAP Landscape Transformation Replication (SLT) et des vues d'informations SAP HANA (vues de calcul). Les applications cible (appelées « abonnés » ODQ ou plus généralement « consommateurs ODP ») extraient les données de la file d’attente Delta et continuent à les traiter.

## Chargement complet
<a name="sap-odata-full-load"></a>

Dans le contexte des entités SAP OData et ODP, un **chargement complet** fait référence au processus d'extraction de toutes les données disponibles d'une entité ODP en une seule opération. Cette opération extrait l'ensemble de données complet du système source, garantissant ainsi que le système cible dispose d'une up-to-date copie complète des données de l'entité. Les chargements complets sont généralement utilisés pour les sources qui ne prennent pas en charge les chargements incrémentiels ou lorsqu’une actualisation du système cible est requise.

**Exemple**

Vous pouvez définir explicitement l'`ENABLE_CDC`indicateur sur false lors de la création du DynamicFrame. Remarque : `ENABLE_CDC` est false par défaut, si vous ne souhaitez pas initialiser la file d’attente Delta, vous n’avez pas besoin d’envoyer cet indicateur ou de le définir sur true. Le fait de ne pas définir cet indicateur sur true entraînera une extraction de chargement complet.

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "false"
    }, transformation_ctx=key)
```

## Chargement incrémentiel
<a name="sap-odata-incremental-load"></a>

Un **chargement incrémentiel** dans le contexte des entités ODP (Operational Data Provisioning) implique d’extraire uniquement les données nouvelles ou modifiées (deltas) du système source depuis la dernière extraction des données, en évitant ainsi de prétraiter les enregistrements déjà traités. Cette approche améliore considérablement l’efficacité, réduit les volumes de transfert de données, améliore les performances, garantit une synchronisation efficace entre les systèmes et minimise le temps de traitement, en particulier pour les grands jeux de données qui changent fréquemment.

# Transferts incrémentiels basés sur des jetons Delta
<a name="sap-odata-incremental-transfers"></a>

Pour activer le transfert incrémentiel à l’aide de la capture des données de modification (CDC) pour les entités compatibles ODP qui le prennent en charge, procédez comme suit :

1. Créez la tâche de transfert incrémentiel en mode script.

1. Lorsque vous créez le DataFrame or Glue DynamicFrame, vous devez passer l'option`"ENABLE_CDC": "True"`. Cette option garantit que vous recevrez un jeton Delta de la part de SAP, qui pourra être utilisé pour extraire ultérieurement les données modifiées.

Le jeton Delta sera présent dans la dernière ligne du dataframe, dans la colonne DELTA\$1TOKEN. Ce jeton peut être utilisé comme option de connecteur lors des appels suivants pour récupérer de manière incrémentielle le prochain jeu de données.

**Exemple**
+ Nous avons défini le `ENABLE_CDC` drapeau sur`true`, lors de la création du DynamicFrame. Remarque : `ENABLE_CDC` est `false` par défaut, si vous ne souhaitez pas initialiser la file d’attente Delta, vous n’avez pas besoin d’envoyer cet indicateur ou de le définir sur true. Le fait de ne pas définir cet indicateur sur true entraînera une extraction de chargement complet.

  ```
  sapodata_df = glueContext.create_dynamic_frame.from_options(
      connection_type="SAPOData",
      connection_options={
          "connectionName": "connectionName",
          "ENTITY_NAME": "entityName",
          "ENABLE_CDC": "true"
      }, transformation_ctx=key)
  
  # Extract the delta token from the last row of the DELTA_TOKEN column
  delta_token_1 = your_logic_to_extract_delta_token(sapodata_df) # e.g., D20241029164449_000370000
  ```
+ Le jeton Delta extrait peut être transmis en option pour extraire de nouveaux événements.

  ```
  sapodata_df_2 = glueContext.create_dynamic_frame.from_options(
      connection_type="SAPOData",
      connection_options={
          "connectionName": "connectionName",
          "ENTITY_NAME": "entityName",
          // passing the delta token retrieved in the last run
          "DELTA_TOKEN": delta_token_1
      } , transformation_ctx=key)
  
  # Extract the new delta token for the next run
  delta_token_2 = your_logic_to_extract_delta_token(sapodata_df_2)
  ```

Notez que le dernier enregistrement, dans lequel le `DELTA_TOKEN` est présent, n’est pas un enregistrement transactionnel provenant de la source et n’est là que dans le but de transmettre la valeur du jeton Delta.

Outre `DELTA_TOKEN`, les champs suivants sont renvoyés dans chaque ligne du dataframe. 
+ **GLUE\$1FETCH\$1SQ** : il s’agit d’un champ de séquence, généré à partir de l’horodatage EPOC dans l’ordre dans lequel l’enregistrement a été reçu, et qui est unique pour chaque enregistrement. Il peut être utilisé si vous avez besoin de connaître ou d’établir l’ordre des modifications dans le système source. Ce champ ne sera présent que pour les entités compatibles ODP.
+ **DML\$1STATUS** : cela affichera `UPDATED` pour tous les enregistrements récemment insérés et mis à jour à partir de la source, ainsi que `DELETED` pour les enregistrements supprimés de la source.

Pour plus de détails sur la façon de gérer l’état et de réutiliser le jeton Delta pour extraire les enregistrements modifiés à l’aide d’un exemple, reportez-vous à la section [Utilisation du script de gestion OData d'état SAP](sap-odata-state-management-script.md).

## Invalidation de jeton Delta
<a name="sap-odata-invalidation"></a>

Un jeton Delta est associé à la collection de services et à un utilisateur. Si un nouveau pull with initial `“ENABLE_CDC” : “true”` est lancé pour la même collection de services et pour le même utilisateur, tous les jetons delta émis à la suite d'une initialisation précédente seront invalidés par le service SAP OData . L’invocation du connecteur avec un jeton Delta expiré entraînera une exception : 

`Could not open data access via extraction API RODPS_REPL_ODP_OPEN` 

# OData Services (sources autres que le PDO)
<a name="sap-odata-non-odp-services"></a>

## Chargement complet
<a name="sap-odata-non-odp-full-load"></a>

Pour les systèmes non ODP (Operational Data Provisioning), un **chargement complet** consiste à extraire le jeu de données du système source et à le charger dans le système cible. Étant donné que les systèmes non ODP ne prennent pas en charge par nature les mécanismes avancés d’extraction de données tels que les deltas, le processus est simple, mais peut nécessiter beaucoup de ressources en fonction de la taille des données.

## Chargement incrémentiel
<a name="sap-odata-non-odp-incremental-load"></a>

Pour les systèmes ou les entités qui ne prennent pas en charge **ODP (Operational Data Provisioning)**, le transfert de données incrémentiel peut être géré manuellement en mettant en œuvre un mécanisme basé sur l’horodatage pour suivre et extraire les modifications.

**Transferts incrémentiels basés sur l’horodatage**

Pour les entités non compatibles ODP (ou pour les entités compatibles ODP qui n’utilisent pas l’indicateur ENABLE\$1CDC), nous pouvons utiliser une option `filteringExpression` dans le connecteur pour indiquer l’intervalle `datetime` pendant lequel nous voulons extraire les données. Cette méthode repose sur un champ d’horodatage dans vos données qui représente la date à laquelle chaque enregistrement a été créé/modifié pour la dernière fois.

**Exemple**

Récupération des enregistrements modifiés après 2024-01-01T 00:00:00.000

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "filteringExpression": "LastChangeDateTime >= 2024-01-01T00:00:00.000"
    }, transformation_ctx=key)
```

Remarque : Dans cet exemple, `LastChangeDateTime` est le champ qui représente la date de dernière modification de chaque enregistrement. Le nom du champ réel peut varier en fonction de votre OData entité SAP spécifique.

Pour obtenir un nouveau sous-ensemble de données lors des exécutions suivantes, vous devez mettre à jour la valeur `filteringExpression` avec un nouvel horodatage. Il s’agit généralement de la valeur d’horodatage maximale des données précédemment extraites.

**Exemple**

```
max_timestamp = get_max_timestamp(sapodata_df)  # Function to get the max timestamp from the previous run
next_filtering_expression = f"LastChangeDateTime > {max_timestamp}"

# Use this next_filtering_expression in your next run
```

Dans la section suivante, nous proposerons une approche automatisée pour gérer ces transferts incrémentiels basés sur l’horodatage, ce qui évite ainsi de devoir mettre à jour manuellement l’expression de filtrage entre les exécutions.

# Écrire à SAP OData
<a name="sap-odata-writing"></a>

 Cette section décrit comment écrire des données dans votre OData service SAP à l'aide du AWS Glue connecteur pour SAP OData. 

**Conditions préalables**
+ Accès à un OData service SAP
+ Un OData EntitySet objet SAP sur lequel vous souhaitez écrire. Vous aurez besoin du nom de l’objet.
+  OData Informations d'identification SAP valides et connexion valide
+ Autorisations appropriées telles que décrites dans [Politiques IAM](https://docs.aws.amazon.com/glue/latest/dg/sap-odata-configuring-iam-permissions.html)

Le OData connecteur SAP prend en charge deux opérations d'écriture :
+ INSERT
+ UPDATE

Lorsque vous utilisez l’opération d’écriture UPDATE, vous devez fournir l’élément ID\$1FIELD\$1NAMES afin de spécifier le champ d’ID externe pour les enregistrements.

**Exemple :**

```
sapodata_write = glueContext.write_dynamic_frame.from_options(
    frame=frameToWrite,
    connection_type="sapodata",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "WRITE_OPERATION": "INSERT"
    }
```

# Utilisation du script de gestion OData d'état SAP
<a name="sap-odata-state-management-script"></a>

Pour utiliser le script de gestion OData d'état SAP dans le cadre de votre AWS Glue travail, procédez comme suit :
+ Téléchargez le script de gestion d’état : `s3://aws-blogs-artifacts-public/artifacts/BDB-4789/sap_odata_state_management.zip ` depuis le compartiment Amazon S3 public.
+ Téléchargez le script dans un compartiment Amazon S3 auquel votre AWS Glue travail est autorisé à accéder.
+ Référencez le script dans votre AWS Glue tâche : lors de la création ou de la mise à jour de votre AWS Glue tâche, transmettez l'`'--extra-py-files'`option faisant référence au chemin du script dans votre compartiment Amazon S3. Par exemple : `--extra-py-files s3://your-bucket/path/to/sap_odata_state_management.py`
+ Importez et utilisez la bibliothèque de gestion des états dans vos scripts de AWS Glue travail.

## Exemple de transfert incrémentiel basé sur des jetons Delta
<a name="sap-odata-delta-token-incremental-transfer"></a>

Voici un exemple d’utilisation du script de gestion d’état pour les transferts incrémentiels basés sur des jetons Delta :

```
from sap_odata_state_management import StateManagerFactory, StateManagerType, StateType

# Initialize the state manager
state_manager = StateManagerFactory.create_manager(
    manager_type=StateManagerType.JOB_TAG,
    state_type=StateType.DELTA_TOKEN,
    options={
        "job_name": args['JOB_NAME'],
        "logger": logger
    }
)

# Get connector options (including delta token if available)
key = "SAPODataNode"
connector_options = state_manager.get_connector_options(key)

# Use the connector options in your Glue job
df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "true",
        **connector_options
    }
)

# Process your data here...

# Update the state after processing
state_manager.update_state(key, sapodata_df.toDF())
```

## Exemple de transfert incrémentiel basé sur l’horodatage
<a name="sap-odata-timestamp-incremental-transfer"></a>

Voici un exemple d’utilisation du script de gestion d’état pour les transferts incrémentiels basés sur des jetons Delta :

```
from sap_odata_state_management import StateManagerFactory, StateManagerType, StateType

# Initialize the state manager
state_manager = StateManagerFactory.create_manager(
    manager_type=StateManagerType.JOB_TAG,
    state_type=StateType.DELTA_TOKEN,
    options={
        "job_name": args['JOB_NAME'],
        "logger": logger
    }
)

# Get connector options (including delta token if available)
key = "SAPODataNode"
connector_options = state_manager.get_connector_options(key)

# Use the connector options in your Glue job
df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "true",
        **connector_options
    }
)

# Process your data here...

# Update the state after processing
state_manager.update_state(key, sapodata_df.toDF())
```

Dans les deux exemples, le script de gestion d’état gère les complexités liées au stockage de l’état (jeton Delta ou horodatage) entre les exécutions de tâches. Il récupère automatiquement le dernier état connu lors de l’obtention des options du connecteur et met à jour l’état après le traitement, ce qui garantit ainsi que chaque tâche exécutée ne traite que les données nouvelles ou modifiées.

# Partitionnement pour les entités non ODP
<a name="sap-odata-non-odp-entities-partitioning"></a>

Dans Apache Spark, le partitionnement fait référence à la manière dont les données sont divisées et distribuées entre les composants master d’un cluster pour un traitement parallèle. Chaque partition est un bloc logique de données qui peut être traité indépendamment par une tâche. Le partitionnement est un concept fondamental de Spark qui a un impact direct sur les performances, l'évolutivité et l'utilisation des ressources. AWS Glue les jobs utilisent le mécanisme de partitionnement de Spark pour diviser l'ensemble de données en petits morceaux (partitions) qui peuvent être traités en parallèle sur les nœuds de travail du cluster. Notez que le partitionnement n’est pas applicable aux entités ODP.

Pour plus de détails, consultez [AWS Glue Spark et PySpark jobs](https://docs.aws.amazon.com/glue/latest/dg/spark_and_pyspark.html).

**Conditions préalables**

Un objet SAP OData dont vous souhaitez lire un extrait. Vous aurez besoin du object/EntitySet nom. Par exemple : ` /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder `.

**Exemple**

```
sapodata_read = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder"
    }, transformation_ctx=key)
```

## Requêtes de partitionnement
<a name="sap-odata-partitioning-queries"></a>

### Partitionnement basé sur les champs
<a name="sap-odata-field-based-partitioning"></a>

Vous pouvez indiquer les options Spark supplémentaires `PARTITION_FIELD`, `LOWER_BOUND`, `UPPER_BOUND` et `NUM_PARTITIONS` si vous souhaitez utiliser la simultanéité dans Spark. Avec ces paramètres, la requête d’origine serait divisée en `NUM_PARTITIONS` nombres de sous-requêtes pouvant être exécutées simultanément par les tâches Spark. Les nombres entiers, les dates et DateTime les champs prennent en charge le partitionnement basé sur les champs dans le connecteur SAP. OData 
+ `PARTITION_FIELD` : le nom du champ à utiliser pour partitionner la requête.
+ `LOWER_BOUND` : une valeur limite inférieure inclusive du champ de partition choisi.

   Pour tout champ dont le type de données est DateTime, le format d'horodatage Spark utilisé dans les requêtes SQL Spark est accepté.

  Exemples de valeurs valides : `"2000-01-01T00:00:00.000Z"` 
+ `UPPER_BOUND` : une valeur limite supérieure exclusive du champ de partition choisi.
+ `NUM_PARTITIONS` : nombre de partitions.
+ `PARTITION_BY` : le type de partitionnement à effectuer, `FIELD` à transmettre en cas de partitionnement basé sur des champs.

**Exemple**

```
sapodata= glueContext.create_dynamic_frame.from_options(
    connection_type="sapodata",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "/sap/opu/odata/sap/SEPM_HCM_SCENARIO_SRV/EmployeeSet",
        "PARTITION_FIELD": "validStartDate"
        "LOWER_BOUND": "2000-01-01T00:00:00.000Z"
        "UPPER_BOUND": "2020-01-01T00:00:00.000Z"
        "NUM_PARTITIONS": "10",
        "PARTITION_BY": "FIELD"
    }, transformation_ctx=key)
```

### Partitionnement basé sur des enregistrements
<a name="sap-odata-record-based-partitioning"></a>

La requête d’origine serait divisée en `NUM_PARTITIONS` nombres de sous-requêtes qui peuvent être exécutées simultanément par les tâches Spark.

Le partitionnement basé sur les enregistrements n'est pris en charge que pour les entités non ODP, car la pagination dans les entités ODP est prise en charge par le jeton suivant. token/skip 
+ `PARTITION_BY` : le type de partitionnement à effectuer. `COUNT` doit être transmis en cas de partitionnement basé sur des enregistrements.

**Exemple**

```
sapodata= glueContext.create_dynamic_frame.from_options(
    connection_type="sapodata",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "/sap/opu/odata/sap/SEPM_HCM_SCENARIO_SRV/EmployeeSet",
        "NUM_PARTITIONS": "10",
        "PARTITION_BY": "COUNT"
    }, transformation_ctx=key)
```

# Restrictions/alertes
<a name="sap-odata-limitations"></a>
+ Les entités ODP ne sont pas compatibles avec le partitionnement basé sur les enregistrements car la pagination est gérée à l'aide d'un jeton de saut. token/delta Par conséquent, pour le partitionnement basé sur les enregistrements, la valeur par défaut de maxConcurrency est définie sur « null », quelle que soit la saisie de l’utilisateur.
+ Lorsqu’une limite et une partition sont appliquées, la limite a priorité sur la partition.

# Options de OData connexion SAP
<a name="sap-odata-connection-options"></a>

Les options de connexion pour SAP sont les OData suivantes :
+ `ENTITY_NAME`(Chaîne) - (Obligatoire) Utilisé pour la lecture. Le nom de votre objet dans SAP OData.

  Par exemple :/sap/opu/odata/sap/API\$1SALES\$1ORDER\$1SRV/A\$1 SalesOrder
+ `API_VERSION`(Chaîne) - (Facultatif) Utilisé pour la lecture. Version de l' OData API SAP Rest que vous souhaitez utiliser. Exemple : 2.0.
+ `SELECTED_FIELDS`(Liste<Chaîne>) - Par défaut : vide (SELECT \$1). Utilisé pour la lecture. Colonnes que vous souhaitez sélectionner pour l’objet.

  Exemples : SalesOrder
+ `FILTER_PREDICATE`(Chaîne) - Par défaut : vide. Utilisé pour la lecture. Doit être au format SQL Spark.

  Par exemple : `SalesOrder = "10"`
+ `QUERY`(Chaîne) - Par défaut : vide. Utilisé pour la lecture. Requête Spark SQL complète.

  Par exemple : `SELECT * FROM /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder`
+ `PARTITION_FIELD`(Chaîne) - Utilisé pour la lecture. Champ à utiliser pour partitionner la requête.

  Par exemple : `ValidStartDate`
+ `LOWER_BOUND`(Chaîne) - Utilisé pour la lecture. Une valeur limite inférieure inclusive du champ de partition choisi.

  Par exemple : `"2000-01-01T00:00:00.000Z"`
+ `UPPER_BOUND`(Chaîne) - Utilisé pour la lecture. Une valeur limite supérieure exclusive du champ de partition choisi.

  Par exemple : `"2024-01-01T00:00:00.000Z"`
+ `NUM_PARTITIONS`(Entier) - Par défaut : 1. Utilisé pour la lecture. Nombre de partitions pour la lecture.
+ `INSTANCE_URL`(Chaîne) - L’URL de l’hôte de l’application de l’instance SAP.

  Par exemple : `https://example-externaldata.sierra.aws.dev`
+ `SERVICE_PATH`(Chaîne) - Le chemin d’accès au service d’application de l’instance SAP.

  Par exemple : `/sap/opu/odata/iwfnd/catalogservice;v=2`
+ `CLIENT_NUMBER`(Chaîne) - Le numéro de client de l’application de l’instance SAP.

  Par exemple : 100
+ `PORT_NUMBER`(Chaîne) - Par défaut : le numéro de port de l’application de l’instance SAP.

  Par exemple : 443
+ `LOGON_LANGUAGE`(Chaîne) - La langue de connexion à l’application de l’instance SAP.

  Par exemple : `EN`
+ `ENABLE_CDC`(Chaîne) - Définit s’il faut exécuter une tâche avec CDC activé, c’est-à-dire avec le suivi des modifications.

  Par exemple : `True/False`
+ `DELTA_TOKEN`(Chaîne) - Exécute une extraction de données incrémentielle en fonction du jeton Delta valide fourni. 

  Par exemple : `D20241107043437_000463000`
+ `PAGE_SIZE`(Entier) - Définit la taille de page pour interroger les enregistrements. La taille de page par défaut est de 50 000. Lorsqu’une taille de page est spécifiée, SAP renvoie uniquement le nombre défini d’enregistrements par appel d’API, plutôt que le jeu de données complet. Le connecteur fournira toujours le nombre total d’enregistrements et gérera la pagination en utilisant la taille de page que vous avez indiquée. Si vous avez besoin d’une taille de page plus importante, vous pouvez choisir n’importe quelle valeur jusqu’à 500 000, qui est le maximum autorisé. Toute taille de page spécifiée supérieure à 500 000 sera ignorée. Le système utilisera plutôt la taille de page maximale autorisée. Vous pouvez spécifier le format de page dans l' AWS Glue Studio interface utilisateur en ajoutant une option de connexion `PAGE_SIZE` avec la valeur souhaitée. 

  Par exemple : `20000`

# Détails de OData l'entité et du champ SAP
<a name="sap-odata-entity-field-details"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/glue/latest/dg/sap-odata-entity-field-details.html)