

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.

# Utilisation d'une AWS AppSync API avec le AWS CDK
<a name="using-your-api"></a>

**Astuce**  
Avant d'utiliser le CDK, nous vous recommandons de consulter la [documentation officielle du CDK ainsi que la](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html) référence AWS AppSync du [CDK](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_appsync-readme.html).  
Nous vous recommandons également de vous assurer que vos installations [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) et [NPM](https://docs.npmjs.com/) fonctionnent sur votre système.

Dans cette section, nous allons créer une application CDK simple capable d'ajouter et de récupérer des éléments à partir d'une table DynamoDB. Il s'agit d'un exemple de démarrage rapide utilisant une partie du code des sections [Conception de votre schéma](https://docs.aws.amazon.com/appsync/latest/devguide/designing-your-schema.html), [Attachement d'une source de données](https://docs.aws.amazon.com/appsync/latest/devguide/attaching-a-data-source.html) et [Configuration des résolveurs (JavaScript)](https://docs.aws.amazon.com/appsync/latest/devguide/configuring-resolvers-js.html).

## Configuration d'un projet CDK
<a name="Setting-up-a-cdk-project"></a>

**Avertissement**  
Ces étapes peuvent ne pas être totalement précises en fonction de votre environnement. Nous supposons que les utilitaires nécessaires sont installés sur votre système, qu'il existe un moyen d'interfacer avec les AWS services et que les configurations appropriées sont en place.

La première étape consiste à installer le AWS CDK. Dans votre CLI, vous pouvez entrer la commande suivante :

```
npm install -g aws-cdk
```

Ensuite, vous devez créer un répertoire de projet, puis y accéder. Voici un exemple d'ensemble de commandes permettant de créer un répertoire et d'y accéder :

```
mkdir example-cdk-app
cd example-cdk-app
```

Ensuite, vous devez créer une application. Notre service utilise principalement TypeScript. Dans le répertoire de votre projet, entrez la commande suivante :

```
cdk init app --language typescript
```

Lorsque vous effectuez cette opération, une application CDK ainsi que ses fichiers d'initialisation seront installés :

![Sortie du terminal indiquant l'initialisation du dépôt Git avec des conseils de dénomination des branches principales.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-init-app-example.png)


La structure de votre projet peut ressembler à ceci :

![Arborescence de fichiers montrant le example-cdk-app projet avec bin, lib, node_modules, les dossiers de test et les fichiers de configuration.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-init-directories.png)


Vous remarquerez que nous avons plusieurs annuaires importants :
+ `bin`: Le fichier bin initial créera l'application. Nous n'aborderons pas cela dans ce guide.
+ `lib`: Le répertoire lib contient vos fichiers de pile. Vous pouvez considérer les fichiers de pile comme des unités d'exécution individuelles. Les constructions se trouveront dans nos fichiers de pile. Il s'agit essentiellement de ressources pour un service qui sera intégré CloudFormation lors du déploiement de l'application. C'est là que se déroulera la majeure partie de notre codage.
+ `node_modules`: Ce répertoire est créé par NPM et contient toutes les dépendances du package que vous avez installées à l'aide de la `npm` commande.

Notre fichier de pile initial peut contenir quelque chose comme ceci :

```
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// import * as sqs from 'aws-cdk-lib/aws-sqs';

export class ExampleCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

    // example resource
    // const queue = new sqs.Queue(this, 'ExampleCdkAppQueue', {
    //   visibilityTimeout: cdk.Duration.seconds(300)
    // });
  }
}
```

Il s'agit du code standard pour créer une pile dans notre application. Dans cet exemple, la majeure partie de notre code entrera dans le champ d'application de cette classe.

Pour vérifier que votre fichier de pile se trouve bien dans l'application, dans le répertoire de votre application, exécutez la commande suivante dans le terminal :

```
cdk ls
```

Une liste de vos piles devrait apparaître. Si ce n'est pas le cas, vous devrez peut-être recommencer les étapes ou consulter la documentation officielle pour obtenir de l'aide.

Si vous souhaitez créer vos modifications de code avant le déploiement, vous pouvez toujours exécuter la commande suivante dans le terminal :

```
npm run build
```

Et pour voir les modifications avant le déploiement :

```
cdk diff
```

Avant d'ajouter notre code au fichier de pile, nous allons effectuer un bootstrap. Le bootstrapping nous permet de fournir des ressources pour le CDK avant le déploiement de l'application. Vous trouverez plus d'informations sur ce processus [ici](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html). Pour créer un bootstrap, la commande est la suivante :

```
cdk bootstrap aws://ACCOUNT-NUMBER/REGION
```

**Astuce**  
Cette étape nécessite plusieurs autorisations IAM sur votre compte. Votre bootstrap sera refusé si vous ne les avez pas. Dans ce cas, vous devrez peut-être supprimer les ressources incomplètes causées par le bootstrap, telles que le compartiment S3 qu'il génère.

Bootstrap lancera plusieurs ressources. Le message final ressemblera à ceci :

![Sortie du terminal affichant le message Environment bootstrap après la création de l'ensemble de CloudFormation modifications.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-init-bootstrap-final.png)


Cela se fait une fois par compte et par région, vous n'aurez donc pas à le faire souvent. Les principales ressources du bootstrap sont la CloudFormation pile et le compartiment Amazon S3.

Le compartiment Amazon S3 est utilisé pour stocker les fichiers et les rôles IAM qui accordent les autorisations nécessaires pour effectuer des déploiements. Les ressources requises sont définies dans une CloudFormation pile, appelée pile bootstrap, qui est généralement nommée`CDKToolkit`. Comme toute CloudFormation pile, elle apparaît dans la CloudFormation console une fois déployée :

![CloudFormation console affichant la CDKToolkit pile avec le statut CREATE_COMPLETE.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-init-bootstrap-cfn-console.png)


Il en va de même pour le bucket :

![Ligne de compartiment S3 indiquant le nom, la région de l'ouest de l'Oregon aux États-Unis, l'accès privé et la date de création.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-init-bootstrap-bucket-console.png)


Pour importer les services dont nous avons besoin dans notre fichier de pile, nous pouvons utiliser la commande suivante :

```
npm install aws-cdk-lib # V2 command
```

**Astuce**  
Si vous rencontrez des problèmes avec la V2, vous pouvez installer les bibliothèques individuelles à l'aide des commandes V1 :  

```
npm install @aws-cdk/aws-appsync @aws-cdk/aws-dynamodb
```
Nous ne le recommandons pas car la V1 est obsolète.

## Implémentation d'un projet CDK - Schéma
<a name="implementing-a-cdk-project-schema"></a>

Nous pouvons maintenant commencer à implémenter notre code. Nous devons d'abord créer notre schéma. Vous pouvez simplement créer un `.graphql` fichier dans votre application :

```
mkdir schema
touch schema.graphql
```

Dans notre exemple, nous avons inclus un répertoire de premier niveau appelé `schema` contenant : `schema.graphql`

![Arborescence de fichiers montrant le dossier de schéma développé avec le fichier schema.graphql surligné.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-schema-directory.png)


Dans notre schéma, incluons un exemple simple :

```
input CreatePostInput {
    title: String
    content: String
}

type Post {
    id: ID!
    title: String
    content: String
}

type Mutation {
    createPost(input: CreatePostInput!): Post
}

type Query {
    getPost: [Post]
}
```

De retour dans notre fichier de pile, nous devons nous assurer que les directives d'importation suivantes sont définies :

```
import * as cdk from 'aws-cdk-lib';
import * as appsync from 'aws-cdk-lib/aws-appsync';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import { Construct } from 'constructs';
```

Dans la classe, nous allons ajouter du code pour créer notre API GraphQL et le connecter à notre `schema.graphql` fichier :

```
export class ExampleCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    
    // makes a GraphQL API
    const api = new appsync.GraphqlApi(this, 'post-apis', {
      name: 'api-to-process-posts',
      schema: appsync.SchemaFile.fromAsset('schema/schema.graphql'),
    });
  }
}
```

Nous ajouterons également du code pour imprimer l'URL, la clé d'API et la région de GraphQL :

```
export class ExampleCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    
    // Makes a GraphQL API construct
    const api = new appsync.GraphqlApi(this, 'post-apis', {
      name: 'api-to-process-posts',
      schema: appsync.SchemaFile.fromAsset('schema/schema.graphql'),
    });

    // Prints out URL
    new cdk.CfnOutput(this, "GraphQLAPIURL", {
      value: api.graphqlUrl
    });

    // Prints out the AppSync GraphQL API key to the terminal
    new cdk.CfnOutput(this, "GraphQLAPIKey", {
      value: api.apiKey || ''
    });

    // Prints out the stack region to the terminal
    new cdk.CfnOutput(this, "Stack Region", {
      value: this.region
    });
  }
}
```

À ce stade, nous allons à nouveau utiliser Deploy notre application :

```
cdk deploy
```

Voici le résultat :

![CDK sortie de déploiement indiquant la clé d'API GraphQL, l'URL, la région de pile et les détails de l'ARN.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-schema.png)


Il semble que notre exemple soit réussi, mais vérifions la AWS AppSync console juste pour confirmer :

![Navigation dans la console affichée api-to-process-posts avec l'option GraphQL et API_KEY affichée.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-schema-result-1.png)


Il semblerait que notre API ait été créée. Nous allons maintenant vérifier le schéma attaché à l'API :

![Schéma GraphQL affichant les définitions du type de publication CreatePostInput, de la mutation et de la requête.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-schema-result-2.png)


Cela semble correspondre à notre code de schéma, c'est donc un succès. Une autre façon de le confirmer du point de vue des métadonnées consiste à examiner la CloudFormation pile :

![CloudFormation liste de piles ExampleCdkAppStack affichant le statut UPDATE_COMPLETE et le statut CDKToolkit CREATE_COMPLETE.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-schema-result-3.png)


Lorsque nous déployons notre application CDK, elle génère CloudFormation des ressources telles que le bootstrap. Chaque pile de notre application correspond à une CloudFormation pile à l'échelle 1:1. Si vous revenez au code de la pile, le nom de la pile a été extrait du nom de la classe`ExampleCdkAppStack`. Vous pouvez voir les ressources qu'il a créées, qui correspondent également à nos conventions de dénomination, dans notre structure d'API GraphQL :

![Vue en arborescence réduite montrant les post-api avec les CDKMetadata éléments DefaultApiKey Schema et et.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-schema-result-4.png)


## Implémentation d'un projet CDK - Source de données
<a name="implementing-a-cdk-project-data-source"></a>

Ensuite, nous devons ajouter notre source de données. Notre exemple utilisera une table DynamoDB. Dans la classe stack, nous allons ajouter du code pour créer une nouvelle table :

```
export class ExampleCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Makes a GraphQL API construct
    const api = new appsync.GraphqlApi(this, 'post-apis', {
      name: 'api-to-process-posts',
      schema: appsync.SchemaFile.fromAsset('schema/schema.graphql'),
    });

    //creates a DDB table
    const add_ddb_table = new dynamodb.Table(this, 'posts-table', {
      partitionKey: {
        name: 'id',
        type: dynamodb.AttributeType.STRING,
      },
    });

    // Prints out URL
    new cdk.CfnOutput(this, "GraphQLAPIURL", {
      value: api.graphqlUrl
    });

    // Prints out the AppSync GraphQL API key to the terminal
    new cdk.CfnOutput(this, "GraphQLAPIKey", {
      value: api.apiKey || ''
    });

    // Prints out the stack region to the terminal
    new cdk.CfnOutput(this, "Stack Region", {
      value: this.region
    });
  }
}
```

À ce stade, déployons à nouveau :

```
cdk deploy
```

Nous devrions vérifier la console DynamoDB pour trouver notre nouvelle table :

![DynamoDB ligne de tableau indiquant ExampleCdkAppStack -postable avec le statut actif et la classe Standard.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-ddb-result-1.png)


Le nom de notre pile est correct et le nom de la table correspond à notre code. Si nous vérifions à nouveau notre CloudFormation pile, nous verrons maintenant le nouveau tableau :

![Hiérarchie des identifiants logiques indiquant post-apis, posts-table, poststablec6b5a2e6 et. CDKMetadata](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-ddb-result-2.png)


## Implémentation d'un projet CDK - Resolver
<a name="implementing-a-cdk-project-resolver"></a>

Cet exemple utilisera deux résolveurs : l'un pour interroger la table et l'autre pour y ajouter des éléments. Puisque nous utilisons des résolveurs de pipeline, nous devrons déclarer deux résolveurs de pipeline avec une fonction dans chacun. Dans la requête, nous allons ajouter le code suivant :

```
export class ExampleCdkAppStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Makes a GraphQL API construct
    const api = new appsync.GraphqlApi(this, 'post-apis', {
      name: 'api-to-process-posts',
      schema: appsync.SchemaFile.fromAsset('schema/schema.graphql'),
    });

    //creates a DDB table
    const add_ddb_table = new dynamodb.Table(this, 'posts-table', {
      partitionKey: {
        name: 'id',
        type: dynamodb.AttributeType.STRING,
      },
    });

    // Creates a function for query
    const add_func = new appsync.AppsyncFunction(this, 'func-get-post', {
      name: 'get_posts_func_1',
      api,
      dataSource: api.addDynamoDbDataSource('table-for-posts', add_ddb_table),
      code: appsync.Code.fromInline(`
          export function request(ctx) {
          return { operation: 'Scan' };
          }

          export function response(ctx) {
          return ctx.result.items;
          }
  `),
      runtime: appsync.FunctionRuntime.JS_1_0_0,
    });

    // Creates a function for mutation
    const add_func_2 = new appsync.AppsyncFunction(this, 'func-add-post', {
      name: 'add_posts_func_1',
      api,
      dataSource: api.addDynamoDbDataSource('table-for-posts-2', add_ddb_table),
      code: appsync.Code.fromInline(`
          export function request(ctx) {
            return {
            operation: 'PutItem',
            key: util.dynamodb.toMapValues({id: util.autoId()}),
            attributeValues: util.dynamodb.toMapValues(ctx.args.input),
            };
          }

          export function response(ctx) {
            return ctx.result;
          }
      `),
      runtime: appsync.FunctionRuntime.JS_1_0_0,
    });

    // Adds a pipeline resolver with the get function
    new appsync.Resolver(this, 'pipeline-resolver-get-posts', {
      api,
      typeName: 'Query',
      fieldName: 'getPost',
      code: appsync.Code.fromInline(`
          export function request(ctx) {
          return {};
          }

          export function response(ctx) {
          return ctx.prev.result;
          }
  `),
      runtime: appsync.FunctionRuntime.JS_1_0_0,
      pipelineConfig: [add_func],
    });

    // Adds a pipeline resolver with the create function
    new appsync.Resolver(this, 'pipeline-resolver-create-posts', {
      api,
      typeName: 'Mutation',
      fieldName: 'createPost',
      code: appsync.Code.fromInline(`
          export function request(ctx) {
          return {};
          }

          export function response(ctx) {
          return ctx.prev.result;
          }
  `),
      runtime: appsync.FunctionRuntime.JS_1_0_0,
      pipelineConfig: [add_func_2],
    });

    // Prints out URL
    new cdk.CfnOutput(this, "GraphQLAPIURL", {
      value: api.graphqlUrl
    });

    // Prints out the AppSync GraphQL API key to the terminal
    new cdk.CfnOutput(this, "GraphQLAPIKey", {
      value: api.apiKey || ''
    });

    // Prints out the stack region to the terminal
    new cdk.CfnOutput(this, "Stack Region", {
      value: this.region
    });
  }
}
```

Dans cet extrait, nous avons ajouté un résolveur de pipeline appelé auquel est `func-add-post` attachée `pipeline-resolver-create-posts` une fonction appelée. Il s'agit du code qui sera ajouté `Posts` au tableau. L'autre résolveur de pipeline a été appelé `pipeline-resolver-get-posts` avec une fonction appelée `func-get-post` qui récupère les éléments `Posts` ajoutés à la table.

Nous allons le déployer pour l'ajouter au AWS AppSync service :

```
cdk deploy
```

Examinons la AWS AppSync console pour voir s'ils étaient attachés à notre API GraphQL :

![Champs de mutation et de requête indiquant les résolveurs CreatePost et GetPost liés à Pipeline.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-1.png)


Cela semble correct. Dans le code, ces deux résolveurs étaient attachés à l'API GraphQL que nous avons créée (indiquée par la valeur props présente à `api` la fois dans les résolveurs et dans les fonctions). Dans l'API GraphQL, les champs auxquels nous avons attaché nos résolveurs étaient également spécifiés dans les accessoires (définis par les `fieldname` accessoires `typename` et de chaque résolveur).

Voyons si le contenu des résolveurs est correct, en commençant par : `pipeline-resolver-get-posts`

![Code de résolution montrant les fonctions de demande et de réponse avec une flèche pointant vers la fonction de réponse.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-2.png)


Les gestionnaires avant et après correspondent à la valeur de nos `code` accessoires. Nous pouvons également voir qu'une fonction est appelée`add_posts_func_1`, ce qui correspond au nom de la fonction que nous avons attachée dans le résolveur.

Regardons le contenu du code de cette fonction :

![Extrait de code montrant les fonctions de demande et de réponse avec les valeurs d'opération, de clé et d'attribut.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-3.png)


Cela correspond aux `code` accessoires de la `add_posts_func_1` fonction. Notre requête a été chargée avec succès, alors vérifions-la :

![Code du résolveur montrant la fonction de réponse avec une flèche pointant vers la fonction get_posts_func_1 ci-dessous.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-4.png)


Ils correspondent également au code. Si nous examinons `get_posts_func_1` :

![Code de fonction indiquant la fonction de demande renvoyant l'opération Scan et la fonction de réponse renvoyant ctx.result.items.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-5.png)


Tout semble être en place. Pour confirmer cela du point de vue des métadonnées, nous pouvons CloudFormation réexaminer notre pile :

![Liste des éléments logiques, IDs y compris les post-apis, les posts-table, les fonctions, les résolveurs de pipeline et. CDKMetadata](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-deploy-resolver-result-6.png)


Maintenant, nous devons tester ce code en effectuant quelques requêtes.

## Mise en œuvre d'un projet CDK - Demandes
<a name="implementing-a-cdk-project-requests"></a>

Pour tester notre application dans la AWS AppSync console, nous avons effectué une requête et une mutation :

![Code GraphQL affiché avec les champs MyQuery GetPost et MyMutation avec l'opération CreatePost.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-request-1.png)


`MyMutation`contient une `createPost` opération avec les arguments `1970-01-01T12:30:00.000Z` et`first post`. Il renvoie le `date` et `title` que nous avons transmis ainsi que la `id` valeur générée automatiquement. L'exécution de la mutation donne le résultat suivant :

```
{
  "data": {
    "createPost": {
      "date": "1970-01-01T12:30:00.000Z",
      "id": "4dc1c2dd-0aa3-4055-9eca-7c140062ada2",
      "title": "first post"
    }
  }
}
```

Si nous vérifions rapidement la table DynamoDB, nous pouvons voir notre entrée dans la table lorsque nous la scannons :

![DynamoDB entrée de table indiquant l'identifiant, la date du 01/01/1970 et le titre du premier message.](http://docs.aws.amazon.com/fr_fr/appsync/latest/devguide/images/cdk-code-request-2.png)


De retour dans la AWS AppSync console, si nous exécutons la requête pour le récupérer`Post`, nous obtenons le résultat suivant :

```
{
  "data": {
    "getPost": [
      {
        "id": "9f62c4dd-49d5-48d5-b835-143284c72fe0",
        "date": "1970-01-01T12:30:00.000Z",
        "title": "first post"
      }
    ]
  }
}
```