このトピックでは、Security Token Service (STS) を使用して、30分以内にモバイルアプリケーションの直接データ転送サービスを設定する方法について説明します。 このサービスを使用すると、モバイルアプリケーションを Object Storage Service (OSS) に直接接続し、モバイルアプリケーションから OSS にデータをアップロードしたり、OSS からモバイルアプリケーションにデータをダウンロードしたりできます。 アプリケーションサーバーを使用して、STS から取得した認証情報のみを管理する必要があります。 これにより、データ転送の効率とセキュリティが確保されます。
メリット
モバイルインターネット時代には、モバイルアプリケーションを使用して大量のデータがアップロードされます。 OSS ベースのモバイルアプリケーションの直接データ転送には、次の利点があります。OSS ベースのモバイルアプリケーションの直接データ転送には、次の利点があります。
データセキュリティ: OSS を使用すると、モバイルアプリケーションは柔軟な権限管理メカニズムに基づいてデータをアップロードおよびダウンロードできます。 これにより、データセキュリティが向上します。
費用対効果: 少数のアプリケーションサーバーが必要です。 これにより、コストを削減できます。 モバイルアプリケーションは、データのアップロードとダウンロードのために OSS に接続され、制御フローのみがアプリケーションサーバーに送信されます。
高同時実行性: OSS は、多数のユーザーから送信される同時アクセスリクエストをサポートし、ユーザーエクスペリエンスを保証します。
柔軟なスケーラビリティ: OSS は、ビジネスの成長の要件を満たすために、無制限でスケーラブルなストレージ容量を提供します。
データ処理: OSS は、画像処理 (IMG) とオーディオおよびビデオトランスコードをサポートしており、ユーザーは柔軟な方法でデータを処理できます。
前提条件
OSS がアクティブ化されていること。 詳細については、「OSS をアクティブ化する」をご参照ください。
バケットが作成されていること。 詳細については、「バケットを作成する」をご参照ください。
プロセス
次の図は、モバイルアプリケーションの直接データ転送サービスの開発プロセスを示しています。
手順:
Android または iOS アプリケーションは、アプリケーションサーバーから一時的なアクセス認証情報をリクエストします。
説明セキュリティ上の懸念から、AccessKey ペアを Android および iOS アプリケーションに保存することはできません。 この場合、アプリケーションは、アプリケーションサーバーから STS を使用してセキュリティトークンをリクエストできます。 セキュリティトークンは、特定の期間有効です。 アプリケーションサーバーが 30 分の有効期間を指定した場合、Android または iOS アプリケーションは、セキュリティトークンが発行されてから 30 分以内に、セキュリティトークンを使用して OSS にデータをアップロードしたり、OSS からデータをダウンロードしたりできます。 30 分後、アプリケーションは新しいセキュリティトークンをリクエストして、データをアップロードまたはダウンロードする必要があります。
アプリケーションサーバーは、STS SDK を使用して AssumeRole 操作を呼び出し、セキュリティトークンを取得します。
STS はセキュリティトークンを生成し、アプリケーションサーバーに返します。
アプリケーションサーバーは、セキュリティトークンをクライアントに返します。
Android または iOS アプリケーションは、OSS SDK を使用して、セキュリティトークンを使用して OSS にオブジェクトをアップロードします。
OSS は、成功応答をクライアントに返します。
手順
ステップ 1: STS をアクティブ化し、アプリケーションサーバーを設定する
1. RAM コンソールで RAM ユーザーを作成する
RAM ユーザーを作成し、RAM ユーザーの AccessKey ペアを取得します。 AccessKey ペアは、アプリケーションサーバーにアクセスして管理するために必要な長期アクセス認証情報です。
Alibaba Cloud アカウントまたはアカウント管理者として RAM コンソール にログオンします。
左側のナビゲーションウィンドウで、[Identities] > [Users] を選択します。
[ユーザー] ページで、[ユーザーの作成] をクリックします。
[ログオン名] パラメーターと [表示名] パラメーターを設定します。
[アクセスモード] セクションで、[永続 Accesskey を使用してアクセスする] を選択し、[OK] をクリックします。
重要RAM ユーザーの AccessKey シークレットは、RAM ユーザーの作成時にのみ取得できます。 認証情報の漏洩を防ぐため、AccessKey シークレットを安全に保管する必要があります。
表示されるページの [アクション] 列にある [コピー] をクリックして、AccessKey ペアをコピーし、安全に保管されたファイルに貼り付けます。
2. RAM コンソールで、RAM ユーザーに AssumeRole 操作を呼び出す権限を付与する
RAM ユーザーに AssumeRole 操作を呼び出す権限を付与します。 これにより、RAM ユーザーは RAM ロールをアシュームすることで一時的なアクセス認証情報を取得できます。
左側のナビゲーションウィンドウで、[Identities] > [Users] を選択します。
[ユーザー] ページで RAM ユーザーを見つけ、[アクション] 列の [権限の追加] をクリックします。
[権限の付与] パネルの [ポリシー] セクションで、[aliyunstsassumeroleaccess] システムポリシーを選択します。
説明AliyunSTSAssumeRoleAccess ポリシーにより、RAM ユーザーは AssumeRole 操作を呼び出すことができます。 ポリシーの権限は、RAM ユーザーが STS から一時的なアクセス認証情報を取得し、OSS にリクエストを開始するために必要な権限とは無関係です。
[権限の付与] をクリックします。
3. RAM コンソールで RAM ロールを作成する
Alibaba Cloud アカウントの RAM ロールを作成し、RAM ロールの Alibaba Cloud リソースネーム (ARN) を取得します。 RAM ロールは、後で RAM ユーザーによってアシュームされます。
左側のナビゲーションウィンドウで、[ID] > [ロール] を選択します。
[ロールの作成] をクリックします。 [ロールの作成] ウィザードで、[信頼できるエンティティの選択] を [alibaba Cloud アカウント] に設定し、[次へ] をクリックします。
[ロールの設定] ステップで、[RAM ロールの名前] フィールドに名前を入力し、[信頼できる Alibaba Cloud アカウントの選択] を [現在の Alibaba Cloud アカウント] に設定します。
[OK] をクリックします。 ロールを作成した後、[閉じる] をクリックします。
[ロール] ページで、検索ボックスにロール名を入力します。 例:
oss-web-upload。 ロールの名前をクリックします。[基本情報] セクションで、[ARN] フィールドの横にある [コピー] をクリックして、RAM ロールの ARN を記録します。
4. RAM コンソールでアップロード用のポリシーを作成する
最小権限の原則に基づいてカスタムポリシーを作成します。 カスタムポリシーは、RAM ロールに特定のバケットにのみデータをアップロードする権限を付与します。
左側のナビゲーションウィンドウで、[権限] > [ポリシー] を選択します。
[ポリシー] ページで、[ポリシーの作成] をクリックします。
[ポリシーの作成] ページで、[JSON] をクリックします。 次のサンプルスクリプトをコピーしてコードエディターに貼り付けます。
<BucketName>を、作成したバケットの名前であるweb-direct-uploadに置き換えます。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": "acs:oss:*:*:<BucketName>/*" } ] }ポリシーを設定した後、[ポリシー情報を編集するために次へ] をクリックします。
[基本情報] セクションで、ポリシー名を指定し、[OK] をクリックします。
5. RAM コンソールでカスタムポリシーを RAM ロールにアタッチする
カスタムポリシーを RAM ロールにアタッチします。 これにより、RAM ロールがアシュームされたときに、RAM ロールは必要な権限を提供できます。
左側のナビゲーションウィンドウで、[ID] > [ロール] を選択します。
[ロール] ページで RAM ロールを見つけ、[アクション] 列の [権限の付与] をクリックします。
[権限の付与] パネルの [ポリシー] セクションで、ドロップダウンリストから [カスタムポリシー] を選択し、カスタムポリシーを選択します。
[OK] をクリックします。
6. アプリケーションサーバーとして ECS インスタンスを作成する
STS から一時的なアクセス認証情報を取得するために ECS インスタンスを作成します。
実際のデプロイシナリオでは、ECS インスタンスを作成せずに、STS API 操作をアプリケーションサーバーに統合できます。
パラメーター | 例 |
課金方法 | 従量課金制 |
リージョン | 中国 (杭州) |
パブリック IP アドレス | パブリック IPv4 アドレスを割り当てる |
セキュリティグループ | HTTP-TCP:80-open |
詳細については、「ECS インスタンスを作成する」をご参照ください。
7. アプリケーションサーバーから一時的なアクセス認証情報を取得する
STS SDK をアプリケーションサーバーに統合して、/get_sts_token 操作を取得し、STS から一時的なアクセス認証情報を取得します。 HTTP GET メソッドを使用して /get_sts_token 操作が呼び出されると、一時的なアクセス認証情報が作成され、リクエスト元に返されます。
ECS インスタンスで、Flask フレームワークを使用して Web アプリケーションを構築し、STS から一時的なアクセス認証情報を取得する操作を実装します。
ECS インスタンスに接続します。
詳細については、「インスタンスに接続する」をご参照ください。
Python 3 をインストールします。
プロジェクトディレクトリを作成し、プロジェクトディレクトリに切り替えます。 サンプルコマンド:
mkdir my_web_sample cd my_web_sample次のコマンドを実行して依存関係をインストールします。
pip3 install Flask pip3 install attr pip3 install yarl pip3 install async_timeout pip3 install idna_ssl pip3 install attrs pip3 install aiosignal pip3 install charset_normalizer pip3 install alibabacloud_tea_openapi pip3 install alibabacloud_sts20150401 pip3 install alibabacloud_credentialsアプリケーションバックエンドコードを記述します。
main.pyファイルを作成します。次の Python コードをファイルに書き込みます。
import json from flask import Flask, render_template from alibabacloud_tea_openapi.models import Config from alibabacloud_sts20150401.client import Client as Sts20150401Client from alibabacloud_sts20150401 import models as sts_20150401_models from alibabacloud_credentials.client import Client as CredentialClient app = Flask(__name__) # <YOUR_ROLE_ARN> を RAM ロールの ARN に置き換えます。 role_arn_for_oss_upload = '<YOUR_ROLE_ARN>' # STS のリージョンを指定します。 例: cn-hangzhou region_id = 'cn-hangzhou' @app.route("/") def hello_world(): return render_template('index.html') @app.route('/get_sts_token', methods=['GET']) def get_sts_token(): # CredentialClient の初期化時にパラメーターを指定しない場合、デフォルトの認証情報チェーンが使用されます。 # ローカルコンピューターでプログラムを実行する場合、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数から AccessKey ペアを取得できます。 # ECS または Elastic Container Instance でプログラムを実行する場合、ALIBABA_CLOUD_ECS_METADATA 環境変数を設定することで、バインドされたインスタンスのロールを指定できます。 SDK は STS から一時的なアクセス認証情報を自動的に取得します。 config = Config(region_id=region_id, credential=CredentialClient()) sts_client = Sts20150401Client(config=config) assume_role_request = sts_20150401_models.AssumeRoleRequest( role_arn=role_arn_for_oss_upload, # <YOUR_ROLE_SESSION_NAME> をカスタムセッションの名前に置き換えます。 role_session_name='<YOUR_ROLE_SESSION_NAME>' ) response = sts_client.assume_role(assume_role_request) token = json.dumps(response.body.credentials.to_map()) return token app.run(host="127.0.0.1", port=8000) # 他のアドレス (0.0.0.0 など) でリッスンするには、サーバー側で認証メカニズムを実装する必要があります。サンプルコードの
<YOUR_ROLE_ARN>を、ステップ 3 で作成した RAM ロールの ARN に置き換えます。サンプルコードの
<YOUR_ROLE_SESSION_NAME>をカスタムセッションの名前に置き換えます。
ステップ 1 で取得した AccessKey ペアを使用してアプリケーションを起動します。
ALIBABA_CLOUD_ACCESS_KEY_ID=<YOUR_AK_ID> ALIBABA_CLOUD_ACCESS_KEY_SECRET=<YOUR_AK_SECRET> python3 main.pyブラウザのアドレスバーに
http://<ECS-public-IP-address>/get_sts_tokenと入力します。成功応答の例:

Ctrl+Cを押してアプリケーションを停止します。
ステップ 2: モバイルアプリケーションをダウンロードしてインストールする
Android
モバイルアプリケーションの ソースコードパッケージ をダウンロードします。
Android または iOS デバイスでモバイルアプリケーションを使用して、画像を OSS にアップロードできます。 シンプルなアップロードと再開可能なアップロードがサポートされています。 ネットワーク品質が悪い場合は、再開可能なアップロードを使用することをお勧めします。 また、IMG を使用して画像のサイズを変更し、サムネイルを取得したり、画像にウォーターマークを追加したりすることもできます。
モバイルアプリケーションを開き、アプリケーションパラメーターを設定します。
STS 認証サーバー: ステップ 1 の出力情報にあるアプリケーションサーバーのアドレス。
デスティネーションバケット: モバイルアプリケーションからデータをアップロードするバケット。
リージョン: デスティネーションバケットが配置されているリージョン。
[設定] をクリックします。
iOS
モバイルアプリケーションの ソースコードパッケージ をダウンロードします。
Android または iOS デバイスでモバイルアプリケーションを使用して、画像を OSS にアップロードできます。 シンプルなアップロードと再開可能なアップロードがサポートされています。 ネットワーク品質が悪い場合は、再開可能なアップロードを使用することをお勧めします。 また、IMG を使用して画像のサイズを変更し、サムネイルを取得したり、画像にウォーターマークを追加したりすることもできます。
モバイルアプリケーションを開き、アプリケーションパラメーターを設定します。
AliyunOSSSDK を実行する前に、OSSTestMacros.h ファイルに必要なパラメーターを設定する必要があります。 必要なパラメーターには、OSS_BUCKET_PRIVATE、OSS_ENDPOINT、OSS_STSTOKEN_URL が含まれます。 OSS_STSTOKEN_URL を、ステップ 1 でデプロイされたアプリケーションサーバーのアドレスに設定します。

インスタンスを実行します。
ステップ 3: モバイルアプリケーションの直接データ転送を設定する
OSS オブジェクトの名前を指定します。 [アップロード] をクリックし、アップロードする画像を選択します。
画像がアップロードされた後、OSS コンソールでアップロード結果を確認します。