AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Context 对象 (Java)

您通过 context 参数与 AWS Lambda 执行环境进行交互。context 对象让您能够访问 Lambda 执行环境中的有用信息。例如,您可以使用 context 参数确定与该函数关联的 CloudWatch 日志流,或借助 context 对象的 clientContext 属性了解有关调用该 Lambda 函数的应用程序(通过 AWS 移动软件开发工具包调用时)的更多信息。

context 对象属性有:

  • getMemoryLimitInMB():为 Lambda 函数配置的内存限制 (MB)。

  • getFunctionName():正在运行的 Lambda 函数的名称。

  • getFunctionVersion():正在执行的 Lambda 函数版本。如果别名用于调用函数,getFunctionVersion 将为别名指向的版本。

  • getInvokedFunctionArn():用于调用此函数的 ARN。它可以是函数 ARN 或别名 ARN。非限定的 ARN 执行 $LATEST 版本,别名执行它指向的函数版本。

  • getAwsRequestId():与请求关联的 AWS 请求 ID。这是返回到调用 invoke() 的客户端的 ID。可以使用该请求 ID 与 AWS support 进行跟进调查。注意:AWS Lambda 重试函数(例如,当 Lambda 函数处理 Kinesis 记录引发异常时)时,请求 ID 保存不变。

  • getLogStreamName():特定 Lambda 函数执行的 CloudWatch 日志流名称。如果提供的 IAM 用户没有执行 CloudWatch 操作的权限,则为空。

  • getLogGroupName():与调用的 Lambda 函数关联的 CloudWatch 日志组名称。如果提供的 IAM 用户没有执行 CloudWatch 操作的权限,则为空。

  • getClientContext():客户端应用程序和设备的相关信息(通过 AWS 移动软件开发工具包调用时)。它可以为空。客户端上下文提供了客户端信息,如客户端 ID、应用程序名称、版本名称、版本代码和应用程序包名称。

  • getIdentity():有关 Amazon Cognito 身份提供商的信息(通过 AWS 移动软件开发工具包调用时)。它可以为空。

  • getRemainingTimeInMillis():函数被终止前剩余的执行时间(单位为毫秒)。在创建 Lambda 函数时,您需要设置最大时间限制,到达该时间限制后,AWS Lambda 会终止函数的执行。有关函数剩余执行时间的信息可用于指定接近超时时的函数行为。

  • getLogger():返回与 Context 对象关联的 Lambda 记录器。有关更多信息,请参阅 日志记录 (Java)

下面的 Java 代码片段显示了一个打印部分上下文信息的处理程序函数。

Copy
public static void handler(InputStream inputStream, OutputStream outputStream, Context context) { ... System.out.println("Function name: " + context.getFunctionName()); System.out.println("Max mem allocated: " + context.getMemoryLimitInMB()); System.out.println("Time remaining in milliseconds: " + context.getRemainingTimeInMillis()); System.out.println("CloudWatch log stream name: " + context.getLogStreamName()); System.out.println("CloudWatch log group name: " + context.getLogGroupName()); }

示例:使用上下文对象 (Java)

下面的 Java 代码示例演示如何利用 Context 对象在 Lambda 函数运行期间检索该函数的运行时信息。

Copy
package example; import java.io.InputStream; import java.io.OutputStream; import com.amazonaws.services.lambda.runtime.Context; public class Hello { public static void myHandler(InputStream inputStream, OutputStream outputStream, Context context) { int letter; try { while((letter = inputStream.read()) != -1) { outputStream.write(Character.toUpperCase(letter)); } Thread.sleep(3000); // Intentional delay for testing the getRemainingTimeInMillis() result. } catch (Exception e) { e.printStackTrace(); } // For fun, let us get function info using the context object. System.out.println("Function name: " + context.getFunctionName()); System.out.println("Max mem allocated: " + context.getMemoryLimitInMB()); System.out.println("Time remaining in milliseconds: " + context.getRemainingTimeInMillis()); System.out.println("CloudWatch log stream name: " + context.getLogStreamName()); System.out.println("CloudWatch log group name: " + context.getLogGroupName()); } }

您可以执行以下操作来测试代码:

  • 使用上述代码创建部署程序包。

  • 将部署程序包上传到 AWS Lambda 以创建 Lambda 函数。可使用控制台或 AWS CLI 完成此操作。

  • 要测试 Lambda 函数,请使用 Lambda 控制台提供的“Hello World”Sample event

    您可以键入任意字符串,该函数将返回该字符串的大写形式。此外,您还会获得 context 对象提供的有用的函数信息。

按照“入门”中提供的说明进行操作。有关更多信息,请参阅 步骤 2.3:(可选)创建用 Java 编写的 Lambda 函数。注意以下不同:

  • 创建部署程序包时,不要忘了 aws-lambda-java-core 库依赖项。

  • 在创建 Lambda 函数时,指定 example.Hello::myHandler (package.class::method) 作为处理程序值。