このトピックでは、セキュリティトークンサービス (STS) を使用して、ご利用のモバイルアプリケーション向けに 30 分以内で直接データアップロードサービスを迅速に設定する方法について説明します。このサービスにより、モバイルアプリケーションが Object Storage Service (OSS) との間でデータを直接アップロードおよびダウンロードできるようになります。アプリケーションサーバーはアクセスの制御のみを管理すればよく、効率的かつ安全なデータ転送を実現できます。
直接アップロードサービスを使用する理由
モバイルアプリケーションが扱うデータ量が増加するにつれて、ストレージ要件を OSS で管理し、アプリケーションのコアロジックに集中することができます。モバイルアプリケーションから OSS への直接データアップロードには、以下のメリットがあります。
-
データセキュリティ:柔軟な権限モデルを使用して、データのアップロードおよびダウンロードを安全に管理できます。
-
コスト効率:多数のサーバーを用意する必要がなくなります。モバイルアプリケーションは OSS に直接接続し、アプリケーションサーバーは制御フローのみを処理します。
-
高同時実行数:高同時実行リクエストを簡単に処理でき、スムーズなユーザーエクスペリエンスを確保できます。
-
弾力的なスケーリング:ビジネスの成長に応じて、オンデマンドでストレージ容量をスケーリングできます。
-
データ処理:画像処理や音声・動画トランスコーディングをシームレスに統合し、柔軟なデータ処理が可能です。
前提条件
仕組み
次の図は、モバイル向け直接アップロードサービスの開発ワークフローを示しています。
以下の手順に従ってください。
-
モバイルアプリケーションが、アプリケーションサーバーに一時的なアクセス認証情報をリクエストします。
説明Android または iOS アプリケーション内に AccessKey を直接保存しないでください。これにより、データ漏えいのリスクが高まります。代わりに、アプリケーションはアプリケーションサーバーから一時的なアクセス認証情報をリクエストする必要があります。これらの認証情報には有効期間が設定されています。たとえば、アプリケーションサーバーが有効期間を 30 分に設定した場合、モバイルアプリはその期間中、OSS との間でデータのアップロードおよびダウンロードにトークンを使用できます。30 分経過後は、アプリは新しい一時的なアクセス認証情報をリクエストする必要があります。
-
アプリケーションサーバーが STS SDK を使用して AssumeRole 操作を呼び出し、一時的なアクセス認証情報を取得します。
-
STS が一時的なアクセス認証情報を生成し、アプリケーションサーバーに返却します。
-
アプリケーションサーバーが一時的なアクセス認証情報をモバイルアプリに返却します。
-
モバイルアプリケーションが OSS SDK と一時的なアクセス認証情報を使用して、ファイルを OSS にアップロードします。
-
OSS が成功応答をモバイルアプリに返却します。
操作手順
ステップ 1:STS の有効化とアプリケーションサーバーの設定
1. RAM ユーザーの作成
まず、RAM ユーザーを作成し、その AccessKey ペアを取得します。このペアは、アプリケーションサーバーの長期的な ID 認証情報として機能します。
-
RAM コンソールに、Alibaba Cloud アカウント (root ユーザー) または管理者としてログインします。
-
左側のナビゲーションウィンドウで、Identities > Users を選択します。
-
[Create User] をクリックします。
-
Logon Name と Display Name を入力します。
-
Access Mode セクションで、OpenAPI Access を選択し、OK をクリックします。
RAM ユーザーの AccessKey Secret は作成時のみ表示されます。後から確認することはできません。必ず安全に保存してください。
-
操作 列で、コピー をクリックして、AccessKey ペア (AccessKey ID および AccessKey Secret) を保存します。
2. RAM ユーザーに AssumeRole 権限を付与
RAM ユーザーを作成したら、STS AssumeRole 操作を呼び出す権限を付与する必要があります。これにより、ユーザーは RAM ロールを偽装して一時的なアクセス認証情報を取得できます。
-
左側のナビゲーションウィンドウで、Identities > Users を選択します。
-
[Users] ページで対象の RAM ユーザーを見つけ、アクション列の [Add Permissions] をクリックします。
-
権限付与 ページで、AliyunSTSAssumeRoleAccess システムポリシーを選択します。
説明AliyunSTSAssumeRoleAccess ポリシーは、RAM ユーザーに STS AssumeRole 操作を呼び出す権限を付与します。この権限は、一時的なアクセス認証情報を取得するための権限や、それらの認証情報を使用して OSS リクエストを行うための権限とは別物です。
-
Grant permissions をクリックします。
3. RAM ロールの作成
現在の Alibaba Cloud アカウント向けに RAM ロールを作成し、RAM ユーザーが偽装するための対応するARN (Alibaba Cloud リソースネーム) を取得します。
-
左側のナビゲーションウィンドウで、Identities > Roles を選択します。
-
ロール作成 をクリックし、信頼できるエンティティの種類として アカウント を選択します。
-
現在の Alibaba Cloud アカウントを選択し、OK をクリックします。
-
ロール名を入力し、OK をクリックします。
-
Roles ページで作成したロールを見つけ、その名前をクリックします。ロール詳細ページで、ARN の横にある コピー をクリックして、ロールの ARN を保存します。
4. ファイルアップロード用のポリシーの作成
最小権限の原則に従い、特定の OSS バケットへのアップロードに限定するカスタムポリシーを RAM ロール向けに作成します。
-
左側のナビゲーションウィンドウで、Permissions > Policies を選択します。
-
Create Policy をクリックします。
-
Create Policy ページで、JSON タブをクリックします。ポリシーエディターで、
web-direct-uploadのように、作成したバケット名に置き換えます。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": "acs:oss:*:*:<your-bucket-name>/*" } ] } -
ポリシーを設定したら、次のステップ をクリックします。
-
Basic Information セクションで、ポリシー名を入力し、OK をクリックします。
5. RAM ロールへの権限付与
カスタムポリシーを RAM ロールに付与します。これにより、そのロールを引き受ける際に必要な権限が付与されます。
-
左側のナビゲーションウィンドウで、Identities > RAM ロール を選択します。
-
[RAM ロール]ページで、対象の RAM ロールを見つけ、[操作]列で[権限付与]をクリックします。
-
権限付与 ページで、カスタムポリシー を選択し、作成したカスタムポリシーを選びます。
-
OK をクリックします。
6. アプリケーションサーバーとして ECS インスタンスを作成
一時的な認証情報を生成するアプリケーションサーバーとして ECS インスタンスを作成します。
本番環境では、新しい ECS インスタンスを作成する代わりに、既存のアプリケーションサーバーに STS API 呼び出しを統合できます。
|
パラメーター |
例 |
|
Billing Method |
pay-as-you-go |
|
Region |
中国 (杭州) |
|
Public IP |
Assign Public IPv4 Address |
|
Security Group |
Allow access on TCP port 80 (HTTP) |
詳細については、「ECS インスタンスの作成」をご参照ください。
7. アプリケーションサーバー上で一時的な認証情報を取得
STS SDK を Web アプリケーションに統合し、一時的なアクセス認証情報を提供する API エンドポイントを作成します。モバイルアプリがこのエンドポイント(例:/get_sts_token)に HTTP GET リクエストを送信すると、サーバーが一時的なアクセス認証情報を生成して返却します。
次の例は、ECS インスタンス上で Flask フレームワークを使用して、一時的なアクセス認証情報を提供するエンドポイントを持つ Web アプリケーションを迅速に構築する方法を示しています。
-
ECS インスタンスに接続します。
詳細については、「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 インスタンス、ECI インスタンス、または Container Service 上で実行する場合は、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>を、ステップ 1.3 で保存したロール ARN に置き換えます。 -
コード内の
<YOUR_ROLE_SESSION_NAME>を、role_session_testのようなカスタムセッション名に置き換えます。
-
-
ステップ 1.1 で取得した AccessKey ペアを使用してアプリケーションを起動します。
ALIBABA_CLOUD_ACCESS_KEY_ID=<YOUR_AK_ID> ALIBABA_CLOUD_ACCESS_KEY_SECRET=<YOUR_AK_SECRET> python3 main.py -
Web ブラウザーで
http://<your_ecs_instance_public_ip>/get_sts_tokenにアクセスします。成功時の応答は次のようになります。

-
Ctrl+Cを押してアプリケーションを停止します。
ステップ 2:モバイルアプリのダウンロードと設定
Android
-
モバイルアプリケーションのソースコードをダウンロードします。
このモバイルアプリケーションを使用して OSS に画像をアップロードできます。シンプルアップロードと再開可能なアップロードの両方をサポートしています。不安定なネットワーク環境では、再開可能なアップロードを推奨します。また、アップロード前に画像処理サービスを使用して、画像のサイズ変更やウォーターマークの追加も可能です。
-
モバイルアプリケーションを開き、パラメーターを設定します。
-
STS 認証サーバー:ステップ 1:STS の有効化とアプリケーションサーバーの設定でデプロイしたアプリケーションサーバーのアドレスを入力します。
-
送信先バケット:モバイルアプリケーションがデータをアップロードするバケットです。
-
リージョン:送信先バケットが配置されているリージョンです。
-
-
[Configure] をクリックします。
iOS
-
モバイルアプリケーションのソースコードをダウンロードします。
このモバイルアプリケーションを使用して OSS に画像をアップロードできます。シンプルアップロードと再開可能なアップロードの両方をサポートしています。不安定なネットワーク環境では、再開可能なアップロードを推奨します。また、アップロード前に画像処理サービスを使用して、画像のサイズ変更やウォーターマークの追加も可能です。
-
モバイルアプリケーションを開き、パラメーターを設定します。
デモを実行する前に、OSSTestMacros.h ファイル内で
OSS_BUCKET_PRIVATE、OSS_ENDPOINT、およびOSS_STSTOKEN_URLなどの必須パラメーターを設定する必要があります。OSS_STSTOKEN_URLには、ステップ 1:STS の有効化とアプリケーションサーバーの設定でデプロイしたアプリケーションサーバーのアドレスを設定します。
-
デモを実行します。
ステップ 3:直接アップロードサービスのテスト
-
OSS オブジェクトの名前を指定し、[Upload] をクリックしてアップロードする画像を選択します。
-
アップロードが成功したら、OSS コンソールで結果を確認できます。