Amazon AppConfig与 Lambda 扩展集成 - Amazon AppConfig
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon AppConfig与 Lambda 扩展集成

网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的Amazon Lambda扩展是一个辅助过程,可以增强 Lambda 函数的功能。扩展可以在调用函数之前启动,与函数并行运行,然后在函数调用处理之后继续运行。实质上,Lambda 扩展就像一个与 Lambda 调用并行运行的客户端。此并行客户端可以在其生命周期中的任何时候与您的函数进行交互

如果您使用Amazon AppConfig功能标志或 Lambda 函数中的其他动态配置数据,那么我们建议您添加Amazon AppConfigLambda 扩展作为 Lambda 函数的层。这使调用功能标志变得更加简单,扩展程序本身包含了简化使用的最佳实践Amazon AppConfig同时降低成本。降低了成本的原因是对Amazon AppConfig服务和更短的 Lambda 函数处理时间。有关 Lambda 扩展程序的更多信息,请参阅Lambda 扩展中的Amazon Lambda开发人员指南.

注意

Amazon AppConfig 定价基于调用和接收配置的次数。如果 Lambda 执行多次冷启动并频繁检索新的配置数据,则成本会增加。

本主题包括信息Amazon AppConfigLambda 扩展以及如何将扩展配置为与 Lambda 函数配合使用的过程。

工作方式

如果您使用Amazon AppConfig管理 Lambda 函数的配置没有Lambda 扩展程序,然后您必须将 Lambda 函数配置为与StartConfiguration会话GetLatest配置API 操作。

将Amazon AppConfig使用 Lambda 函数扩展可简化此过程。扩展程序负责调用Amazon AppConfig服务,管理检索到的数据的本地缓存,跟踪下一次服务调用所需的配置令牌,并定期在后台检查配置更新。下图显示了它的工作方式。


          关于如何使用的图表Amazon AppConfigLambda 扩展工作原理
  1. 你配置了Amazon AppConfigLambda 扩展作为 Lambda 函数的一层。

  2. 要访问其配置数据,您的函数将调用Amazon AppConfig在上运行的 HTTP 终端节点上的扩展localhost:2772.

  3. 扩展程序维护配置数据的本地缓存。如果数据不在缓存中,则扩展程序将调用Amazon AppConfig以获取配置数据。

  4. 从服务收到配置后,扩展程序将其存储在本地缓存中并将其传递给 Lambda 函数。

  5. Amazon AppConfigLambda 扩展程序会定期在后台检查配置数据的更新。每次调用 Lambda 函数时,扩展程序都会检查自检索配置以来所用的时间。如果经过的时间大于配置的轮询间隔,则分机会调用Amazon AppConfig要检查是否有新部署的数据,如果发生了更改,则更新本地缓存,然后重置已用的时间。

注意
  • Lambda 实例化与函数所需的并发级别对应的单独实例。每个实例都是隔离的,并维护自己的配置数据的本地缓存。有关 Lambda 实例和并发的更多信息,请参阅管理 Lambda 函数的并发.

  • 在从中部署更新的配置后,配置更改显示在 Lambda 函数中所需的时间Amazon AppConfig,取决于您用于部署的部署策略以及为扩展配置的轮询间隔。

开始前的准备工作

在启用之前Amazon AppConfigLambda 扩展程序,请执行以下操作:

  • 在 Lambda 函数中组织配置,以便您可以将它们外部化到Amazon AppConfig.

  • 配置Amazon AppConfig来管理配置更新。有关更多信息,请参阅 使用 Amazon AppConfig

  • Addappconfig:StartConfigurationSessionappconfig:GetLatestConfiguration到Amazon Identity and Access ManagementLambda 函数执行角色使用的 (IAM) 策略。有关更多信息,请参阅 。Amazon Lambda执行角色中的Amazon Lambda开发人员指南. 有关 的更多信息Amazon AppConfig权限,请参阅的操作、资源和条件键Amazon AppConfig中的服务授权参考.

添加Amazon AppConfigLambda 扩展

使用Amazon AppConfigLambda 扩展,您需要将扩展程序添加到 Lambda 中。此操作可以通过添加Amazon AppConfig将 Lambda 函数扩展作为图层或通过将 Lambda 函数的扩展作为容器映像启用扩展。

添加Amazon AppConfig使用图层和 ARN 进行 Lambda 扩展

使用Amazon AppConfigLambda 扩展程序,您可以将扩展作为层添加到 Lambda 函数。有关如何向函数添加层的信息,请参阅配置扩展中的Amazon Lambda开发人员指南. 在Amazon Lambda控制台是Amazon-AppConfig-扩展. 另请注意,将扩展作为层添加到 Lambda 时,您必须指定 Amazon 资源名称 (ARN)。从以下与平台对应的列表之一中选择 ARN,然后Amazon Web Services 区域Lambda 创建的区域。

如果要在将扩展添加到函数之前对其进行测试,则可以使用以下代码示例验证它是否有效。

import urllib.request def lambda_handler(event, context): url = f'http://localhost:2772/applications/application_name/environments/environment_name/configurations/configuration_name' config = urllib.request.urlopen(url).read() return config

要测试它,请为 Python 创建一个新的 Lambda 函数,添加扩展,然后运行 Lambda 函数。运行 Lambda 函数之后,Amazon AppConfigLambda 函数返回您为 http://localhost:2772 路径指定的配置。有关创建 Lambda 函数的信息,请参阅使用控制台创建 Lambda 函数中的Amazon Lambda开发人员指南.

添加Amazon AppConfig将 Lambda 扩展作为容器镜像,请参阅使用容器镜像添加Amazon AppConfigLambda 扩展.

配置Amazon AppConfigLambda 扩展

您可以通过更改以下内容来配置扩展Amazon Lambda环境变量。有关更多信息,请参阅 。使用Amazon Lambda环境变量中的Amazon Lambda开发人员指南.

预取配置数据

环境变量AWS_APPCONFIG_EXTENSION_PREFETCH_LIST可以缩短功能的启动时间。当Amazon AppConfigLambda 扩展已初始化,它从中检索指定的配置Amazon AppConfig在 Lambda 开始初始化函数并调用处理程序之前。在某些情况下,在函数请求之前,配置数据已经在本地缓存中可用。

要使用预取功能,请将环境变量的值设置为与配置数据对应的路径。例如,如果您的配置对应于分别名为 “my_应用程序”、“my_环境” 和 “my_configation_data” 的应用程序、环境和配置配置文件,则路径将为/applications/my_application/environments/my_environment/configurations/my_configuration_data. 您可以通过将多个配置项目列为逗号分隔的列表来指定它们(如果您的资源名称包含逗号,请使用资源的 ID 值而不是名称)。

从另一个账户访问配置数据

这些区域有:Amazon AppConfigLambda 扩展程序可以通过指定授予的 IAM 角色从另一个账户检索配置数据许可到数据。要设置此设置,请执行以下步骤:

  1. 在那里的账户里Amazon AppConfig用于管理配置数据,使用信任策略创建角色,该策略授予运行 Lambda 函数的账户访问appconfig:StartConfigurationSessionappconfig:GetLatestConfiguration操作,以及与Amazon AppConfig配置资源。

  2. 在运行 Lambda 函数的账户中,添加AWS_APPCONFIG_EXTENSION_ROLE_ARN将环境变量转换到 Lambda 函数,其中包括在步骤 1 中创建的角色的 ARN。

  3. (可选)如果需要,外部 ID可以使用AWS_APPCONFIG_EXTENSION_ROLE_EXTERNAL_ID环境变量。同样,可以使用AWS_APPCONFIG_EXTENSION_ROLE_SESSION_NAME环境变量。

注意

请注意以下信息。

  • 这些区域有:Amazon AppConfigLambda 扩展只能从一个账户检索数据。如果您指定 IAM 角色,则扩展程序将无法从运行 Lambda 函数的账户中检索配置数据。

  • Amazon Lambda记录有关Amazon AppConfig使用亚马逊的 Lambda 扩展和 Lambda 函数CloudWatch日志。

环境变量 详细信息 默认值

AWS_APPCONFIG_EXTENSION_POLL_INTERVAL_SECONDS

此环境变量控制扩展轮询的频率Amazon AppConfig在几秒钟内完成更新的配置。

45

AWS_APPCONFIG_EXTENSION_POLL_TIMEOUT_MILLIS

此环境变量控制扩展等待响应的最大时间量(以毫秒为单位)。Amazon AppConfig刷新缓存中的数据时。如果Amazon AppConfig在指定的时间段内没有响应,扩展程序会跳过此轮询间隔并返回之前更新的缓存数据。

3000

AWS_APPCONFIG_EXTENSION_HTTP_PORT

此环境变量指定托管扩展的本地 HTTP 服务器在其上运行的端口。

2772

AWS_APPCONFIG_EXTENSION_PREFETCH_LIST

此环境变量指定在函数初始化和处理程序运行之前扩展开始检索的配置数据。它可以显著减少该功能的冷启动时间。

AWS_APPCONFIG_EXTENSION_MAX_CONNECTIONS

此环境变量配置扩展用于从中检索配置的最大连接数。Amazon AppConfig.

3

AWS_APPCONFIG_EXTENSION_LOG_LEVEL

此环境变量指定哪些Amazon AppConfig将特定于扩展的日志发送到 AmazonCloudWatch函数的日志。有效且不区分大小写的值为:debuginfowarnerror, 和none. 调试包括有关扩展的详细信息,包括计时信息。

info

AWS_APPCONFIG_EXTENSION_ROLE_ARN 此环境变量指定了 IAM 角色 ARN 对应的角色,该角色 ARN 应由Amazon AppConfig扩展以检索配置。
AWS_APPCONFIG_EXTENSION_ROLE_EXTERNAL_ID 此环境变量指定与担任角色 ARN 一起使用的外部 ID。
AWS_APPCONFIG_EXTENSION_ROLE_SESSION_NAME 此环境变量指定与担任 IAM 角色的证书关联的会话名称。
AWS_APPCONFIG_EXTENSION_SERVICE_REGION 此环境变量指定了扩展程序应使用的替代区域来调用Amazon AppConfig服务。未定义时,扩展将使用当前区域中的终端节点。

从功能标志配置中检索一个或多个标志

对于功能标志配置(类型的配置)AWS.AppConfig.FeatureFlags),Lambda 扩展使您能够检索配置中的单个标志或标志子集。如果 Lambda 只需使用配置文件中的几个标志,则检索一两个标志很有用。以下示例使用 Python。

注意

在配置中调用单个功能标志或标志子集的功能仅在Amazon AppConfigLambda 扩展版本 2.0.45 及更高版本。

您可以检索Amazon AppConfig来自本地 HTTP 端点的配置数据。要访问特定标志或标志列表,请使用?flag=flag_name的查询参数Amazon AppConfig配置文件。

访问单个标志及其属性

import urllib.request def lambda_handler(event, context): url = f'http://localhost:2772/applications/application_name/environments/environment_name/configurations/configuration_name?flag=flag_name' config = urllib.request.urlopen(url).read() return config

访问多个标志及其属性

import urllib.request def lambda_handler(event, context): url = f'http://localhost:2772/applications/application_name/environments/environment_name/configurations/configuration_name?flag=flag_name_one&flag=flag_name_two' config = urllib.request.urlopen(url).read() return config