すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ApsaraDB RDS と OSS を使用してさまざまな構造のデータを格納する

最終更新日:Apr 10, 2025

このトピックでは、ApsaraDB RDS と Object Storage Service (OSS) を併用してさまざまな構造のデータを格納する方法について説明します。

OSS は、Alibaba Cloud が提供する安全で費用対効果が高く、信頼性の高いクラウドストレージサービスであり、大量のデータを格納するために使用されます。たとえば、アプリケーションがフォーラムソフトウェアの場合、ユーザープロフィールの写真やフォーラムの投稿などのリソースを OSS バケットに格納できます。このようにして、RDS インスタンスに格納する必要があるデータ量を削減できます。

サンプルコード

サンプルコードは Python 3.6 を使用して記述されています。

Python 用 OSS SDK のインストール方法の詳細については、「インストール」をご参照ください。

  1. 環境変数を設定します。

    Linux または macOS

    export OSS_ACCESS_KEY_ID=STS.xxxxxx
    export OSS_ACCESS_KEY_SECRET=xxxxxx
    export OSS_SESSION_TOKEN=xxxxxx

    Windows

    set OSS_ACCESS_KEY_ID=STS.xxxxxx
    set OSS_ACCESS_KEY_SECRET=xxxxxx
    set OSS_SESSION_TOKEN=xxxxxx
    説明

    一時的なアクセス認証情報は、セキュリティトークンサービス (STS) から取得され、1 時間有効です。Resource Access Management (RAM) ロールを使用して認証情報を自動的にローテーションすることをお勧めします。

  2. oss2.Bucket クラスを初期化します。

    #!/usr/bin/env python
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # V4 署名と環境変数から取得した認証情報を使用します。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # エンドポイントを入力します。HTTPS プロトコルを含める必要があります。
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'  # この例では、中国 (杭州) リージョンのエンドポイントが使用されています。
    
    # リージョンを指定してバケットを作成します。
    bucket = oss2.Bucket(
        auth,
        endpoint,
        'examplebucket',
        region='cn-hangzhou' # エンドポイントに対応するリージョン。
    )
  3. オブジェクトをアップロードします。

    # オブジェクトの完全なパスとローカルファイルの完全なパスを指定します。オブジェクトの完全なパスには、バケット名を含めることはできません。
    # デフォルトでは、ローカルファイルの完全なパスを指定しない場合、ローカルファイルはサンプルプログラムが属するプロジェクトのパスからアップロードされます。
    # info_old.txt オブジェクトをアップロードします。
    res1 = bucket.put_object_from_file("info_key.txt", "info_old.txt")
    print("res1-{0}".format(res1.status))
    
    # picture_old.png オブジェクトをアップロードします。
    res2 = bucket.put_object_from_file("picture_key.png", "picture_old.png")
    print("res2-{0}".format(res2.status))
  4. オブジェクトを取得します。

    # オブジェクトの完全なパスを指定します。完全なパスには、info_key.txt などのバケット名を含めることはできません。
    # オブジェクトをダウンロードし、指定したパス(例:D:\\info_new.txt)にファイルとして保存します。同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトによってファイルが上書きされます。同じ名前のファイルが存在しない場合は、ファイルが作成されます。
    res3 = bucket.get_object_to_file("info_key.txt", "D:\\info_new.txt")
    print("res2-{0}".format(res3.status))
    
    res4 = bucket.get_object_to_file("picture_key.png", "D:\\picture_new.png")
    print("res4-{0}".format(res4.status))

Elastic Compute Service (ECS) アプリケーションコードでは、ユーザー ID が RDS インスタンスに格納され、ユーザープロフィールの写真が OSS バケットに格納されるように指定されています。次の例は、Python コードスニペットを示しています。

#!/usr/bin/env python
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import mysql_client

def conn_client():
    sql = "SELECT id FROM users LIMIT 1" # ユーザー ID が users テーブルから取得されると仮定します。
    # V4 署名と標準の認証情報プロバイダーを使用します。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # プロトコルヘッダーを変更します。
    bucket = oss2.Bucket(auth, endpoint, 'oss-wwjtest', region='cn-hangzhou')

    # データベースクエリを実行します。
    user_id = mysql_client.fetch_one(sql)  # fetch_one が単一の値を返すことを確認します。
    object_path = f"{user_id}.png"  # 有効なオブジェクト名を指定する必要があります。
    local_path = f"your_path/{object_path}"  # 実際のパスを使用する必要があります。

    # オブジェクトをダウンロードします。
    bucket.get_object_to_file(object_path, local_path)
    # オブジェクトをアップロードします。
    bucket.put_object_from_file(object_path, local_path)

if __name__ == '__main__':
    conn_client()