前回の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するソースコードに書き換えてみます。
OCI Functionsとは
一言でいうと、OCIでのFaaSサービスです。
いわゆるサーバレスサービスで、AWS Lambda、Azure Functions、Google Cloud Functions等と同等のサービスです。
AWS Lambdaと比較して、価格面で優位となっているようです。
前提条件
- 言語はPythonとします
- AWS LambdaとOCI Functionsの環境構築について、今回は触れません。
それぞれのインフラごとの違い
AWS
AWSのサービスを扱うために、AWS SDK for PythonことBoto3を使用します。
# ライブラリをインポート
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 を使用します。
# ライブラリをインポート
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に書き換えてみたいと思います。
参考