在 AWS AppSync 中使用环境变量 - AWS AppSync

在 AWS AppSync 中使用环境变量

您可以使用环境变量来调整 AWS AppSync 解析器和函数的行为,而无需更新代码。环境变量是与您的 API 配置一起存储的字符串对,可供您的解析器和函数在运行时使用。如果您必须引用的配置数据仅在初始设置期间可用,而您的解析器和函数需要在运行期间使用配置数据,那么环境变量特别有用。环境变量在您的代码中公开配置数据,从而减少了对这些值进行硬编码的需求。

注意

为了提高数据库的安全性,建议您使用 Secrets ManagerAWS Systems Manager Parameter Store 而不是环境变量来存储凭证或敏感信息。要利用此特征,请参阅 Invoking AWS services with AWS AppSync HTTP data sources

环境变量必须遵循多种行为和规则才能正常运行:

  • JavaScript 解析器/函数和 VTL 模板都支持环境变量。

  • 不会在调用函数之前评估环境变量。

  • 环境变量支持字符串值。

  • 环境变量中定义的任何值都视为字符串文本,且不会展开。

  • 理想情况下,应在函数代码中执行变量评估。

配置环境变量(控制台)

您可以通过创建变量并定义其键值对,为 AWS AppSync GraphQL API 配置环境变量。您的解析器和函数将使用环境变量的键名在运行时检索值。在 AWS AppSync 控制台中设置环境变量:

  1. 登录到 AWS Management Console,然后打开 AppSync 控制台

  2. API 页面上,选择一个 GraphQL API 的名称。

  3. 在您的 API 主页的导航窗格中,选择设置

  4. 环境变量下,选择添加环境变量

  5. 选择添加环境变量

  6. 输入键和值。

  7. 如有必要,请重复步骤 5 和 6 以添加更多键值。如果需要删除键值,请选择删除选项和要删除的键。

  8. 选择提交

提示

创建键和值时必须遵循以下几条规则:

  • 键必须以字母开头。

  • 键长度必须至少为两个字符。

  • 键只能包含字母、数字和下划线字符(_)。

  • 值最长可达 512 个字符。

  • 最多可在 GraphQL API 中配置 50 个键/值对。

配置环境变量(API)

要使用 API 设置环境变量,可以使用 PutGraphqlApiEnvironmentVariables。对应的 CLI 命令为 put-graphql-api-environment-variables

要使用 API 检索环境变量,可以使用 GetGraphqlApiEnvironmentVariables。对应的 CLI 命令为 get-graphql-api-environment-variables

该命令必须包含 API ID 和环境变量列表:

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

以下示例使用 put-graphql-api-environment-variables 命令在 ID 为 abcdefghijklmnopqrstuvwxyz 的 API 中设置了两个环境变量:

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

请注意,使用 put-graphql-api-environment-variables 命令应用环境变量时,环境变量结构的内容将被覆盖;这意味着现有的环境变量将丢失。要在添加新环境变量时保留现有环境变量,请在请求中包含所有现有键值对以及新键值对。使用上面的示例,如果要添加 "EMPTY":"",可以执行以下操作:

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

要检索当前配置,请使用 get-graphql-api-environment-variables 命令:

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

使用上面的示例,您可以使用以下命令:

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

结果将显示环境变量列表以及相应的键值:

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

配置环境变量(CFN)

可以使用下面的模板创建环境变量:

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

环境变量和合并的 API

源 API 中定义的环境变量也可在合并的 API 中使用。合并的 API 中的环境变量是只读变量,无法更新。请注意,环境变量键在所有源 API 中必须唯一,才会成功合并;重复的键始终会导致合并失败。

检索环境变量

要检索函数代码中的环境变量,请从解析器和函数中的 ctx.env 对象检索值。下面是一些实际示例。

Publishing to Amazon SNS

在本示例中,我们的 HTTP 解析器将消息发送到 Amazon SNS 主题。只有当定义 GraphQL API 的堆栈和主题部署完毕后,才会知道该主题的 ARN。

/** * 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

在本示例中,如果 API 是为暂存而部署,或者已经在生产环境中,则 DynamoDB 表的名称不同。无需更改解析器代码。环境变量的值会根据 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 }, ], }; }