FunctionComputeを利用して日本と中国リージョン間でOSSファイル転送を実現

こんにちは、SBCエンジニアのZです。(^_^)z

今回はAlibabaCloud が提供しているサーバレスコンピューティングサービス FunctionCompute の 利用検証になります。

前書き

現在世界中にグロバール化が進んでいる一方、クラウドサービスを利用も拡大し、グローバルリージョンをまたがるファイル同期のニーズが高まっています。コスト抑えてリージョンをまたがるファイル転送とファイル同期は課題となっています。

実現方法が色々ありますが、今回では、OSSとFunction Computeを利用して迅速にファイルを同期するソリューションを一つ実践してみます。

シナリオ

実現する構成図は下記のように、 f:id:sbc_zmm:20200311160651p:plain:w680

・アプリサーバが同じリージョンにあるOSSへファイルの処理・アップロードをする

・アップロードはVPC内のイントラネットを経由する

・ファイルアップロードと同時にFunction Computeから関数の呼び出しをトリガーする

・呼び出された関数でファイルをリモートリージョンのOSSへ同期する

Function Compute によりファイル同期検証

今回は中国北京リージョンを転送元、東京を転送先として実行します。

1、OSSコンソールにログインし、北京リージョンで転送元の OSS バケット作成

OSS bucket名:src-bucket-test

他設定:デフォルト

f:id:sbc_zmm:20200311171141p:plain

2、東京リージョンで転送先の OSS バケット作成

OSS bucket名:dst-bucket-test

他設定:デフォルト

f:id:sbc_zmm:20200311171208p:plain 3、Function Computeのコンソールで、転送元の北京リージョンで関数を作成: f:id:sbc_zmm:20200311154740p:plain f:id:sbc_zmm:20200311154859p:plain

Python3のコードのサンプルとして、下記のように関数を作成:

# -*- coding: utf-8 -*-
import json
import oss2


def handler(event, context):
    evt = json.loads(event)
    logger.info("Handling event: %s", evt)
    creds = context.credentials

    # Required by OSS sdk
    auth = oss2.StsAuth(
        creds.access_key_id,
        creds.access_key_secret,
        creds.security_token)

    evt = evt['events'][0]
    
    bucket_name = evt['oss']['bucket']['name']
    endpoint = 'oss-' + evt['region'] + '.aliyuncs.com'
    bucket = oss2.Bucket(auth, endpoint, bucket_name)

    object_name = evt['oss']['object']['key']

    remote_stream = bucket.get_object(object_name)
    if not remote_stream:
        raise RuntimeError('failed to get oss object. bucket: %s. object: %s' % (bucket_name, object_name))
        return 
    print ('get object from oss success: {}'.format(object_name))

    target_bucket_name = 'dst-jp-bucket'
    target_endpoint = 'oss-ap-northeast-1.aliyuncs.com'
    target_bucket = oss2.Bucket(auth, target_endpoint, target_bucket_name)
    target_bucket.put_object(object_name, remote_stream)

    return 'success'

4、関数呼び出し用のトリガーも作成する、「OSSトリガー」を選択: f:id:sbc_zmm:20200310163615p:plain

トリガーの詳細を設定する: f:id:sbc_zmm:20200311171310p:plain

ロールの作成が必要な場合は、作成して、付与する: f:id:sbc_zmm:20200310163859p:plain

OSSへのアクセス権限も付与しておく: f:id:sbc_zmm:20200310164026p:plain

北京リージョンのOSSにファイルをアップロードする f:id:sbc_zmm:20200311155730p:plain

東京リージョンのOSSにも同じファイルが確認できている: f:id:sbc_zmm:20200311155909p:plain

Log serviceと連携している場合は、呼び出し成功のログも確認できます: f:id:sbc_zmm:20200310171231p:plain

こうして、うまくFunctionComputeを利用してリージョン間のファイル同期ができる。

ソリューション化

この検証結果を踏まえ、AlibabaCloudの他のプロダクトと組み合わせて、いろんなソリューションを考案できます。

この構成の特徴:

・運用コストを抑える、開発サーバがいらない、Function computeのコードのみ面倒見ればいいです。

・ネットワーク費用削減、CENのような高価なダイレクトアクセスを利用しなくてリージョン間の転送が実現する。

・サーバーの構築不要

・ファイル同期する際のみ関数呼び出し、効率的にリソースを利用

なので、もし下記のようなビジネスニーズがある場合、活用できるではないかと思います:

・グローバルリージョン間のデータ転送必要がある

・コスト抑える必要ある

・ネットワークによる同期遅延をある程度許容できる

以上で、FunctionComputeの簡単なシナリオ紹介でした。