本文介紹在Function Compute中使用C#運行時開發代碼時,所涉及的Context(上下文)的相關概念和使用樣本。
什麼是上下文
當Function Compute運行您的函數時,會將內容物件傳遞到執行方法中。該對象包含有關調用、服務、函數、鏈路追蹤和執行環境等資訊。事件請求處理常式(Event Handler)和HTTP請求處理常式(HTTP Handler)都支援內容物件作為其傳入參數,且格式和內容相同。內容物件主要提供了以下欄位。
欄位 | 說明 |
RequestId | 本次調用請求的ID。您可以記錄該ID,出現問題時方便查詢。 |
Function | 當前調用函數的基本資料,例如函數名、請求處理常式、函數記憶體和逾時時間等。 |
Credentials | Function Compute服務通過扮演服務角色而擷取的一組臨時密鑰,其有效時間是36小時。您可以在代碼中使用 |
Logger | Function Compute封裝過的Logger。 |
Service | 當前調用的服務的一些基本資料。 |
OpenTracing | 鏈路追蹤的相關資訊。更多資訊,請參見鏈路追蹤簡介。 |
您可以通過介面擷取上下文資訊,介面定義如下。更多資訊,請參見IFcContext。
public interface IFcContext
{
/// <summary>
/// The AliFc request ID associated with the request.
/// This is the same ID returned to the client that called invoke().
/// This ID is reused for retries on the same request.
/// </summary>
string RequestId { get; }
/// <summary>
/// Gets the function parameter interface.
/// </summary>
/// <value>The function parameter interface.</value>
IFunctionParameter FunctionParam {get;}
/// <summary>
/// AliFc logger associated with the Context object.
/// </summary>
IFcLogger Logger { get; }
/// <summary>
/// Gets the credentials interface.
/// </summary>
/// <value>The credentials interface.</value>
ICredentials Credentials {get;}
/// <summary>
/// Gets the account identifier.
/// </summary>
/// <value>The account identifier.</value>
string AccountId { get; }
/// <summary>
/// Gets the region.
/// </summary>
/// <value>The region.</value>
string Region { get; }
/// <summary>
/// Gets the service meta.
/// </summary>
/// <value>The service meta.</value>
IServiceMeta ServiceMeta { get; }
}
樣本程式:使用臨時密鑰訪問OSS
該樣本示範如何使用上下文中的臨時密鑰向OSS上傳一個檔案。
using System;
using System.IO;
using Aliyun.OSS;
using Aliyun.Serverless.Core;
using Microsoft.Extensions.Logging;
namespace Example
{
public class OssExample
{
public Stream HandleRequest(Stream stream, IFcContext context)
{
context.Logger.LogInformation("Handle request: {0}", context.RequestId);
// Bucket名稱, 需要預先建立。
string bucketName = "my-****";
// Object路徑。
string objectName = "exampledir/exampleobject.txt";
// Endpoint必須填寫Bucket所在地區對應的Endpoint,推薦使用內網訪問地址。以華東1(杭州)為例,內網訪問Endpoint為https://oss-cn-hangzhou-internal.aliyuncs.com。
string endpoint = "https://oss-cn-hangzhou-internal.aliyuncs.com";
// 擷取密鑰資訊,執行前,確保函數所在的服務已配置角色資訊,且為該角色授予AliyunOSSFullAccess許可權。
// 建議直接使用AliyunFCDefaultRole角色。
ICredentials creds = context.Credentials;
// 建立OSSClient執行個體。
/*
阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
本樣本以從上下文中擷取AccessKey/AccessSecretKey為例。
*/
OssClient ossClient =
new OssClient(endpoint,
creds.AccessKeyId,
creds.AccessKeySecret,
creds.SecurityToken);
// 依次填寫Bucket名稱(例如examplebucket)和Object完整路徑(例如exampledir/exampleobject.txt)。
ossClient
.PutObject(bucketName,
objectName,
stream);
OssObject obj = ossClient.GetObject(bucketName,objectName);
context.Logger.LogInformation("Put object to oss success: {0}", obj.ToString());
return obj.Content;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}