このトピックでは、Security Token Service (STS) または署名付きURLによって提供される一時的なアクセス資格情報を使用して、Object Storage Service (OSS) リソースに一時的にアクセスする方法について説明します。
STSの一時アクセス資格情報と署名付きURLに有効期間を指定する必要があります。 一時的なアクセス資格情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付きURLを生成する場合、最小有効期間が優先されます。 たとえば、一時的なアクセス資格情報の有効期間を1,200秒に設定し、資格情報を使用して生成された署名付きURLの有効期間を3,600秒に設定できます。 この場合、STSの一時アクセス資格情報の有効期限が切れた後は、署名付きURLを使用してオブジェクトをアップロードすることはできません。
STS を使用した一時的アクセス許可
STSを使用して、OSSへの一時アクセスを許可できます。 STSは、ユーザーに一時的なアクセストークンを提供するwebサービスです。 STSを使用して、管理されているサードパーティのアプリケーションまたはRAMユーザーに、カスタムの有効期間とカスタムのアクセス許可を持つ一時的なアクセス資格情報を付与できます。 STSの詳細については、「STSの概要」をご参照ください。
STSには次の利点があります。
一時的なアクセストークンを生成し、そのアクセストークンをサードパーティのアプリケーションに送信するだけで済みます。 サードパーティのアプリケーションにAccessKeyペアを提供する必要はありません。 トークンのアクセス権限と有効期間を指定できます。
トークンは、有効期間後に自動的に期限切れになります。 したがって、トークンのアクセス権限を手動で取り消す必要はありません。
STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の手順を実行します。
ステップ1: RAMユーザーの作成
RAM コンソール にログインします。
左側のナビゲーションウィンドウで、アイデンティティ > [ユーザー] を選択します。
[ユーザー] ページで、ユーザーの作成 をクリックします。
ログイン名 および [表示名] パラメーターを設定します。
アクセスモード セクションで、[OpenAPIアクセス] を選択します。 そして、[OK] をクリックします。
表示されるページで、[コピー] をクリックしてRAMユーザーのAccessKeyペアを保存します。
ステップ2: RAMユーザーにAssumeRole権限を付与する
[ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。
権限の追加 パネルで、[システムポリシー] タブをクリックし、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。
[OK] をクリックします。
ステップ3: STSから一時的なアクセス資格情報を取得するために使用するロールを作成する
左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。
ロールの作成 をクリックします。 [ロールの作成] パネルで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。
ロールの作成 パネルで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択 を 現在の Alibaba Cloud アカウント に設定します。
[OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。
[ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索結果で [RamOssTest] をクリックします。
RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。
手順4: OSSにオブジェクトをアップロードおよびOSSからオブジェクトをダウンロードする権限をロールに付与する
カスタムポリシーを使用して、バケットにオブジェクトをアップロードおよびバケットからオブジェクトをダウンロードする権限をロールに付与します。
左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。
ポリシー ページで ポリシーの作成 をクリックします。
[ポリシーの作成] ページで、[JSON] をクリックします。 ポリシーエディターでスクリプトを変更して、PutObjectおよびGetObjectを呼び出して、examplebucketという名前のバケットにオブジェクトをアップロードおよびバケットからオブジェクトをダウンロードする権限をロールに付与します。 次のサンプルコードは、ロールに権限を付与する方法の例を示しています。
警告以下は参考例です。 ユーザーに過度の権限を与えないように、要件に基づいてきめ細かいRAMポリシーを構成する必要があります。 きめ細かいRAMポリシーを設定する方法の詳細については、「例9: RAMまたはSTSを使用してユーザーにOSSリソースへのアクセスを許可する」をご参照ください。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "OSS:のputObject"、 "oss:GetObject" ], "Resource": [ "acs:oss:*:*:examplebucket" 、 "acs:oss:*:*:examplebucket/*" ] } ] }
[次へ] をクリックしてポリシー情報を編集します。
[基本情報] セクションで、[名前] を [RamTestPolicy] に設定し、[OK] をクリックします。
カスタムポリシーをRamOssTestロールにアタッチします。
左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] を選択します。
[ロール] ページで、[RamOssTest] ロールを見つけます。
[操作] 列の [権限の追加] をクリックします。
[権限の追加] パネルで、[カスタムポリシー] タブをクリックし、[RamTestPolicy] ポリシーを選択します。
[OK] をクリックします。
ステップ5: STSを使用して一時的なアクセス資格情報を生成する
一時的なアクセス資格情報は、AccessKeyペアとセキュリティトークンで構成されます。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。
エクスプレスモジュールを使用するには、モジュールがインストールされていることを確認します。 expressモジュールをインストールするには、npm install express -- saveコマンドを実行します。
const { STS } = require('ali-oss ');
const express = require("express");
const app = express();
app.get('/sts', (req, res) => {
let sts=新しいSTS({
// 手順1でRAMユーザー用に作成したAccessKeyペアを指定します。
accessKeyId: 'yourAccessKeyId' 、
accessKeySecret: 'yourAccessKeySecret'
});
// 手順3で作成したロールのAlibaba Cloudリソース名 (ARN) を指定します。 例: acs:ram::175708322470 ****:role/ramtest。
// カスタムポリシーを指定します。 これにより、一時的なアクセス資格情報の権限を制限できます。 カスタムポリシーを指定しない場合、返される一時的なアクセス資格情報には、指定されたRAMロールの完全な権限が付与されます。
// 一時的なアクセス資格情報によって取得される権限は、手順4で設定されたロール権限とRAMポリシーで指定された権限の共通部分です。
// expirationは、一時的なアクセス資格情報の有効期間を指定します。 単位は秒です。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 この例では、有効期間は3,000秒に設定されています。
// sessionNameは、さまざまなトークンを区別するために使用されるカスタムロールセッション名を指定します。 例: sessiontest。
sts.assumeRole('acs:ram::175708322470 ****:role/ramtest', '', '3000', 'sessiontest').then((result) => {
console.log (結果);
res.set('Access-Control-Allow-Origin' 、'*');
res.set('Access-Control-Allow-METHOD' 、'GET');
res.json({
AccessKeyId: result.credentials.AccessKeyId、
AccessKeySecret: result.credentials.AccessKeySecret、
SecurityToken: result.credentials.SecurityToken,
有効期限: result.credentials。有効期限
});
}).catch((err) => {
console.log(err);
res.status(400).json(err.message);
});
});
app.listen(8000,()=>{
console.log("server listen on:8000")
})
手順6: 一時的なアクセス資格情報を使用して、OSSへのオブジェクトのアップロードとOSSからのオブジェクトのダウンロード
一時的なアクセス資格情報を使用してオブジェクトをOSSにアップロードする
constaxios=require("axios"); const OSS = require("ali-oss"); // 一時的なアクセス資格情報を使用して、クライアントでOSSClientインスタンスを初期化します。 インスタンスは、OSSリソースへの一時アクセスを許可するために使用されます。 const getToken = async () => { // クライアントが一時的なアクセス資格情報を取得するために使用するアドレスを指定します。 await axios.get("http:// localhost:8000/sts").then((トークン) => { const client = new OSS({ // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 リージョン: 'oss-cn-hangzhou' 、 accessKeyId: token.data.AccessKeyId、 accessKeySecret: token.data.AccessKeySecret、 stsToken: token.data.SecurityToken、 // バケットの名前を指定します。 bucket: "examplebucket" 、 // 一時的なアクセス資格情報を更新します。 refreshSTSToken: async () => { const refreshToken = await axios.get("http:// localhost:8000/sts"); return { accessKeyId: refreshToken.AccessKeyId、 accessKeySecret: refreshToken.AccessKeySecret、 stsToken: refreshToken.SecurityToken, }; }, }); // 一時的なアクセス資格情報を使用して、オブジェクトをOSSにアップロードします。 // オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampleobject.jpg。 // ローカルファイルのフルパスを指定します。 例: D :\\ example.jpg client.put('exampleobject.jpg ', 'D :\\ example.jpg').then((res)=>{ console.log(res)}).catch(e=>console.log(e)) }); }; getToken()
一時的なアクセス資格情報を使用してOSSからオブジェクトをダウンロードする
constaxios=require("axios"); const OSS = require("ali-oss"); // 一時的なアクセス資格情報を使用して、クライアントでOSSClientインスタンスを初期化します。 インスタンスは、OSSリソースへの一時アクセスを許可するために使用されます。 const getToken = async () => { // クライアントが一時的なアクセス資格情報を取得するために使用するアドレスを指定します。 await axios.get("http:// localhost:8000/sts").then((トークン) => { const client = new OSS({ // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 リージョン: 'oss-cn-hangzhou' 、 accessKeyId: token.data.AccessKeyId、 accessKeySecret: token.data.AccessKeySecret、 stsToken: token.data.SecurityToken、 // バケットの名前を指定します。 bucket: "examplebucket" 、 // 一時的なアクセス資格情報を更新します。 refreshSTSToken: async () => { const refreshToken = await axios.get("http:// localhost:8000/sts"); return { accessKeyId: refreshToken.AccessKeyId、 accessKeySecret: refreshToken.AccessKeySecret、 stsToken: refreshToken.SecurityToken, }; }, }); // 一時的なアクセス資格情報を使用して、OSSからオブジェクトをダウンロードします。 // オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampleobject.jpg。 // ローカルファイルのフルパスを指定します。 例: D :\\ example.jpg client.get('exampleobject.jpg ', 'D :\\ example.jpg').then((res)=>{ console.log(res)}).catch(e=>console.log(e)) }); }; getToken()
一時的なアクセス許可に署名付きURLを使用する
次のセクションでは、署名付きURLを使用して一時アクセスを許可する方法の例を示します。
署名付きURLを生成し、一時的なアクセスのためにサードパーティのユーザーにURLを提供できます。 署名付きURLを生成するときに、URLの有効期間を指定して、サードパーティユーザーがOSSリソースにアクセスできる期間を制限できます。
次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (+
) が含まれる場合があります。 この場合、URLのプラス記号 (+
) を % 2B
に置き換える必要があります。 そうでない場合、署名付きURLにアクセスできない可能性があります。
Image Processing (IMG) パラメータを含む署名付きURLを生成する
const OSS = require('ali-OSS ');
const store = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'yourRegion' 、
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、環境変数OSS_ACCESS_KEY_IDとOSS_ACCESS_KEY_SECRETが設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID、
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
// バケットの名前を指定します。
bucket: 'examplebucket'
})
// exampleobject.pngという名前のイメージを処理するために使用される署名付きURLを取得します。
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。
let url = store.signatureUrl('exampleobject.png ', {
process: 'image/resize,w_200 '// イメージの処理に使用するIMGパラメーターを設定します。
});
console.log(url);
// exampleobject.pngイメージの処理に使用される署名付きURLを取得し、URLの有効期間を指定します。
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。
let url = store.signatureUrl('exampleobject.png ', {
// 署名付きURLの有効期間を指定します。 デフォルトでは、有効期間は1,800秒です。
有効期限: 3600、
// イメージの処理に使用するIMGパラメーターを設定します。
プロセス: 'image/resize,w_200'
});
console.log(url);
バージョンIDを含む署名付きURLを生成する
const OSS = require('ali-OSS ');
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'yourRegion' 、
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、環境変数OSS_ACCESS_KEY_IDとOSS_ACCESS_KEY_SECRETが設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID、
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
// バケットの名前を指定します。
bucket: 'examplebucket'
})
// バージョンIDを含む署名付きURLを生成します。
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: example.png.
console.log (
client.signatureUrl('example.jpg ', {
subResource: {
// オブジェクトのバージョンIDを指定します。
versionId: 'CAEQMBiBgIDW7duIqxgiIDA4OWRiYmFlZDUxMDQ3YzM4OWUyNjQzMzAzMDhj **** ',
},
})
)
署名付きURLを生成し、署名付きURLを使用してオブジェクトをアップロードする
const OSS = require("ali-oss");
const { default: axios } = require("axios");
const fs = require("fs");
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
region: 'yourregion' 、
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、環境変数OSS_ACCESS_KEY_IDとOSS_ACCESS_KEY_SECRETが設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID、
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
// バケットの名前を指定します。
bucket: 'examplebucket' 、});
// オブジェクトの署名付きURLを生成します。
const url = client.signatureUrl("examplefile.txt", {
メソッド: "PUT" 、
"Content-Type": "application/x-www-form-urlencoded" 、});
// ローカルファイルのフルパスを指定します。
constファイル=fs.readFileSync("D :\\ localpath\\examplefile.txt");
// 署名付きURLを使用してオブジェクトをアップロードします。
axios({
url,
メソッド: "PUT" 、
data: ファイル、})
. then((r) => console.log(r))
. catch((e) => console.log(e));
署名付きURLを生成し、署名付きURLを使用してオブジェクトをダウンロードする
const { default: axios } = require("axios");
const fs = require("fs");
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'yourRegion' 、
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、環境変数OSS_ACCESS_KEY_IDとOSS_ACCESS_KEY_SECRETが設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID、
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
// バケットの名前を指定します。
bucket: 'examplebucket'
});
// オブジェクトの署名付きURLを生成します。
const url = client.signatureUrl("examplefile.txt");
// 署名付きURLを使用して、オブジェクトをローカルコンピューターにダウンロードし、オブジェクトの完全パスを入力します。
constファイル="D :\\ localpath\\examplefile.txt";
axios({
url,
メソッド: "GET" 、})
. then((r) => {
fs.writeFile (ファイル, r.data, (err) => {
if(err){
console.log(err);
}
});
})
. catch((e) => console.log(e));
よくある質問
POSTメソッドを使用して署名付きURLを生成できますか?
いいえ、POSTメソッドを使用して署名付きURLを生成することはできません。 署名付きURLを生成するには、PUTメソッドとGETメソッドのみを使用できます。 POSTメソッドを使用してオブジェクトをアップロードする場合は、POSTリクエストを作成する必要があります。 詳細は、「PostObject」をご参照ください。