(その1:Hello World編はこちら)
https://qiita.com/araidon/items/6ae7067efe92ecaec776
(その2:S3 put編はこちら)
https://qiita.com/araidon/items/56d7942dbd19ec1c1e87
OCIクラウド移行ガイドとは
オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニア(@araidon,@kazunishi,@yama6)による、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。
まとめ記事は以下になります。
移行するサービス:AWS Lambda
今回、移行対象とするのはAWS Lambdaです。
例えばOCIに移行することが難しいAWSサービスに対して、AWS Lambdaからではなく、
OCI Functionsから利用します。
今回は、OCIのObjectの画像を元に、AWS Rekognition で画像解析し、結果のJSONをOCIのObject Storageに保存します。
OCI Functionsとは
一言でいうと、OCIでのFaaSサービスです。
いわゆるサーバレスサービスで、AWS Lambda、Azure Functions、Google Cloud Functions等と同等のサービスです。
AWS Lambdaと比較して、価格面で優位となっているようです。
前提条件
- 言語はPythonとします
- AWSのアカウントは作成済みとします
- AWS LambdaとOCI Functionsの環境構築について、今回は触れません
- Functionsの環境構築手順は以下を参照願います(公式チュートリアル)
1. 準備
1-1. (AWS) アクセスキーとシークレットキーの作成
AWSにて、サービスに権限があるIAMユーザのアクセスキーとシークレットキーを作成します。
コンソールにて
IAM > ユーザー > アクセスキーを作成
1-2. (OCI) Functionsにアクセスキーとシークレットキーを登録
OCIにて、作成したFunctionsの構成に、アクセスキーとシークレットキーを登録します。
キー | 値 |
---|---|
aws_secret_access_key | (AWSで作成したシークレットアクセスキー) |
aws_access_key | (AWSで作成したアクセスキー) |
region | (アクセスするAWSリージョン) |
1-3. (OCI) 画像保管用のObject Storageと、結果保管用のObject Storageを作成
下記画像では、以下の2バケットを作成
1-4. (OCI) Object Storageにポリシーを付与
Functions実行ユーザーに、ポリシーを適用します。
# 例1. 特定のグループがテナンシ内の全バケットへのポリシー適用
Allow group (ユーザーの所属グループ) to manage buckets in tenancy
# 例2. 特定のグループが特定のコンパートメントにのみポリシー適用
Allow group (ユーザーの所属グループ) to manage buckets in compartment (コンパートメント名)
ポリシー設定の詳細は以下を参照
2. 実装
OCIからAWSのサービスを扱うために、AWS SDK for PythonことBoto3を使用します。
import json
import io
import os
import oci
import boto3
def handler(ctx, data: io.BytesIO = None):
# Functionsの環境変数から 変数取得
aws_access_key = os.getenv('aws_access_key')
aws_secret_access_key = os.getenv('aws_secret_access_key')
region = os.getenv('region')
# OCI Object Storage用の変数
namespace = "" # OCIテナントのnamespace
bucketName = "" # 画像作成用のバケット名
objectName = "" # アップロードしたオブジェクト名
bucketNameJson = "" # Jsonファイル格納用バケット名
# OCI SDKを利用して、OCI Object Storageを扱う
signer = oci.auth.signers.get_resource_principals_signer()
object_storage = oci.object_storage.ObjectStorageClient(config={}, signer=signer)
# 画像ファイルを取得
get_object = object_storage.get_object(namespace, bucketName, objectName)
# boto3を利用して、Rekognitionを使う
rekoclient = boto3.client('rekognition',
aws_access_key_id=aws_access_key,
aws_secret_access_key=aws_secret_access_key,
region_name=region
)
# Rekognitionのcelebritiesを利用して、有名人の顔を検出
response = rekoclient.recognize_celebrities(
Image = {"Bytes": get_object.data.content}
)
s = json.dumps(response, ensure_ascii=False, indent=2) # JSON形式の文字列に変換
# JSONファイルをObject Storageにアップロード
object_storage.put_object( namespace, bucketNameJson, objectName + "-celebrities.json", s)
3. 検証
Oracleの会長兼CTOのラリー・エリソンの画像を使って試してみます。
画像は以下の公式サイトから取得
https://www.oracle.com/jp/artificial-intelligence/larry-ellison-cloudworld-genai-strategy/
3-1. 画像アップロード
画像保管用のObject Storageに先程のファイルをアップロード
3-2. Functionsの実行
今回はCLIで実行
$ fn invoke toaws-app to-aws-rekognition
$
AWSのRekognitionのメトリクスで、Callされていることを確認
3-3 Outputを確認
結果確認用バケットにjsonファイルがアップロードされていることを確認
jsonの中身抜粋、 "Name": "Larry Ellison"となっていることを確認
{
"CelebrityFaces": [
{
"Urls": [
"www.wikidata.org/wiki/Q92759",
"www.imdb.com/name/nm0255213"
],
"Name": "Larry Ellison",
"Id": "3d1Jw1z",
"Face": {
"BoundingBox": {
"Width": 0.07612882554531097,
"Height": 0.24945056438446045,
"Left": 0.5756229162216187,
"Top": 0.10707202553749084
(中略)
"UnrecognizedFaces": [],
"ResponseMetadata": {
"RequestId": "4c440606-38f8-43a3-96f5-3f8ed2c41ed9",
"HTTPStatusCode": 200,
"HTTPHeaders": {
"x-amzn-requestid": "4c440606-38f8-43a3-96f5-3f8ed2c41ed9",
"content-type": "application/x-amz-json-1.1",
"content-length": "1349",
"date": "Mon, 26 Aug 2024 18:11:27 GMT"
},
"RetryAttempts": 0
}
}
まとめ
意外と簡単に実装できました。
AWS側でシークレットキーとアクセスキーを発行して、OCIでBoto3を利用するだけです。
それでは、より良いマルチクラウドライフを〜。
参考