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

Object Storage Service:STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスする

最終更新日:Dec 16, 2024

STS (Security Token Service) は、RAMユーザーに一時的なアクセス資格情報を発行することにより、OSS (Object Storage Service) 内の指定されたリソースへの時間制限付きアクセスをRAMユーザーに付与できます。 一時アクセス資格情報の有効期限が切れると、RAMユーザーは一時アクセス資格情報を使用してリソースにアクセスできなくなります。 STSは、アクセス制御の柔軟性と適時性を向上させます。

前提条件

バケット作成についての 詳細は、「バケットの作成」をご参照ください。

ステップ1: RAMユーザーの作成

  1. RAM コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、アイデンティティ > [ユーザー] を選択します。

  3. [ユーザー] ページで、ユーザーの作成 をクリックします。

  4. ログイン名 および [表示名] パラメーターを設定します。

  5. アクセスモード セクションで、[永続的なAccessKeyを使用してアクセスする] を選択します。 そして、[OK] をクリックします。

  6. プロンプトに従って完全なセキュリティ検証。

  7. AccessKeyペア (AccessKey IDとAccessKey secret) をコピーします。

    重要

    RAMユーザーのAccessKeyシークレットは、RAMユーザーを作成する場合にのみ取得できます。 認証情報の漏洩を防ぐため、AccessKeyシークレットを安全に保持する必要があります。

手順2: AssumeRole操作を呼び出す権限をRAMユーザーに付与する

RAMユーザーを作成したら、STSのAssumeRole操作を呼び出す権限をRAMユーザーに付与します。

  1. [ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。

  2. [権限付与] パネルの [ポリシー] セクションで、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。

    説明

    AliyunSTSAssumeRoleAccessポリシーを使用すると、RAMユーザーはAssumeRole操作を呼び出すことができます。 ポリシーの権限は、RAMユーザーがSTSから一時的なアクセス資格情報を取得してOSSへのリクエストを開始するために必要な権限とは無関係です。

    image.png

  3. [権限付与] をクリックします。

ステップ3: RAMロールの作成

RAMロールを作成して、RAMロールが引き受けられたときにRAMロールの権限を宣言します。

  1. 左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。

  2. ロールの作成 をクリックします。 [ロールの作成] ウィザードの [ロールタイプの選択] ステップで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。

  3. ロールの作成 ウィザードの [ロールの設定] ステップで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択現在の Alibaba Cloud アカウント に設定します。

  4. [OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。

  5. [ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索アイコンをクリックし、検索結果で [RamOssTest] をクリックします。

  6. RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。arn

手順4: OSSにオブジェクトをアップロードする権限をRAMロールに付与する

1つ以上のポリシーをRAMロールにアタッチして、RAMロールが引き受けられたときにOSSリソースに対する操作を実行する権限をRAMロールに付与します。 たとえば、RAMユーザーがこのRAMロールを引き受け、特定のOSSバケットにのみオブジェクトをアップロードする場合は、RAMロールに書き込み権限を付与するポリシーをアタッチする必要があります。

  1. オブジェクトをアップロードする権限をロールに付与するカスタムポリシーを作成します。

    1. 左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。

    2. ポリシー ページで ポリシーの作成 をクリックします。

    3. ポリシーの作成 ページで、[JSON] をクリックします。 コードエディターに次のスクリプトを入力して、RAMロールにexamplebucketバケットにオブジェクトをアップロードする権限を付与します。

      警告

      以下の例は参考情報です。 ユーザーに過度の権限を付与しないように、要件に基づいてきめ細かいRAMポリシーを構成する必要があります。 きめ細かいRAMポリシーを設定する方法の詳細については、「例9: RAMまたはSTSを使用してユーザーにOSSリソースへのアクセスを許可する」をご参照ください。

      {
          "Version": "1",
          "Statement": [
           {
                 "Effect": "Allow",
                 "Action": [
                   "oss:PutObject"
                 ],
                 "Resource": [
                   "acs:oss:*:*:examplebucket/*"             
                 ]
           }
          ]
      }
      説明

      Action要素は、RAMロールに付与する権限を指定します。 たとえば、oss:PutObjectを指定した場合、RAMロールを引き受けるRAMユーザーは、簡易アップロード、フォームアップロード、追加アップロード、マルチパートアップロード、再開可能アップロードなどのさまざまなアップロード方法を使用して、指定したバケットにオブジェクトをアップロードできます。 詳細については、「OSSのRAMポリシーのアクション要素」をご参照ください。

    4. [次へ] をクリックしてポリシー情報を編集します。

    5. [基本情報] セクションで、[名前][RamTestPolicy] に設定し、[OK] をクリックします。

  2. カスタムポリシーをRamOssTestロールにアタッチします。

    1. 左側のナビゲーションペインで、[ID] > [ロール] を選択します。

    2. [ロール] ページで、[RamOssTest] ロールを見つけます。

    3. [操作] の [権限付与] をクリックします。

    4. [権限付与] パネルで、[ポリシー] セクションのドロップダウンリストから [カスタムポリシー] を選択し、[RamTestPolicy] ポリシーを選択します。

    5. [権限付与] をクリックします。

手順5: RAMユーザーを使用してRAMロールを引き受け、一時的なアクセス資格情報を取得する

オブジェクトをOSSにアップロードする権限をRAMロールに付与すると、RAMユーザーはRAMロールを引き受けて一時的なアクセス資格情報を取得します。 一時的なアクセス資格情報には、セキュリティトークン (SecurityToken) 、一時的なAccessKeyペア (AccessKey IDとAccessKey secret) 、および有効期間 (Expiration) が含まれます。

STS SDKの使用

STS SDKを使用して、一時的なアクセス資格情報を取得できます。

次のサンプルコードは、STS SDK for Javaを使用して、単純なアップロード (oss:PutObject) 権限を持つ一時的なアクセス資格情報を取得する方法の例を示しています。 他のプログラミング言語でSTS SDKを使用して一時的なアクセス資格情報を取得する方法の詳細については、「STS SDKの概要」をご参照ください。 STSエンドポイントの一覧については、「エンドポイント」をご参照ください。

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
public class StsServiceSample {
    public static void main(String[] args) { 
        // Specify the endpoint of STS. Example: sts.cn-hangzhou.aliyuncs.com. You can access STS over the Internet or a virtual private cloud (VPC).        
        String endpoint = "sts.cn-hangzhou.aliyuncs.com";
        // Obtain the AccessKey ID and AccessKey secret of the RAM user generated in Step 1 from environment variables. 
        String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
        // Obtain the ARN of the RAM role generated in Step 3 from environment variables. 
        String roleArn = System.getenv("OSS_STS_ROLE_ARN");
        // Specify a custom role session name to distinguish different tokens. Example: SessionTest.         
        String roleSessionName = "yourRoleSessionName";   
        // Specify that the temporary access credentials have all permissions of the RAM role.       
        String policy = null;
        // Specify the validity period of the temporary access credentials. Unit: seconds. The minimum validity period is 900 seconds. The maximum validity period is the same as the maximum session duration specified for the current role. The maximum session duration of the current role ranges from 3,600 seconds to 43,200 seconds. The default maximum session duration of the current role is 3,600 seconds. 
        // In large object upload or other time-consuming scenarios, we recommend that you set the validity period of temporary access credentials to a reasonable value to ensure that you do not need to repeatedly call the STS API operation to obtain temporary access credentials before the task is complete. 
        Long durationSeconds = 3600L;
        try {
            // Specify the region of STS. We recommend that you keep the default value. The default value is an empty string (""). 
            String regionId = "";
            // Specify the endpoint. You can specify this parameter by using STS SDK for Java 3.12.0 or later. 
            DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
            // Specify the endpoint. You can specify this parameter by using STS SDK for Java that is earlier than 3.12.0. 
            // DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);
            // Create a default profile. 
            IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            // Use the profile to create a client. 
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest();
            // You can specify this parameter by using STS SDK for Java 3.12.0 or later. 
            request.setSysMethod(MethodType.POST);
            // You can specify this parameter by using STS SDK for Java that is earlier than 3.12.0. 
            // request.setMethod(MethodType.POST);
            request.setRoleArn(roleArn);
            request.setRoleSessionName(roleSessionName);
            request.setPolicy(policy); 
            request.setDurationSeconds(durationSeconds); 
            final AssumeRoleResponse response = client.getAcsResponse(request);
            System.out.println("Expiration: " + response.getCredentials().getExpiration());
            System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
            System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
            System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
            System.out.println("RequestId: " + response.getRequestId());
        } catch (ClientException e) {
            System.out.println("Failed:");
            System.out.println("Error code: " + e.getErrCode());
            System.out.println("Error message: " + e.getErrMsg());
            System.out.println("RequestId: " + e.getRequestId());
        }
    }
}
重要

一時的なアクセス資格情報がRAMロールから権限を取得した後、一時的なアクセス資格情報の権限をさらに制限できます。 たとえば、一時的なアクセス資格情報にexamplebucketバケットにオブジェクトをアップロードする権限がある場合、次のサンプルポリシーを参照して、アクセス資格情報を使用してバケット内の特定のディレクトリにのみデータをアップロードできるように指定できます。

// The following policy specifies that the temporary access credentials can be used to upload objects only to the src directory of the examplebucket bucket. 
// The final permissions granted to the temporary access credentials are the intersection of the role permissions that are specified in Step 4 and the permissions that are specified in the policy. This allows you to upload objects only to the src directory in the examplebucket bucket.       
String policy = "{\n" +
                "    \"Version\": \"1\", \n" +
                "    \"Statement\": [\n" +
                "        {\n" +
                "            \"Action\": [\n" +
                "                \"oss:PutObject\"\n" +
                "            ], \n" +
                "            \"Resource\": [\n" +
                "                \"acs:oss:*:*:examplebucket/src/*\" \n" +
                "            ], \n" +
                "            \"Effect\": \"Allow\"\n" +
                "        }\n" +
                "    ]\n" +
                "}";

RESTful APIの使用

STSのAssumeRole操作を呼び出して、一時的なアクセス資格情報を取得できます。

ステップ6: 一時的なアクセス資格情報を使用してオブジェクトをOSSにアップロードする

一時的なアクセス資格情報の有効期間 (Expiration) が終了する前に、一時的なアクセス資格情報を使用してローカルファイルをOSSにアップロードします。

説明
  • 一時的なアクセス資格情報の有効期限はUTCです。これは、中国で使用されているUTC + 8タイムゾーンよりも8時間早くなっています。 たとえば、一時的なアクセス資格情報の有効期限が2024-04-18T11:33:40Zの場合、一時的なアクセス資格情報は4月18日2024の19:33:40 (UTC + 8) に期限切れになります。

  • 一時的なアクセス資格情報は、有効期限が切れる前に複数回使用できます。 たとえば、一時的なアクセス資格情報が期限切れになる前に、アップロード操作を繰り返し呼び出して複数のファイルをアップロードしたり、ファイルのパッケージをアップロードしたりできます。

次のサンプルコードは、OSS SDK for Java 3.12.0を使用して、exampletest.txtファイルをローカルパスD :\\ localpathからexamplebucketバケットにアップロードする方法の例を示しています。 他のプログラミング言語のOSS SDKを使用して一時的なアクセス資格情報を使用してデータをアップロードする方法の詳細については、「概要」をご参照ください。

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyuncs.exceptions.ClientException;

import java.io.File;

public class Demo {
    public static void main(String[] args) throws ClientException {
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. 
 String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Obtain the temporary AccessKey pair generated in Step 5 from environment variables. 
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
// Obtain the security token generated in Step 5 from environment variables. 
String securityToken = System.getenv("OSS_SESSION_TOKEN");

// Create an OSSClient instance. 
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);
// Upload a local file named exampletest.txt to examplebucket. 
PutObjectRequest putObjectRequest = new PutObjectRequest("examplebucket", "exampletest.txt", new File("D:\\localpath\\exampletest.txt"));

// ObjectMetadata metadata = new ObjectMetadata();
// Specify the storage class of the uploaded object. 
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// Specify the access control list (ACL) of the uploaded object. 
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);

try {
     // Upload the local file. 
     ossClient.putObject(putObjectRequest);
    } catch (OSSException oe) {
        System.out.println("Caught an OSSException, which means your request made it to OSS, "
                + "but was rejected with an error response for some reason.");
        System.out.println("Error Message:" + oe.getErrorMessage());
        System.out.println("Error Code:" + oe.getErrorCode());
        System.out.println("Request ID:" + oe.getRequestId());
        System.out.println("Host ID:" + oe.getHostId());
    } finally {
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
}
}

よくある質問

どうすればよいですかこのアクションを実行する権限がありません。 あなたはRAMによって承認されるべきです。エラーメッセージが返されますか?

RAMユーザーは、Alibaba CloudアカウントのAccessKeyペアではなく、AccessKeyペア (AccessKey IDとAccessKey secret) を使用してRAMロールを引き受け、一時的なアクセス認証情報を取得する必要があります。手順5: RAMユーザーを使用してRAMロールを引き受け、一時的なアクセス資格情報を取得

DurationSecondsの最小 /最大値は15Min /1hrです。What do I do error message.返されますか?

一時的なアクセス資格情報の有効期間が予想範囲内にないため、エラーが返されます。 次のルールに基づいて有効期間を指定します。

  • デフォルトの最大セッション期間 (3,600秒) を使用する場合、最小有効期間は900秒、最大有効期間は3,600秒です。

  • カスタム最大セッション期間が指定されている場合、最小有効期間は900秒で、最大有効期間は指定された最大セッション期間です。 役割セッションの期間の値の範囲は3600 43200秒です。

RAMコンソールで最大セッション期間を確認できます。 詳細については、「RAMロールに関する情報の表示」をご参照ください。

エラーメッセージの場合はどうすればよいですか指定したセキュリティトークンが無効です。 返されますか?

手順5で取得したセキュリティトークンを必ず指定してください。

エラーメッセージの場合はどうすればよいですか指定したOSSアクセスキーIdはレコードに存在しません。 返されますか?

現在の一時的なアクセス資格情報の有効期限が切れているため、RAMユーザーの一時的なAccessKeyペアを使用して、アプリサーバーから新しい一時的なアクセス資格情報を申請します。 詳細については、「ステップ5」をご参照ください。

私は何をしますか?AccessDenied: この操作では匿名アクセスが禁止されています。 エラーメッセージが返されますか?

ステップ5で一時的なアクセス資格情報を取得するときに、Alibaba CloudアカウントのAccessKey IDとAccessKey secretを指定したため、エラーメッセージが返されます。 手順1でRAMユーザーに対して生成されたAccessKey IDとAccessKeyシークレットを指定する必要があります。

NoSuchBucketエラーコードが返された場合はどうすればよいですか?

指定されたバケットが存在しないため、エラーコードが返されます。 指定されたバケットが存在することを確認してください。

私は何をしますか?バケットaclのため、このオブジェクトにアクセスする権利はありません。 一時的なアクセス資格情報を使用してOSSリソースにアクセスすると、エラーメッセージが返されますか。

RAMポリシーが正しく設定されているかどうかを確認します。 RAMポリシーの要素の詳細については、「RAMポリシー」をご参照ください。 マルチパートアップロードや追加アップロードなどの特定の操作を実行するために使用できる一時的なアクセス資格情報を取得する場合は、ポリシーの [アクション] 要素で対応する権限を指定します。 OSSアクションの詳細については、「OSSのRAMポリシーのAction要素」をご参照ください。

私は何をしますか?承認者のポリシーによってアクセスが拒否されました。 STSから取得した一時的なアクセス資格情報を使用してOSSリソースで操作を実行すると、エラーメッセージが返されますか。

操作を実行する権限がないため、エラーメッセージが返されます。 一時的なアクセス資格情報を申請する前に、RAMロールを作成し、RAMロールに必要な権限を付与する必要があります。 詳細については、「ステップ4」をご参照ください。 一時的なアクセス資格情報を取得するためにこのRAMロールを引き受けるようにSTSサーバーにリクエストを開始するときに、ポリシーパラメーターを使用して一時的なアクセス資格情報の権限をさらに制限できます。 詳細については、「ステップ5」をご参照ください。

  • ポリシーパラメーターを指定した場合、一時的なアクセス資格情報の最終的な権限は、RAMロールの権限とポリシーパラメーターで指定された権限の共通部分になります。

    • 例 1

      次の図では、AはRAMロールの権限、Bはポリシーパラメーターで指定された権限、Cは一時的なアクセス資格情報の最終的な権限を示します。

      1.jpg

    • 例 2

      次の図では、AはRAMロールの権限を示し、Bはポリシーパラメーターで指定された権限を示します。 policyパラメーターで指定された権限は、RAMロールの権限のサブセットです。 したがって、Bは一時的なアクセス資格情報の最終的な権限です。

      2.jpg

  • ポリシーを設定しない場合、一時的なアクセス資格情報はRAMロールと同じ権限を持ちます。

エラーメッセージの場合はどうすればよいですかアクセスしようとするバケットは、指定されたエンドポイントを使用してアドレス指定する必要があります。 返されますか?

手順6でEndpointパラメーターに指定した値が無効な場合、エラーメッセージが返されます。 バケットが配置されているリージョンに基づいてEndpointパラメーターを指定します。 リージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

複数の一時的なアクセス資格情報を同時に取得できますか?

はい。複数の一時的なアクセス資格情報を同時に取得できます。 STSにリクエストを送信することで、一時的なアクセス資格情報のセットを取得できます。 STSから複数の一時的なアクセス資格情報を取得する場合は、複数のリクエストをSTSに送信します。 一時的なアクセス資格情報の有効期間内に、複数の一時的なアクセス資格情報を同時に使用できます。

時間形式エラーが発生した場合はどうすればよいですか?

時間形式エラーが返された場合、考えられる原因は、Timestampパラメーターの値の文字間の不要なスペースです。

時刻を ISO 8601 規格 (yyyy-MM-ddTHH:mm:ssZ) の形式で指定します。 たとえば、2014-05-26T12:00:00Zを使用して、May 26, 2014 20:00:00 (UTC + 8) を指定します。

0003 0000301のエラーコードが返された場合はどうすればよいですか?

一時的なアクセス資格情報に指定された操作を実行する権限がないため、0003 0000301のエラーコードが返されます。 0003 00000301のトピックの指示に従って、問題を解決できます。

関連ドキュメント

  • 一時的なアクセス資格情報を使用して、クライアントから直接OSSにデータをアップロードし、ファイルサイズ、ファイルタイプ、宛先ディレクトリなどのアップロード条件を指定できます。 詳細については、「直接クライアントのアップロード」をご参照ください。

  • 署名付きURLを使用して、一時的なアクセス資格情報を使用してアップロードされたオブジェクトを共有できます。 詳細については、「オブジェクトとオブジェクトURLの共有」をご参照ください。