

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.

# AWS::Serverless::GraphQLApi
<a name="sam-resource-graphqlapi"></a>

Utilisez le type de `AWS::Serverless::GraphQLApi` ressource AWS Serverless Application Model (AWS SAM) pour créer et configurer une AWS AppSync GraphQL API pour votre application sans serveur.

Pour en savoir plus AWS AppSync, voir [Qu'est-ce que c'est AWS AppSync ?](https://docs.aws.amazon.com/appsync/latest/devguide/what-is-appsync.html) dans le *Guide AWS AppSync du développeur*.

## Syntaxe
<a name="sam-resource-graphqlapi-syntax"></a>

### YAML
<a name="sam-resource-graphqlapi-syntax-yaml"></a>

```
LogicalId:
  Type: AWS::Serverless::GraphQLApi
  Properties:
    ApiKeys: ApiKeys
    Auth: Auth
    Cache: [AWS::AppSync::ApiCache](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apicache.html)
    DataSources: DataSource
    DomainName: [AWS::AppSync::DomainName](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html)
    Functions: Function
    Logging: [LogConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-logconfig.html)
    Name: String
    Resolvers: Resolver
    SchemaInline: String
    SchemaUri: String
    Tags:
    - [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html)
    XrayEnabled: Boolean
```

## Propriétés
<a name="sam-resource-graphqlapi-properties"></a>

`ApiKeys`  <a name="sam-graphqlapi-apikeys"></a>
Créez une clé unique qui peut être utilisée pour effectuer des opérations GraphQL nécessitant une clé d'API.  
*Type :* [ApiKeys](sam-property-graphqlapi-apikeys.md)  
*Obligatoire* : non  
*CloudFormation compatibilité* : cette propriété est unique AWS SAM et n'a pas d' CloudFormation équivalent.

`Auth`  <a name="sam-graphqlapi-auth"></a>
Configurez l'authentification pour votre API GraphQL.  
*Type* : [Authentification](sam-property-graphqlapi-auth.md)  
*Obligatoire* : oui  
*CloudFormation compatibilité* : cette propriété est unique AWS SAM et n'a pas d' CloudFormation équivalent.

`Cache`  <a name="sam-graphqlapi-cache"></a>
Entrée d'une opération `CreateApiCache`.  
*Type :* [AWS::AppSync::ApiCache](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apicache.html)  
*Obligatoire* : non  
*CloudFormation compatibilité* : cette propriété est transmise directement à la [AWS::AppSync::ApiCache](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-apicache.html)ressource.

`DataSources`  <a name="sam-graphqlapi-datasources"></a>
Créez des sources de données auxquelles les fonctions AWS AppSync peuvent se connecter. AWS SAM prend en charge Amazon DynamoDB et les sources de données AWS Lambda .  
*Type :* [DataSource](sam-property-graphqlapi-datasource.md)  
*Obligatoire* : oui  
*CloudFormation compatibilité* : cette propriété est unique AWS SAM et n'a pas d' CloudFormation équivalent.

`DomainName`  <a name="sam-graphqlapi-domainname"></a>
Nom de domaine personnalisé pour votre API GraphQL.  
*Type :* [AWS::AppSync::DomainName](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html)  
*Obligatoire* : non  
*CloudFormation compatibilité* : cette propriété est transmise directement à la [AWS::AppSync::DomainName](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html)ressource. AWS SAM génère automatiquement la [AWS::AppSync::DomainNameApiAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainnameapiassociation.html)ressource.

`Functions`  <a name="sam-graphqlapi-functions"></a>
Configurez les fonctions GraphQL APIs pour effectuer certaines opérations.  
*Type* : [Fonction](sam-property-graphqlapi-function.md)  
*Obligatoire* : oui  
*CloudFormation compatibilité* : cette propriété est unique AWS SAM et n'a pas d' CloudFormation équivalent.

`Logging`  <a name="sam-graphqlapi-logging"></a>
Configure la CloudWatch journalisation Amazon pour votre GraphQL API.  
Si vous ne spécifiez pas cette propriété, AWS SAM générera `CloudWatchLogsRoleArn` et définira les valeurs suivantes :  
+ `ExcludeVerboseContent: true`
+ `FieldLogLevel: ALL`
Pour désactiver la journalisation, spécifiez les informations suivantes :  

```
Logging: false
```
*Type :* [LogConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-logconfig.html)  
*Obligatoire* : non  
*CloudFormation compatibilité* : cette propriété est transmise directement à la `[LogConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-logconfig)` propriété d'une `AWS::AppSync::GraphQLApi` ressource.

`LogicalId`  <a name="sam-graphqlapi-logicalid"></a>
Le nom unique de votre API GraphQL.  
*Type* : chaîne  
*Obligatoire* : oui  
*CloudFormation compatibilité* : cette propriété est transmise directement à la `[Name](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-name)` propriété d'une `AWS::AppSync::GraphQLApi` ressource.

`Name`  <a name="sam-graphqlapi-name"></a>
Nom de votre API GraphQL. Spécifiez cette propriété pour remplacer la valeur `LogicalId`.  
*Type* : chaîne  
*Obligatoire* : non  
*CloudFormation compatibilité* : cette propriété est transmise directement à la `[Name](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-name)` propriété d'une `AWS::AppSync::GraphQLApi` ressource.

`Resolvers`  <a name="sam-graphqlapi-resolvers"></a>
Configurez des résolveurs pour les champs de votre API GraphQL. AWS SAM  prend en charge les [résolveurs de pipelines JavaScript](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-overview-js.html#anatomy-of-a-pipeline-resolver-js).  
*Type* : [Résolveur](sam-property-graphqlapi-resolver.md)  
*Obligatoire* : oui  
*CloudFormation compatibilité* : cette propriété est unique AWS SAM et n'a pas d' CloudFormation équivalent.

`SchemaInline`  <a name="sam-graphqlapi-schemainline"></a>
Représentation texte d'un schéma GraphQL au format SDL.  
*Type* : chaîne  
*Obligatoire :* selon les conditions. Vous devez spécifier `SchemaInline` ou `SchemaUri`.  
*CloudFormation compatibilité* : cette propriété est transmise directement à la `[Definition](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlschema.html#cfn-appsync-graphqlschema-definition)` propriété d'une `AWS::AppSync::GraphQLSchema` ressource.

`SchemaUri`  <a name="sam-graphqlapi-schemauri"></a>
L'URI du compartiment Amazon Simple Storage Service (Amazon S3) du schéma ou le chemin d'accès à un dossier local.  
Si vous spécifiez un chemin d'accès à un dossier local, le fichier CloudFormation doit d'abord être chargé sur Amazon S3 avant le déploiement. Vous pouvez utiliser la CLI  AWS SAM pour faciliter ce processus. Pour de plus amples informations, veuillez consulter [Comment AWS SAM télécharge les fichiers locaux lors du déploiement](deploy-upload-local-files.md).  
*Type* : chaîne  
*Obligatoire :* selon les conditions. Vous devez spécifier `SchemaInline` ou `SchemaUri`.  
*CloudFormation compatibilité* : cette propriété est transmise directement à la `[DefinitionS3Location](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlschema.html#cfn-appsync-graphqlschema-definitions3location)` propriété d'une `AWS::AppSync::GraphQLSchema` ressource.

`Tags`  <a name="sam-graphqlapi-tags"></a>
Balises (paires clé-valeur) pour cette API GraphQL. Utilisez les balises pour identifier et classer les ressources.  
*Type :* liste des éléments [Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html)  
*Obligatoire* : non  
*CloudFormation compatibilité* : cette propriété est transmise directement à la `[Tag](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-tags)` propriété d'une `AWS::AppSync::GraphQLApi` ressource.

`XrayEnabled`  <a name="sam-graphqlapi-xrayenabled"></a>
Indiquez si vous souhaitez utiliser [le traçage aux rayons X AWS](https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html) pour cette ressource.  
*Type* : valeur booléenne  
*Obligatoire* : non  
*CloudFormation compatibilité* : cette propriété est transmise directement à la `[XrayEnabled](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-xrayenabled)` propriété d'une `AWS::AppSync::GraphQLApi` ressource.

## Valeurs renvoyées
<a name="sam-resource-graphqlapi-return-values"></a>

Pour obtenir la liste des valeurs renvoyées, reportez-vous [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#aws-resource-appsync-graphqlapi-return-values.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#aws-resource-appsync-graphqlapi-return-values.html)au [Guide de l'CloudFormation utilisateur](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html).

## Exemples
<a name="sam-resource-graphqlapi-examples"></a>

### GraphQL API avec source de données DynamoDB
<a name="sam-resource-graphqlapi-examples-example1"></a>

Dans cet exemple, nous créons une API GraphQL qui utilise une table DynamoDB comme source de données.

**schema.graphql**

```
schema {
  query: Query
  mutation: Mutation
}

type Query {
  getPost(id: String!): Post
}

type Mutation {
  addPost(author: String!, title: String!, content: String!): Post!
}

type Post {
  id: String!
  author: String
  title: String
  content: String
  ups: Int!
  downs: Int!
  version: Int!
}
```

**template.yaml**

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
...
Resources:
  DynamoDBPostsTable:
    Type: AWS::Serverless::SimpleTable

  MyGraphQLAPI:
    Type: AWS::Serverless::GraphQLApi
    Properties:
      SchemaUri: ./sam_graphql_api/schema.graphql
      Auth:
        Type: AWS_IAM
      DataSources:
        DynamoDb:
          PostsDataSource:
            TableName: !Ref DynamoDBPostsTable
            TableArn: !GetAtt DynamoDBPostsTable.Arn
      Functions:
        preprocessPostItem:
          Runtime:
            Name: APPSYNC_JS
            Version: 1.0.0
          DataSource: NONE
          CodeUri: ./sam_graphql_api/preprocessPostItem.js
        createPostItem:
          Runtime:
            Name: APPSYNC_JS
            Version: "1.0.0"
          DataSource: PostsDataSource
          CodeUri: ./sam_graphql_api/createPostItem.js
        getPostFromTable:
          Runtime:
            Name: APPSYNC_JS
            Version: "1.0.0"
          DataSource: PostsDataSource
          CodeUri: ./sam_graphql_api/getPostFromTable.js
      Resolvers:
        Mutation:
          addPost:
            Runtime:
              Name: APPSYNC_JS
              Version: "1.0.0"
            Pipeline:
            - preprocessPostItem
            - createPostItem
        Query:
          getPost:
            CodeUri: ./sam_graphql_api/getPost.js
            Runtime:
              Name: APPSYNC_JS
              Version: "1.0.0"
            Pipeline:
            - getPostFromTable
```

**createPostItem.js**

```
import { util } from "@aws-appsync/utils";

export function request(ctx) {
  const { key, values } = ctx.prev.result;
  return {
    operation: "PutItem",
    key: util.dynamodb.toMapValues(key),
    attributeValues: util.dynamodb.toMapValues(values),
  };
}

export function response(ctx) {
  return ctx.result;
}
```

**getPostFromTable.js**

```
import { util } from "@aws-appsync/utils";

export function request(ctx) {
  return dynamoDBGetItemRequest({ id: ctx.args.id });
}

export function response(ctx) {
  return ctx.result;
}

/**
 * A helper function to get a DynamoDB item
 */
function dynamoDBGetItemRequest(key) {
  return {
    operation: "GetItem",
    key: util.dynamodb.toMapValues(key),
  };
}
```

**preprocessPostItem.js**

```
import { util } from "@aws-appsync/utils";

export function request(ctx) {
  const id = util.autoId();
  const { ...values } = ctx.args;
  values.ups = 1;
  values.downs = 0;
  values.version = 1;
  return { payload: { key: { id }, values: values } };
}

export function response(ctx) {
  return ctx.result;
}
```

Voici notre code de résolution :

**getPost.js**

```
export function request(ctx) {
  return {};
}

export function response(ctx) {
  return ctx.prev.result;
}
```

### API GraphQL avec une fonction Lambda comme source de données
<a name="sam-resource-graphqlapi-examples-example2"></a>

Dans cet exemple, nous créons une API GraphQL qui utilise une fonction Lambda comme source de données.

**template.yaml**

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
...
Resources:
  MyLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs20.x
      CodeUri: ./lambda

  MyGraphQLAPI:
    Type: AWS::Serverless::GraphQLApi
    Properties:
      Name: MyApi
      SchemaUri: ./gql/schema.gql
      Auth:
        Type: API_KEY
      ApiKeys:
        MyApiKey:
          Description: my api key
      DataSources:
        Lambda:
          MyLambdaDataSource:
            FunctionArn: !GetAtt MyLambdaFunction.Arn
      Functions:
        lambdaInvoker:
          Runtime:
            Name: APPSYNC_JS
            Version: 1.0.0
          DataSource: MyLambdaDataSource
          CodeUri: ./gql/invoker.js
      Resolvers:
        Mutation:
          addPost:
            Runtime:
              Name: APPSYNC_JS
              Version: 1.0.0
            Pipeline:
            - lambdaInvoker
        Query:
          getPost:
            Runtime:
              Name: APPSYNC_JS
              Version: 1.0.0
            Pipeline:
            - lambdaInvoker

Outputs:
  MyGraphQLAPI:
    Description: AppSync API
    Value: !GetAtt MyGraphQLAPI.GraphQLUrl
  MyGraphQLAPIMyApiKey:
    Description: API Key for authentication
    Value: !GetAtt MyGraphQLAPIMyApiKey.ApiKey
```

**schema.graphql**

```
schema {
  query: Query
  mutation: Mutation
}
type Query {
  getPost(id: ID!): Post
}
type Mutation {
  addPost(id: ID!, author: String!, title: String, content: String): Post!
}
type Post {
  id: ID!
  author: String!
  title: String
  content: String
  ups: Int
  downs: Int
}
```

Voici nos fonctions :

**lambda/index.js**

```
exports.handler = async (event) => {
  console.log("Received event {}", JSON.stringify(event, 3));

  const posts = {
    1: {
      id: "1",
      title: "First book",
      author: "Author1",
      content: "Book 1 has this content",
      ups: "100",
      downs: "10",
    },
  };

  console.log("Got an Invoke Request.");
  let result;
  switch (event.field) {
    case "getPost":
      return posts[event.arguments.id];
    case "addPost":
      // return the arguments back
      return event.arguments;
    default:
      throw new Error("Unknown field, unable to resolve " + event.field);
  }
};
```

**invoker.js**

```
import { util } from "@aws-appsync/utils";

export function request(ctx) {
  const { source, args } = ctx;
  return {
    operation: "Invoke",
    payload: { field: ctx.info.fieldName, arguments: args, source },
  };
}

export function response(ctx) {
  return ctx.result;
}
```