このトピックでは、Function ComputeのC# ランタイム環境でコードを記述するときに必要なコンテキストについて説明します。
コンテキストとは何ですか?
Function Computeが関数を実行すると、関数の実行に使用されるメソッドにコンテキストオブジェクトが渡されます。 コンテキストオブジェクトには、呼び出し、サービス、関数、トレース分析、およびランタイム環境に関する情報が含まれます。 イベントハンドラーとHTTPハンドラーはどちらも、コンテキストオブジェクトを入力パラメーターとしてサポートしています。 コンテキストオブジェクトは、両方のハンドラタイプで同じ形式と内容を使用します。 次の表に、コンテキストオブジェクトでサポートされるフィールドを示します。
パラメーター | 説明 |
RequestId | リクエストの ID。 エラーが発生した場合のトラブルシューティング用のIDを記録できます。 |
機能 | 関数の名前、ハンドラー、メモリ、タイムアウト期間など、呼び出された関数に関する基本情報。 |
Credentials | サービスにリンクされたロールを引き受けることによってFunction Computeが取得する一時的なAccessKeyペア。 一時的なAccessKeyペアは36時間有効です。 コードで |
ロガー | Function Computeによってカプセル化されるロガー。 |
サービス | 呼び出されたサービスの基本情報。 |
OpenTracing | OpenTelemetryのマネージドサービスに関する情報。 詳細については、「概要」をご参照ください。 |
インターフェイスを使用して、コンテキスト情報を取得できます。 次のサンプルコードは、インターフェイスを定義します。 詳細については、「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);
// The bucket name. You must create the bucket in advance.
string bucketName = "my-****";
// The path of the object.
string objectName = "exampledir/exampleobject.txt";
// Specify the endpoint of the region in which the bucket resides. We recommend that you use an internal endpoint. In this example, the internal endpoint https://oss-cn-hangzhou-internal.aliyuncs.com of the China (Hangzhou) region is used.
string endpoint = "https://oss-cn-hangzhou-internal.aliyuncs.com";
// Obtain the key information. Before execution, make sure that the service to which the function belongs is configured with a role that is attached with the AliyunOSSFullAccess policy.
// We recommend that you use the AliyunFCDefaultRole role.
ICredentials creds = context.Credentials;
// Create an OSSClient instance.
/*
The AccessKey pair of an Alibaba Cloud account can be used to access all API operations. Using these credentials to perform operations in Function Compute is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M.
We recommend that you do not save the AccessKey ID and AccessKey secret to your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources in your account may be compromised.
In this example, the AccessKey pair is obtained from the context.
*/
OssClient ossClient =
new OssClient(endpoint,
creds.AccessKeyId,
creds.AccessKeySecret,
creds.SecurityToken);
// Specify the bucket name such as examplebucket and the full path of the object such as 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!");
}
}
}