本文介紹在Function Compute中使用Java運行時開發代碼時,所涉及的Context的相關概念和使用樣本。
什麼是上下文
當Function Compute運行您的函數時,會將內容物件傳遞到執行方法中。該對象包含有關調用、服務、函數和執行環境等資訊。內容物件主要提供了以下參數。
欄位 | 說明 |
RequestId | 本次調用請求的ID。您可以記錄下該ID,當出現問題時方便查詢。 |
Function | 當前調用的函數的一些基本資料,例如函數名、函數入口、函數記憶體和逾時時間。 |
Credentials | Function Compute服務通過扮演服務角色而擷取的一組臨時密鑰,其有效時間是36小時。您可以在代碼中使用 |
Logger | Function Compute封裝過的logger。 |
Service | 當前調用的服務的一些基本資料。 |
介面定義如下。
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執行個體。
/*
阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
本樣本以從上下文中擷取AccessKey/AccessSecretKey為例。
*/
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());
}
}