すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:GetObjectリクエストの処理に使用される関数をコンパイルする

最終更新日:Aug 28, 2024

Object FCアクセスポイントを使用してGetObject操作を呼び出すと、function Computeのバインドされた関数がトリガーされます。 関数でWriteGetObjectResponse操作を呼び出して、カスタムデータと応答ヘッダーのみを返すことができます。

前提条件

オブジェクトFCアクセスポイントが作成されます。 詳細については、「オブジェクトFCアクセスポイントの作成」をご参照ください。

手順

  1. GetObjectリクエストの処理に使用する関数をコンパイルします。

    Java

    OSS SDK for Javaのバージョンは3.17.2以降である必要があります。

    import com.aliyun.fc.runtime.Context;
    import com.aliyun.fc.runtime.Credentials;
    import com.aliyun.fc.runtime.StreamRequestHandler;
    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    import com.aliyun.oss.model.ObjectMetadata;
    import com.aliyun.oss.model.VoidResult;
    import com.aliyun.oss.model.WriteGetObjectResponseRequest;
    import org.codehaus.jettison.json.JSONException;
    import org.codehaus.jettison.json.JSONObject;
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.Scanner;
    
    public class Example1 implements StreamRequestHandler {
        // In this example, the endpoint of the China (Qingdao) region is used. 
        String endpoint = "https://oss-cn-qingdao.aliyuncs.com";
        private static int status = 200;
    
        public static String convertToString(InputStream inputStream) {
            Scanner scanner = new Scanner(inputStream).useDelimiter("\\A");
            return scanner.hasNext() ?  scanner.next() : "";
        }
    
        @Override
        public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
            Credentials creds = context.getExecutionCredentials();
            // Obtain the AccessKey pair from the context. 
            OSS ossClient = new OSSClientBuilder().build(endpoint, creds.getAccessKeyId(), creds.getAccessKeySecret(), creds.getSecurityToken());
    
    
            try {
                String result = convertToString(inputStream);
                JSONObject jsonObject = new JSONObject(result);
                String route = jsonObject.getJSONObject("getObjectContext").getString("outputRoute");
                String token = jsonObject.getJSONObject("getObjectContext").getString("outputToken");
                // Call BufferedImage to create an image object that has a resolution of 200 × 200 pixels and draw a red rectangle for the object. 
                // Write content to the body of the WriteGetObjectResponse request. 
                BufferedImage image = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
                Graphics2D graphics = image.createGraphics();
                graphics.setColor(Color.RED);
                graphics.fillRect(0, 0, 200, 200);
                graphics.dispose();
    
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ImageIO.write(image, "png", baos);
                WriteGetObjectResponseRequest writeGetObjectResponseRequest = new WriteGetObjectResponseRequest(route, token, status,new ByteArrayInputStream(baos.toByteArray()));
    
                ObjectMetadata metadata = new ObjectMetadata();
                metadata.setContentLength(baos.size());
                writeGetObjectResponseRequest.setMetadata(metadata);
    
                VoidResult voidResult = ossClient.writeGetObjectResponse(writeGetObjectResponseRequest);
                System.out.println("getRequestId:"+voidResult.getRequestId());
                System.out.println("status:"+voidResult.getResponse().getStatusCode());
                System.out.println("Headers:"+voidResult.getResponse().getHeaders().toString());
            } catch (OSSException oe) {
                System.out.println("Caught an OSSException, which means your request made it to OSS, "
                        + "but was rejected with an error response for some reason.");
                System.out.println("Error Message: " + oe.getMessage());
                System.out.println("Error Code:       " + oe.getErrorCode());
                System.out.println("Request ID:      " + oe.getRequestId());
                System.out.println("Host ID:           " + oe.getHostId());
            } catch (ClientException ce) {
                System.out.println("Caught an ClientException, which means the client encountered "
                        + "a serious internal problem while trying to communicate with OSS, "
                        + "such as not being able to access the network.");
                System.out.println("Error Message: " + ce.getMessage());
            } catch (JSONException e) {
                e.printStackTrace();
            } finally {
                ossClient.shutdown();
            }
        }
    }
    

    Python

    OSS SDK for Pythonのバージョンは2.18.3以降である必要があります。

    # -*- coding: utf-8 -*-
    import io
    from PIL import Image
    import oss2
    import json
    
    # In this example, the endpoint of the China (Qingdao) region is used. 
    endpoint = 'http://oss-cn-qingdao.aliyuncs.com'
    fwd_status = '200'
    
    # Fc function entry
    def handler(event, context):
    
        evt = json.loads(event)
        creds = context.credentials
        # do not forget security_token
        auth = oss2.StsAuth(creds.access_key_id, creds.access_key_secret, creds.security_token)
    
        headers = dict()    
    
        event_ctx = evt["getObjectContext"]
        route = event_ctx["outputRoute"]
        token = event_ctx["outputToken"]
        print(evt)
    
        endpoint = route
        service = oss2.Service(auth, endpoint)
        # Call Image to create an image object that has a resolution of 200 × 200 pixels and draw a red rectangle for the object. 
        # Write content to the body of the write_get_object_response request. 
        image = Image.new('RGB', (200, 200), color=(255, 0, 0))
        transformed = io.BytesIO()
        image.save(transformed, "png")
    
        resp = service.write_get_object_response(route, token, fwd_status, transformed.getvalue(), headers)
    
        print('status: {0}'.format(resp.status))
        print(resp.headers)
    
        return 'success'

    行く

    OSS SDK for Goのバージョンは1.2.2以降である必要があります。

    package main
    
    import (
      "bytes"
      "context"
      "fmt"
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
      "github.com/aliyun/fc-runtime-go-sdk/fc"
      "github.com/aliyun/fc-runtime-go-sdk/fccontext"
      "image"
      "image/color"
      "image/draw"
      "image/png"
    )
    // Specify the GetObjectContext structure, which contains the output route (outputRoute), output token (outputToken), and input OSS URL(inputOssUrl). 
    type GetObjectContext struct {
      OutputRoute string `json:"outputRoute"`
      OutputToken string `json:"outputToken"`
    }
    // Specify the StructEvent structure to receive the event data that triggers the function. 
    type StructEvent struct {
      GetObjectContext GetObjectContext `json:"getObjectContext"`
    }
    // Specify the HandleRequest function to process computing logic. 
    func HandleRequest(ctx context.Context, event StructEvent) error {
      fmt.Printf("event:%#v\n", event)
      endpoint := event.GetObjectContext.OutputRoute
      fwdStatus := "200"
      fctx, _ := fccontext.FromContext(ctx)
      // Obtain the AccessKey pair from the context. 
      client, err := oss.New(endpoint, fctx.Credentials.AccessKeyId, fctx.Credentials.AccessKeySecret, oss.SecurityToken(fctx.Credentials.SecurityToken), oss.AuthVersion(oss.AuthV4), oss.Region("cn-qingdao"))
      if err != nil {
        return fmt.Errorf("client new error: %v", err)
      }
      params := map[string]interface{}{}
      params["x-oss-write-get-object-response"] = nil
    
      // Create an image object that has a resolution of 200 × 200 pixels and draw a red rectangle for the object. 
      img := image.NewRGBA(image.Rect(0, 0, 200, 200))
      red := color.RGBA{255, 0, 0, 255}
      draw.Draw(img, img.Bounds(), &image.Uniform{red}, image.Point{}, draw.Src)
    
      // Save the image in the PNG format. 
      var buf bytes.Buffer
      err = png.Encode(&buf, img)
      if err != nil {
        return fmt.Errorf("png encode error: %v", err)
      }
      reader := bytes.NewReader(buf.Bytes())
      // Use the OSS client to upload the converted image by sending a POST request, and specify specific HTTP headers, such as x-oss-request-route, to facilitate the identification and processing of special forwarding requests. 
      headers := make(map[string]string)
      headers["x-oss-request-route"] = event.GetObjectContext.OutputRoute
      headers["x-oss-request-token"] = event.GetObjectContext.OutputToken
      headers["x-oss-fwd-status"] = fwdStatus
      resp, err := client.Conn.Do("POST", "", "", params, headers, reader, 0, nil)
      if err != nil {
        return fmt.Errorf("client conn do error: %v", err)
      }
      fmt.Println("status:", resp.StatusCode)
      fmt.Println(resp.Headers)
    
      return nil
    }
    // Call fc.Start(HandleRequest) to register and run the HandleRequest function and wait for and process the event triggers of Alibaba Cloud Function Compute. 
    func main() {
      fc.Start(HandleRequest)
    }
  2. 関数をデプロイします。

    Java

    1. 解凍します。jarファイル。

    2. をアップロードします。Function Computeコンソールへのjarファイル。

      1. Function Compute コンソールにログインします。 右上隅の [Function Compute 2に戻る] をクリックします。

      2. 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。

      3. 上部のナビゲーションバーで、[中国 (青島)] を選択します。

      4. [サービス] ページで、作成したサービスをクリックし、ランタイムがJava 11の関数をクリックします。

      5. 機能の詳細ページで、コードのアップロード > JARパッケージのアップロードを選択します。

      6. 表示されるダイアログボックスで、を選択します。jarファイルを選択します。ファイルが選択された後に関数をデプロイします。をクリックし、保存とデプロイ.

    3. サンプル関数に基づいて関数ハンドラーを変更します。

      1. 機能の詳細ページで、[設定] タブをクリックします。

      2. [環境情報] セクションで、[編集] をクリックします。

      3. Handlerパラメーターの値を変更します。

        ランタイムがJavaの場合、現在の値は [package].[class]::[method] 形式です。 現在の値がexample.HelloFC::handleRequestの場合、サンプルパッケージのHelloFCクラスのhandleRequest関数が呼び出されます。 実際のサンプル関数に基づいて現在の値を変更する必要があります。 例: com.aliyun.sts.sample.Example1::handleRequest

    Python

    1. [サービス] ページで、作成したサービスをクリックし、実行時がPython 3.10の関数をクリックします。

    2. 機能の詳細ページで、[コード] タブをクリックし、[ターミナル] > [新しいターミナル] を選択します。

    3. TERMINALパネルで、次のコマンドを実行して、OSS SDK for Pythonのバージョンを更新します。

      pip install oss2 -t.
    4. index.pyのサンプルコードを、GetObjectリクエストの処理に使用するサンプルPython関数コードに置き換えます。 次に、[デプロイ] をクリックします。

    行く

    1. OSS SDK for Goランタイム環境をインストールします。

    2. コードパッケージをコンパイルします。 詳細については、「LinuxまたはmacOSでのコードのコンパイルとパッケージ化」をご参照ください。

      コンパイル中に、main.goコンパイルファイルを、前の手順で指定したGetObjectリクエストの処理に使用するサンプル関数に置き換えます。

    3. コンパイルされたバイナリファイルをZIPパッケージとして、Go 1のランタイム環境で作成された関数にアップロードし、関数のハンドラーを設定します。 詳細については、「Function Computeハンドラーの設定」をご参照ください。

次に何をすべきか

オブジェクトFCアクセスポイントの使用