(その1:Hello World編はこちら)
https://qiita.com/araidon/items/6ae7067efe92ecaec776
(その2:S3 put編はこちら)
https://qiita.com/araidon/items/56d7942dbd19ec1c1e87
(その2:OCIからAWSサービスを扱う編はこちら)
https://qiita.com/araidon/items/fbe7bab007195b5f9c38
OCIクラウド移行ガイドとは
オンプレミスやAWSなど、複数のプラットフォームからOracle Cloud Infrastructureへの移行プロジェクトに取り組んでいるクラウドエンジニア(@araidon,@kazunishi,@yama6)による、OCI移行手順をまとめたシリーズ記事です。
各回、サンプルワークロードから対象サービスを取り上げ、移行手順をガイドいたします。
まとめ記事は以下になります。
移行するサービス:AWS Lambda
今回、移行対象とするのはAWS Lambdaです。
例えばOCIに移行することが難しいAWSサービスに対して、AWS Lambdaからではなく、
OCI Functionsから利用します。
今回は、AWS LambdaからOCI Object Storageを扱います。
<イメージ画像>
前提条件
- 言語はPythonとします
- AWSのアカウントは作成済みとします
- OCIのアカウントは作成済みとします
- アカウントの管理者権限を有している
OCIのS3互換APIとは
OCIのObject Storage がAmazon S3のAPIと互換性を持つように設計されたAPIです。
これにより、既存のS3クライアントやツールを使用して、OCIのObject Storageにアクセスすることができます。
主な特徴
- 互換性
Amazon S3のAPIと互換性があるため、既存のS3クライアントやツールをそのまま使用できます。 - シームレスな移行
既存のS3ベースのアプリケーションをOCIに移行する際に、コードの変更を最小限に抑えることができます。 - セキュリティ
OCIのセキュリティ機能(IAM、暗号化など)を活用しながら、S3互換APIを使用できます。
1. 準備
1-1(OCI)Object Storageを扱う権限ユーザの顧客秘密キーを作成
1-2(OCI)オブジェクト・ストレージ・ネームスペースを確認
■オブジェクト・ストレージ・ネームスペースとは
テナント名とは別に、OCIテナントに一意に割り当てられる識別子です。
オブジェクトストレージ内のバケットやオブジェクトを一意に識別するために使用されます。
1-3(OCI)対象のコンパートメントを指定する
S3互換APIを利用する際に、テナントのコンパートメントは1つだけの制約があります。
複数のコンパートメントを扱うことができないのは十分に留意する必要があります。
2. 実装
2-1(AWS)対象のLambdaに、環境変数を指定する
AWSにて、作成したLambdaの構成に、アクセスキー、シークレットキー、namespace、リージョンを登録します。
キー | 値 |
---|---|
OCI_SECRET_ACCESS_KEY | (OCIで作成したシークレットアクセスキー) |
OCI_ACCESS_KEY_ID | (OCIで作成したアクセスキー) |
REGION_NAME | (アクセスするOCIリージョン) |
NAMESPACE | (OCIのテナントに割当てられたnamespace) |
import boto3
import os
def lambda_handler(event, context):
# Lambdaの環境変数から変数取得
access_key_id = os.getenv('OCI_ACCESS_KEY_ID') # OCIのアクセスキー
secret_access_key = os.getenv('OCI_SECRET_ACCESS_KEY') # OCIのシークレットアクセスキー
namespace = os.getenv('NAMESPACE') # OCIのテナントに割当てられたnamespace
region_name = os.getenv('REGION_NAME') # OCIのリージョン名
# boto3を利用して、S3オブジェクトを作成
s3 = boto3.resource(
's3',
aws_access_key_id=access_key_id,
aws_secret_access_key=secret_access_key,
region_name=region_name, # Region name here that matches the endpoint
endpoint_url="https://" + namespace + ".compat.objectstorage." + region_name + ".oraclecloud.com"
)
# S3バケット一覧を取得して表示
print("■OCIバケット一覧")
for bucket in s3.buckets.all():
print(bucket.name)
# 特定のバケットを指定して、オブジェクト一覧を取得して表示
oci_bucket_name = "oci_bucket_fromaws" # 特定のバケット名を指定
print("■OCIオブジェクト一覧")
bucket = s3.Bucket(oci_bucket_name)
for obj in bucket.objects.all():
print(obj.key)
3. 検証
上記Lambadaの実行結果ログ
Status: Succeeded
Test Event Name: test_s3compatibilityapi
Response:
null
Function Logs:
START RequestId: 0c2d88df-249b-42b3-a060-2269074a329b Version: $LATEST
■OCIバケット一覧
oci_bucket_fromaws
■OCIオブジェクト一覧
computer_cloud_system.png
END RequestId: 0c2d88df-249b-42b3-a060-2269074a329b
REPORT RequestId: 0c2d88df-249b-42b3-a060-2269074a329b Duration: 3753.55 ms Billed Duration: 3754 ms Memory Size: 128 MB Max Memory Used: 85 MB Init Duration: 326.19 ms
Request ID: 0c2d88df-249b-42b3-a060-2269074a329b
まとめ
意外と簡単に実装できることがわかると思います。
OCI側でキーの発行などシークレットキーとアクセスキーを発行して、LambdaでBoto3を利用するだけです。
参考