LoginSignup
3
2

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

Last updated at Posted at 2023-11-06

前回のHello World編はこちら。
https://qiita.com/araidon/items/6ae7067efe92ecaec776

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

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

移行するサービス:AWS Lambda

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

AWS LambdaでInputの画像ファイルをS3へputするソースコードを、OCI FunctionsでObject Storageへputするソースコードに書き換えてみます。
image.png

OCI Functionsとは

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

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

image.png

前提条件

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

それぞれのインフラごとの違い

AWS

AWSのサービスを扱うために、AWS SDK for PythonことBoto3を使用します。

(AWS)Boto3 S3へのput
# ライブラリをインポート
import Boto3

# S3 バケット名
S3_BUCKET = '<保存先バケット名を指定>'

# ハンドラ
def lambda_handler(event, context):
    #画像データの取得
    image_data = event['body']  # eventの構造に応じて適切なフィールドを指定
    
    # S3を扱う
    s3 = boto3.resource('s3')
    file_name = '<ファイル名を指定>'  # S3に保存するファイル名を指定
    bucket = s3.Bucket( <BUCKET_NAME> )

    # S3にputするコマンド
    s3.put_object(
        Bucket=S3_BUCKET,
        Key=file_name,
        Body=image_data
    )

OCI

OCIのサービスを扱うために、boto3ではなく、Oracle Cloud Infrastructure SDK for Pythonこと oci を使用します。

(OCI)OCI Object Storageへのput
# ライブラリをインポート
import oci
import io # <- 画像データの取得に必要

# OS(Object Storage) バケット名
OS_BUCKET = '<保存先バケット名を指定>' 
NAME_SPACE = '<アカウントのnamespaceを指定>'

# ハンドラ
def handler(ctx, data: io.BytesIO=None):
    #画像データの取得
    image_data = io.BytesIO(data)  # リクエストdataの構造に応じて適切なフィールドを指定
    
    # Object Storageを扱う
    signer = oci.auth.signers.get_resource_principals_signer()
    object_storage = oci.object_storage.ObjectStorageClient(config={}, signer=signer)
    file_name = '<ファイル名を指定>'  # Object Storageに保存するファイル名を指定
    
    # Object Storageにputするコマンド
    object_storage.put_object(
        namespace=NAME_SPACE,
        bucket_name=OS_BUCKET,
        object_name=file_name,
        put_object_body=image_data
    )

まとめ

利用するSDKが違うのと、対象サービスが違うため、元のソースコードが小さい場合は全面的に書き換えが必要でした。
とはいえ、SDKのImport、サービスのObjectの取得、引数の指定という一連の流れなので、それほど難しいものではありません。

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

参考

3
2
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
3
2