5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【OCI クラウド移行ガイド】 AWS Lambda を OCI Functionsへ移行してみた(その1:Hello World編)

Last updated at Posted at 2023-10-22

OCIクラウド移行ガイドとは

オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニア(@araidon,@kazunishi,@yama6)による、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。
まとめ記事は以下になります。

移行するサービス:AWS Lambda

今回、移行対象とするのはAWS Lambdaです。

AWS Lambdaの公式サンプルのHello Worldのソースコードを元に、OCI Functionsで動くように書き換えて見ます。
image.png

OCI Functionsとは

一言でいうと、OCIでのFaaSサービスです。
いわゆるサーバレスサービスで、AWS Lambda、Azure Functions、Google Cloud Functions等と同等のサービスです。

AWS Lambdaと比較して、価格面で優位となっているようです。

image.png

前提条件

  • 言語はPythonとします
  • AWS LambdaとOCI Functionsの環境構築について、今回は触れません。

AWS LambdaのHello World公式サンプル

関数作成時の、設計図(blueprint)の、[Hello world function] python3.10を参照します。
image.png

(AWS)lambda_function.py
import json

print('Loading function')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])
    print("value2 = " + event['key2'])
    print("value3 = " + event['key3'])
    return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')

Lambdaのテストイベントとして、以下のjsonファイルを使用して呼び出します。

イベントjson
{
  "key1": "Hello world",
  "key2": "value2",
  "key3": "value3"
}

image.png

書き換えにあたり注意すること

AWS LambdaとOCI Functionsはサービスから呼び出される際のハンドラ部分の挙動が違います。

・Lambda

ランタイム設定のハンドラの設定が参照されます。
下記画像であれば、lambda_function.py の lambda_handler メソッドが読み込まれます。
image.png

AWSのhundler部分
def lambda_handler(event, context):

・OCI

functionsを定義する設定ファイル、 func.yaml 内の、entrypoint:列 が参照されます。
下記記載であれば、func.py の handler が読み込まれます。

func.yaml
schema_version: 20180708
name: hello-fromlambda
version: 0.0.7
runtime: python
build_image: fnproject/python:3.9-dev
run_image: fnproject/python:3.9
entrypoint: /python/bin/fdk /function/func.py handler
memory: 256

AWSのソースコードのファイル名とハンドラ名をそのまま使うのであれば、 entrypoint:列 を書き換え、lambda_function.py の lambda_handler メソッドが読み込まれるようにします。

func.yaml
entrypoint: /python/bin/fdk /function/lambda_function.py lambda_handler 

書き換え

先に完成版を見せます。

(OCI)lambda_function.py
import json
import io ### 1. 行追加-イベントデータの受信に必要 ###

print('Loading function')

def lambda_handler(ctx, data: io.BytesIO = None): ### 2. 書き換え-handlerの仕様違いによる変更 ###

    try: ### 3. 行追加-イベントデータからjsonに変換する際の例外処理に必要 ###
        event = json.loads(data.getvalue()) ### 4. 行追加-イベントデータからjsonに変換する処理 ###
        #print("Received event: " + json.dumps(event, indent=2))
        print("value1 = " + event['key1'])
        print("value2 = " + event['key2'])
        print("value3 = " + event['key3'])
    except (Exception, ValueError) as ex: ### 5. 行追加-イベントデータからjsonに変換する際の例外処理に必要 ###
        print("error pasrsing json payload" + str(ex)) ### 6. 行追加-イベントデータからjsonに変換する際の例外処理に必要 ###

    return event['key1']  # Echo back the first key value

5箇所の変更が必要でした。
イベントデータの受け取り部分に起因する行追加が5箇所、 handler の仕様違いによるメソッド定義行の変更が1箇所でした。

OCIでの動作確認

$ echo -n '{"key1": "Hello World", "key2": "value2", "key3": "value3"}' | fn invoke hello-app hello-fromlambda
Hello World
$ 

まとめ

元のソースコードが小さいだけに、書き換えが多いように見えました。
Lambda と Functionsの仕様吸収である程度は仕方ありませんが、実際はそこまで多くないようです。

次回は、S3と連携したLambdaを OCI Functionsに書き換えてみたいと思います。

参考

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?