本文介绍在函数计算中使用Java运行时开发代码时,所涉及的Context(上下文)的相关概念和使用示例。

什么是上下文

函数计算运行您的函数时,会将上下文对象传递到执行方法中。该对象包含有关调用、服务、函数、链路追踪和执行环境等信息。事件请求处理程序(Event Handler)HTTP请求处理程序(HTTP Handler)都支持上下文对象作为其传入参数,且格式和内容相同。上下文对象主要提供了以下参数。

字段 说明
RequestId 本次调用请求的ID。您可以记录下该ID,当出现问题时方便查询。
Function 当前调用的函数的一些基本信息,例如函数名、函数入口、函数内存和超时时间。
Credentials

函数计算服务通过扮演服务角色而获取的一组临时密钥,其有效时间是36小时。您可以在代码中使用Credentials去访问相应的服务例如OSS,这就避免了您把自己的AccessKey信息编码在函数代码里。详细信息,请参见通过RAM角色实现跨云账号授权

Logger 函数计算封装过的logger。
Service 当前调用的服务的一些基本信息。
OpenTracing 链路追踪的相关信息,具体信息,请参见链路追踪简介

接口定义如下。

package com.aliyun.fc.runtime;

public interface Context {

    public String getRequestId();

    public Credentials getExecutionCredentials();

    public FunctionParam getFunctionParam();

    public FunctionComputeLogger getLogger();

    public Service getService();

    public OpenTracing getTracing();

    public int getRetryCount();
}

示例程序:使用临时密钥访问OSS

该示例演示了如何使用上下文中的临时密钥向OSS中上传一个文件,详细代码,请参见java11-oss

package example;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.Credentials;
import com.aliyun.fc.runtime.StreamRequestHandler;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;

public class App implements StreamRequestHandler {

    @Override
    public void handleRequest(
            InputStream inputStream, OutputStream outputStream, Context context) throws IOException {

        // Bucket名称, 需要预先创建。
        String bucketName = "my-bucket";
        // Endpoint必须填写Bucket所在地域对应的Endpoint,推荐使用内网访问地址。以华东1(杭州)为例,内网访问Endpoint为https://oss-cn-hangzhou-internal.aliyuncs.com。
        String endpoint = "https://oss-cn-hangzhou-internal.aliyuncs.com";

        // 获取密钥信息,执行前,确保函数所在的服务配置了角色信息,并且角色需要拥有AliyunOSSFullAccess权限。
        // 建议直接使用AliyunFCDefaultRole角色。
        Credentials creds = context.getExecutionCredentials();

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken());

        // 填写Byte数组。
        byte[] content = "Hello FC".getBytes();
        // 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
        ossClient.putObject(bucketName, "exampledir/exampleobject.txt", new ByteArrayInputStream(content));

        // 关闭OSSClient。
        ossClient.shutdown();

        outputStream.write(new String("done").getBytes());
    }
}