このトピックでは、Security Token service (STS) ポリシーを使用して、30分以内にモバイルアプリの直接データ転送サービスを設定する方法について説明します。 直接データ転送を使用すると、モバイルアプリを使用してObject Storage Service (OSS) に接続できます。 これにより、データをアップロードおよびダウンロードし、制御フローのみをアプリケーションサーバーに送信できます。
前提条件
背景情報
モバイルインターネット時代では、モバイルアプリを使用して大量のデータをアップロードしています。 OSSはデータストレージの問題を処理するのに役立ち、アプリの開発に集中できます。
モバイルアプリ向けのOSSベースの直接データ転送には、次の利点があります。
データセキュリティ: OSSでは、モバイルアプリが柔軟な承認および認証方法に基づいてデータをアップロードおよびダウンロードできます。 これにより、データのセキュリティが確保されます。
費用対効果: 少数のアプリサーバーが必要です。 これはコスト削減に役立ちます。 モバイルアプリはデータのアップロードとダウンロードのためにOSSに接続され、制御フローのみがアプリサーバーに送信されます。
高い同時実行性: OSSは、多数のユーザーから送信される同時アクセス要求をサポートします。
Elasticスケーラビリティ: OSSはスケーラブルなストレージスペースを提供します。
データ処理: OSSは、画像処理 (IMG) とオーディオおよびビデオトランスコーディングをサポートしているため、ユーザーは柔軟にデータを処理できます。
処理中
次の図は、モバイルアプリの直接データ転送サービスの開発プロセスを示しています。
ロールの説明:
AndroidまたはiOSアプリ: アプリサーバーからSTSトークンを適用し、STSトークンを使用するモバイルデバイス上のアプリ。
OSS: モバイルアプリからのデータ要求を処理します。
Resource Access Management (RAM)/STS: 一時的なアップロードトークンを生成します。
アプリサーバー: AndroidまたはiOSアプリ用に開発されたバックエンドサービス。 アプリサーバーは、アプリとアプリがアップロードしたデータのメタデータを使用して、データのアップロードとダウンロードのトークンを管理するために使用されます。
手順:
モバイルアプリは、アプリサーバーからの一時的なアップロード資格情報としてトークンを申請します。
セキュリティ上の懸念から、AccessKeyペアはAndroidアプリとiOSアプリに保存できません。 モバイルアプリは、アプリサーバーからトークンを申請する必要があります。 トークンは特定の期間有効です。 アプリサーバーの開発者がトークンの有効期間を30分に設定した場合、AndroidまたはiOSアプリはトークンを使用して、トークンが発行されてから30分以内にOSSにデータをアップロードまたはOSSからデータをダウンロードできます。 30分後、アプリはデータをアップロードまたはダウンロードするための新しいトークンを要求する必要があります。
アプリサーバーは、リクエストの有効性をチェックしてから、アプリにトークンを返します。
AndroidまたはiOSアプリは、このトークンを使用してOSSにデータをアップロードまたはOSSからデータをダウンロードします。
次のセクションでは、アプリサーバーがトークンを生成する方法と、AndroidまたはiOSアプリを使用してトークンを取得する方法について説明します。
手順
手順1: STSの有効化とアプリケーションサーバーの設定
迅速な展開
ROS (Resource Orchestration Service) を使用して、STSの有効化、ECS (Elastic Compute Service) インスタンスの設定、およびECSインスタンスへのアプリケーションサーバーのソースコードのデプロイを行うことができます。 ROSを使用してSTSをアクティブ化し、アプリケーションサーバーを構成するには、次の手順を実行します。
ROSコンソールの [スタックの作成] ウィザードに移動します。
ROSコンソールの [スタックの作成] ウィザードの [テンプレートの選択] ステップで、スタック名と作成するOSSバケットの名前を入力します。 購入するECSインスタンスのゾーン、インスタンスタイプ、システムディスクカテゴリ、およびパスワードを指定し、作成する をクリックします。
表示されるページの [スタック情報] タブで、スタックのステータスは [作成中] になります。
スタックのステータスが [作成済み] になったら、[出力] タブをクリックして、数回クリックするだけでデプロイされるECSインスタンスやOSSバケットなどのリソースを表示します。
手動展開
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、[概要] をクリックします。
[共通機能] セクションで、 を選択します。
STSクイック設定ページで、[開始] をクリックします。 画面の指示に従って、承認を完了します。
認証が完了したら、RAMユーザーのAccessKey ID、AccessKey secret、およびRoleArnパラメーターを保存します。
アプリケーションサーバーコードパッケージをダウンロードして解凍します。
PHP
Java
Ruby
Node.js
Go
config.jsonという名前の設定ファイルを変更します。
次のサンプルコードは、構成ファイルを変更する方法の例を示しています。
{ "AccessKeyID" : "" 、"AccessKeySecret" : "" 、"RoleArn" : "" 、"TokenExpireTime" : "900" 、"PolicyFile": "policy/bucket_write_policy.txt" }
次の表に、上記のコードのパラメーターを示します。
パラメーター
説明
AccessKeyID
取得したAccessKey ID。
AccessKeySecret
取得したAccessKeyシークレット。
RoleArn
得られたRoleArn。
TokenExpireTime
AndroidまたはiOSアプリを使用して取得したトークンの有効期間。 デフォルト値900は最小値です。 単位は秒です。
ポリシーファイル
トークンの権限を一覧表示するファイル。 既定値のままにすることができます。
ポリシーディレクトリでは、次のトークンファイルが最も一般的に使用されます。
bucket_read_policy.txt: 現在のアカウントの特定のプレフィックスを名前に含む特定のバケットとオブジェクトからデータを読み取る権限をトークンに付与することを指定します。
bucket_write_policy.txt: 現在のアカウントの特定のプレフィックスを名前に含む特定のバケットとオブジェクトにデータを書き込む権限をトークンに付与することを指定します。
トークンファイルを使用するには、
$BUCKET_NAME
と$OBJECT_PREFIX
を特定の値に置き換えます。詳細については、「概要」のポリシーの例と実装をご参照ください。
警告ビジネス要件に基づいて、最小特権 (PoLP) の原則に従います。 すべてのリソース (resource:*) またはすべてのアクション (action:*) を指定すると、過剰な権限によりデータ漏洩などのセキュリティリスクが発生する可能性があります。
サンプルコードは参考用です。 オンラインシステムは、異なるユーザーまたはデバイスに対して権限の分離を実装する必要があります。 このようにして、異なる権限を付与するために使用されるトークンが生成されます。
サンプルコードを実行します。
PHP
次のコマンドを実行してトークンを生成します。
php sts.php
指定したアプリケーションサーバーアドレスにアプリをデプロイします。
Java
説明Java依存関係1.7が必要です。
次のコマンドを実行してサービスを開始します。
java -jar app-token-server.jar (ポート)
ポートを指定しない場合、プログラムはポート7080でリスニングを開始します。 リスニングに使用するポートは指定できますが、すでに存在するポートは指定できません。
AssumeRole操作を呼び出して、レスポンスを取得します。
レスポンスには次の情報が含まれます。
// 成功したサンプル応答。 { // アプリがトークンを取得したときに返されるHTTPステータスコード。 トークンが取得されると、アプリはHTTPステータスコード200を返します。 "statusCode": "20"、 // OSSClientインスタンスを初期化するためにAndroidまたはiOSアプリで使用できるAccessKey ID。 "AccessKeyId":"STS.3p***dgagdasdg", // OSSClientインスタンスを初期化するためにAndroidまたはiOSアプリで使用できるAccessKeyシークレット。 "AccessKeySecret":"rpnwO9***tGdrddgsR2YrTtI", // OSSClientインスタンスを初期化するためにAndroidまたはiOSアプリで使用できるトークン。 "SecurityToken":"CAES wMIARKAAZhjH0EUOIhJMQBMjRywXq7MQ/cjLYg80Aho1ek0Jm63XMhr9Oc5s ∂ ˙∂ ˙∂ 3qaPer8p1YaX1NTDiCFZWFkvlHf1pQhuxfKBc + mRR9KAbHUefqH + rdjZqjTF7p2m1wJXP8S6k G2MpHrUe6TYBkJ43GhhTVFMuM3BZajY3VjZWOXBIODRIR1FKZjIiEjMzMzE0MjY0NzM5MTE4NjkxMSoLY2xpZGSSDgSDGAGESGTETqOio6c2RrLWRlbW8vKgoUYWNzOm9zczoqOio6c2RrLWRlbW9KEDExNDg5MzAxMDcyNDY4MThSBTI2ODQyWg9Bc3N1bWVkUm9sZVVzZXJgAGoSMzMzMTQyNjQ3MzkxMTg2OTExcglzZGstZGVt ****" 、 // トークンの有効期限。 OSS SDK for Androidは、トークンが有効かどうかをチェックします。 トークンが無効になると、新しいトークンが自動的に取得されます。 "有効期限":"2017-12-12T07:49:09Z" } // 失敗したサンプル応答。 { // アプリがトークンを取得したときに返されるHTTPステータスコード。 トークンの取得に失敗した場合、HTTPステータスコードの500が返されます。 "statusCode": "20"、 // エラーの原因。 "ErrorCode":"InvalidAccessKeyId.NotFound", // エラーメッセージ。 "ErrorMessage":"指定されたアクセスキーが見つかりません。}
ステップ2: モバイルアプリのダウンロードとインストール
モバイルアプリのソースコードパッケージをダウンロードします。
モバイルアプリを開き、アプリのパラメーターを設定します。
App server: ステップ1で指定されたapp serverアドレス。
宛先バケット: モバイルアプリからデータがアップロードされるバケット。
リージョン: 宛先バケットが配置されているリージョン。
OSSオブジェクト名: この名前には、アプリサーバーのポリシー設定ファイルで指定されたプレフィックスが含まれている必要があります。
[設定] をクリックします。
手順3: モバイルアプリの直接データ転送の設定
モバイルアプリを開きます。
[画像の選択] をクリックします。 アップロードする画像を選択し、オブジェクト名を指定します。
オブジェクトがアップロードされたら、OSSコンソールでアップロード結果を確認します。
コアコード解析
次のコードは、OSS SDK for AndroidおよびOSS SDK for iOSを使用してOSSClientインスタンスを初期化する方法の例を示しています。
Android
// OSSAuthCredentialsProviderを使用することを推奨します。 トークンは、有効期限が切れると自動的に更新されます。
String stsServer = "アプリケーションサーバーのアドレス (https://example.com:8080など)"
OSSCredentialProvider credentialProvider=新しいOSSAuthCredentialsProvider(stsServer);
// 以下のパラメータを指定します。ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15*1000); // 接続タイムアウト時間 (秒) 。 デフォルト値:15。
conf.setSocketTimeout(15*1000); // ソケットのタイムアウト時間 (秒) 。 デフォルト値:15。
conf.setMaxConcurrentRequest(5); // The maximum number of concurrent requests. 既定値:5
conf.setMaxErrorRetry(2); // リトライの最大数。 デフォルト値:2
OSS oss = new OSSClient(getApplicationContext() 、endpoint、credentialProvider、conf);
iOS
OSSClient * client;
...
// OSSAuthCredentialProviderの使用を推奨します。 トークンは、有効期限が切れると自動的に更新されます。
id<OSSCredentialProvider> credential = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:@ "https://example.com:8080などのアプリサーバーアドレス"];
client = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential];