

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Uso de variables de entorno en AWS AppSync
<a name="environment-variables"></a>

Puede usar variables de entorno para ajustar el comportamiento de sus solucionadores y funciones sin actualizar el código. Las variables de entorno son pares de cadenas almacenadas con la configuración de la API y que se ponen a disposición de los solucionadores y las funciones para que las aprovechen en tiempo de ejecución. Son especialmente útiles en situaciones en las que deba hacer referencia a datos de configuración que solo estén disponibles durante la configuración inicial, pero que sus solucionadores y funciones deban utilizar durante la ejecución. Las variables de entorno exponen los datos de configuración del código, lo que reduce la necesidad de codificar esos valores de forma rígida.

**nota**  
Para aumentar la seguridad de la base de datos, se recomienda utilizar [Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) o el [Almacén de parámetros de AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) en lugar de variables de entorno para almacenar las credenciales o información confidencial. Para aprovechar esta característica, consulte [Invocación de servicios de AWS con orígenes de datos HTTP de AWS AppSync](https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-http-resolvers-js.html#invoking-aws-services-js).

Las variables de entorno deben seguir varios comportamientos y reglas para funcionar correctamente:
+ Tanto los solucionadores o funciones de JavaScript como las plantillas VTL admiten variables de entorno.
+ Las variables de entorno no se evalúan antes de la invocación de la función.
+ Las variables de entorno **solo** admiten valores de cadena.
+ Cualquier valor definido en una variable de entorno se considera una cadena literal y no expandida.
+ Lo ideal es realizar evaluaciones de variables en el código de función.

## Configuración de variables de entorno (consola)
<a name="configuring-environment-variables-console"></a>

Puede configurar variables de entorno para la API de AWS AppSync GraphQL; para ello, cree la variable y defina su par clave-valor. Sus solucionadores y sus funciones utilizarán el nombre clave de la variable de entorno para recuperar el valor en tiempo de ejecución. Para establecer variables de entorno en la consola de AWS AppSync: 

1. Inicie sesión en la Consola de administración de AWS y abra la [consola de AppSync](https://console.aws.amazon.com/appsync/).

1. En la página **API**, elija el nombre de una API de GraphQL.

1. En el panel de navegación de la página de inicio de la API de, elija **Ajustes**.

1. En **Variables de entorno**, elija **Agregar variables de entorno**.

1. Elija **Add environment variable** (Añadir variable de entorno).

1. Introduzca una clave y un valor.

1. Si es necesario, repita los pasos 5 y 6 para agregar más valores clave. Si necesita eliminar un valor clave, seleccione la opción **Eliminar** y las claves que desee eliminar.

1. Elija **Enviar**.

**sugerencia**  
Hay algunas reglas que debe seguir al crear claves y valores:  
Las claves deben comenzar por una letra.
Las claves deben tener dos caracteres como mínimo. 
Las claves solo pueden contener letras, números y guiones bajos (\$1). 
Los valores pueden tener hasta 512 caracteres.
En una API de GraphQL se pueden configurar hasta 50 pares clave-valor. 

## Configuración de variables de entorno (API)
<a name="configuring-environment-variables-api"></a>

Para configurar una variable de entorno mediante API, puede usar `PutGraphqlApiEnvironmentVariables`. El comando de la CLI correspondiente es `put-graphql-api-environment-variables`.

Para recuperar una variable de entorno mediante API, puede utilizar `GetGraphqlApiEnvironmentVariables`. El comando de la CLI correspondiente es `get-graphql-api-environment-variables`.

El comando debe contener el ID de la API y la lista de variables de entorno:

```
aws appsync put-graphql-api-environment-variables \  
  --api-id "<api-id>" \
  --environment-variables '{"key1":"value1","key2":"value2", …}'
```

El siguiente ejemplo establece dos variables de entorno en una API con el ID de `abcdefghijklmnopqrstuvwxyz` mediante el comando `put-graphql-api-environment-variables`:

```
aws appsync put-graphql-api-environment-variables \  
  --api-id "abcdefghijklmnopqrstuvwxyz" \
  --environment-variables '{"USER_TABLE":"users_prod","DEBUG":"true"}'
```

Tenga en cuenta que al aplicar variables de entorno con el comando `put-graphql-api-environment-variables`, el contenido de la estructura de las variables de entorno se sobrescribe; esto significa que se perderán las variables de entorno existentes. Para retener las variables de entorno existentes al agregar otras nuevas, **incluya todos los pares clave-valor existentes** junto a las nuevas variables de entorno en la solicitud. En el ejemplo anterior, si desea agregar `"EMPTY":""`, podría hacer lo siguiente:

```
aws appsync put-graphql-api-environment-variables \  
  --api-id "abcdefghijklmnopqrstuvwxyz" \
  --environment-variables '{"USER_TABLE":"users_prod","DEBUG":"true", "EMPTY":""}'
```

Para recuperar la configuración actual, use el comando `get-graphql-api-environment-variables`:

```
aws appsync get-graphql-api-environment-variables --api-id "<api-id>"
```

En el ejemplo anterior, podría utilizar el comando siguiente:

```
aws appsync get-graphql-api-environment-variables --api-id "abcdefghijklmnopqrstuvwxyz"
```

El resultado mostrará la lista de variables de entorno junto con sus valores clave:

```
{
    "environmentVariables": {
        "USER_TABLE": "users_prod",
        "DEBUG": "true",
        "EMPTY": ""
    }
}
```

## Configuración de variables de entorno (CFN)
<a name="configuring-environment-variables-cfn"></a>

Puede usar la siguiente plantilla para crear variables de entorno:

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  GraphQLApiWithEnvVariables:
    Type: "AWS::AppSync::GraphQLApi"
    Properties:
      Name: "MyApiWithEnvVars"
      AuthenticationType: "AWS_IAM"
      EnvironmentVariables:
        EnvKey1: "non-empty"
        EnvKey2: ""
```

## Variables de entorno y API fusionadas
<a name="configuring-environment-variables-merged-api"></a>

Las variables de entorno definidas en las API de origen también están disponibles en las API fusionadas. Las variables de entorno de las API fusionadas son de solo lectura y no se pueden actualizar. Tenga en cuenta que las claves de las variables de entorno deben ser únicas en todas las API de origen para que las fusiones se realicen correctamente; las claves duplicadas siempre provocarán un error en las fusiones.

## Recuperar variables de entorno
<a name="retrieving-environment-variables"></a>

Para recuperar variables de entorno en el código de función, recupere el valor del objeto `ctx.env` en los solucionadores y funciones. A continuación se muestran algunos ejemplos al respecto.

------
#### [ Publishing to Amazon SNS ]

En este ejemplo, nuestro solucionador de HTTP envía un mensaje a un tema de Amazon SNS. El ARN del tema solo se conoce después de implementar la pila que define la API de GraphQL y el tema.

```
/**
 * Sends a publish request to the SNS topic
 */
export function request(ctx) {
    const TOPIC_ARN = ctx.env.TOPIC_ARN;
    const { input: values } = ctx.args;
    // this custom function sends values to the SNS topic
    return publishToSNSRequest(TOPIC_ARN, values);
}
```

------
#### [ Transactions with DynamoDB ]

En este ejemplo, los nombres de la tabla de DynamoDB son diferentes si la API se implementa con fines de ensayo o si ya está en producción. No es necesario realizar cambios en el código del solucionador. Los valores de las variables de entorno se actualizan en función del lugar en el que se implemente la API.

```
import { util } from '@aws-appsync/utils';
export function request(ctx) {
  const { authorId, postId } = ctx.args;
  return {
    operation: 'TransactWriteItems',
    transactItems: [
      {
        table: ctx.env.POST_TABLE,
        operation: 'PutItem',
        key: util.dynamodb.toMapValues({ postId }),
        // rest of the configuration
      },
      {
        table: ctx.env.AUTHOR_TABLE,
        operation: 'UpdateItem',
        key: util.dynamodb.toMapValues({ authorId }),
        // rest of the configuration
      },
    ],
  };
}
```

------