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

Simple Log Service:STS を使用して Simple Log Service リソースへのクロスアカウントアクセスを有効にする

最終更新日:Mar 27, 2025

Alibaba Cloud アカウント(Alibaba Cloud アカウント A)を使用して Resource Access Management (RAM) ロールを作成し、別の Alibaba Cloud アカウント(Alibaba Cloud アカウント B)が RAM ロールをアシュームするように指定し、Alibaba Cloud アカウント A の Simple Log Service リソースに対する特定の権限を RAM ロールに付与できます。その後、Alibaba Cloud アカウント B の RAM ユーザーに AssumeRole 権限を付与できます。そして、Alibaba Cloud アカウント B または指定された RAM ユーザーを使用して Security Token Service (STS) API 操作を呼び出し、一時的なセキュリティ認証情報を取得できます。これらの認証情報には、AccessKey ID、AccessKey シークレット、およびセキュリティトークンが含まれます。このようにして、RAM ユーザーを使用して Simple Log Service API 操作を呼び出し、Simple Log Service リソースにアクセスできます。

ソリューションの概要

企業 A には Alibaba Cloud アカウント A という名前の Alibaba Cloud アカウントがあり、企業 B には Alibaba Cloud アカウント B という名前の Alibaba Cloud アカウントがあります。ビジネスデータまたは外部委託プロジェクトを分離するために、Alibaba Cloud アカウント A のユーザーは、Alibaba Cloud アカウント B に Alibaba Cloud アカウント A の Simple Log Service リソースに対する特定の権限を付与したいと考えています。以下の権限が付与されます。

  • Alibaba Cloud アカウント B は、Alibaba Cloud アカウント A の Simple Log Service にデータを書き込むことが許可されています。さらに、Alibaba Cloud アカウント B は、コンシューマーグループを使用して Alibaba Cloud アカウント A の Simple Log Service からデータを使用することが許可されています。

  • Alibaba Cloud アカウント B の RAM ユーザーは、Alibaba Cloud アカウント A の Simple Log Service にデータを書き込むことが許可されています。さらに、RAM ユーザーは、コンシューマーグループを使用して Alibaba Cloud アカウント A の Simple Log Service からデータを使用することが許可されています。

  • Alibaba Cloud アカウント B は、STS API 操作を呼び出して一時的なセキュリティ認証情報を取得し、その認証情報を使用して Simple Log Service API 操作を呼び出すことが許可されています。詳細については、「STS とは」をご参照ください。

上記の要件を満たすには、次の手順を実行します。

手順 1:Alibaba Cloud アカウント A のユーザーが Alibaba Cloud アカウント B の RAM ロールを作成し、Alibaba Cloud アカウント B に権限を付与する

手順 2:Alibaba Cloud アカウント B のユーザーが user-b RAM ユーザーを作成し、RAM ユーザーに権限を付与する

手順 3:user-b RAM ユーザーが STS から一時的なセキュリティ認証情報を取得して Simple Log Service リソースにアクセスする

手順 1:Alibaba Cloud アカウント A のユーザーが Alibaba Cloud アカウント B の RAM ロールを作成し、Alibaba Cloud アカウント B に権限を付与する

Alibaba Cloud アカウント A のユーザーは、RAM ロールを作成し、Alibaba Cloud アカウント B が RAM ロールをアシュームするように指定し、Alibaba Cloud アカウント A の Simple Log Service リソースに対する特定の権限を RAM ロールに付与します。

RAM コンソールで RAM ロールを作成できます。詳細については、「RAM ユーザーを作成し、RAM ユーザーに Simple Log Service へのアクセスを許可する」をご参照ください。また、RAM の CreateRole API 操作を呼び出して RAM ロールを作成することもできます。詳細については、「CreateRole」をご参照ください。次の例では、コンソールで RAM ロールを作成する方法について説明します。

  1. Alibaba Cloud アカウントを使用して Resource Access Management (RAM) コンソール にログインします。

  2. RAM ロールを作成し、Alibaba Cloud アカウント B が RAM ロールをアシュームするように指定します。詳細については、「信頼できる Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。

  3. カスタムポリシーを作成します。[ポリシーの作成] ページの [JSON] タブで、コードエディタの既存のスクリプトを次のポリシードキュメントに置き換えます。詳細については、「JSON タブでカスタムポリシーを作成する」をご参照ください。

    Simple Log Service への書き込み権限を付与する

    {
      "Version": "1",
      "Statement": [
        {
          "Action": "log:PostLogStoreLogs",
          "Resource": "*",
          "Effect": "Allow"
        }
      ]
    }

    コンシューマーグループを使用して Simple Log Service からデータをプルする権限を付与する

    {
      "Version": "1",
      "Statement": [
        {
          "Action": [
             "log:GetCursorOrData",
             "log:CreateConsumerGroup",
             "log:ListConsumerGroup",
             "log:ConsumerGroupUpdateCheckPoint",
             "log:ConsumerGroupHeartBeat",
             "log:GetConsumerGroupCheckPoint",
             "log:UpdateConsumerGroup"
          ],
          "Resource": "*",
          "Effect": "Allow"
        }
      ]
    }
    重要

    上記のポリシーは、Alibaba Cloud アカウント A のすべてのプロジェクトとログストアに対する権限を付与します。特定のプロジェクトとログストアに対する権限を付与する場合は、ポリシーの Resource 要素に次のコードを含めます。

    • プロジェクトに権限を付与するには、acs:log::{projectOwnerAliUid}:project/ を使用します。

    • ログストアに権限を付与するには、acs:log::{projectOwnerAliUid}:project/{projectName}/logstore/{logstoreName}/ を使用します。

    詳細については、「リソースリスト」をご参照ください。

  4. 作成したカスタムポリシーを RAM ロールにアタッチします。詳細については、「RAM ロールに権限を付与する」をご参照ください。

手順 2:Alibaba Cloud アカウント B のユーザーが user-b RAM ユーザーを作成し、RAM ユーザーに権限を付与する

Alibaba Cloud アカウント B のユーザーは、user-b RAM ユーザーを作成し、AliyunSTSAssumeRoleAccess システムポリシーを RAM ユーザーにアタッチします。AliyunSTSAssumeRoleAccess ポリシーは、RAM ユーザーに STS の AssumeRole API 操作を呼び出す権限を付与します。

  1. Alibaba Cloud アカウント B を使用して、RAM コンソール にログインします。

  2. user-b という名前の RAM ユーザーを作成し、[アクセスモード] セクションで [コンソールアクセス][永続 Accesskey を使用してアクセスする] を選択します。詳細については、「RAM ユーザーを作成する」をご参照ください。

    重要
    • RAM ユーザーの AccessKey シークレットは、AccessKey ペアを作成するときにのみ表示されます。後続の操作で AccessKey シークレットを照会することはできません。したがって、AccessKey シークレットをバックアップする必要があります。

    • AccessKey ペアは、アプリケーションアクセスのための永続的な認証情報です。Alibaba Cloud アカウントの AccessKey ペアが漏洩した場合、アカウントに属するリソースは潜在的なリスクにさらされます。認証情報の漏洩リスクを防ぐために、Security Token Service (STS) トークンを使用することをお勧めします。詳細については、「API 操作を呼び出すためのアクセス認証情報のベストプラクティス」をご参照ください。

  3. [aliyunstsassumeroleaccess] ポリシーを RAM ユーザーにアタッチします。これにより、RAM ユーザーは RAM ロールをアシュームして Security Token Service (STS) トークンを取得できます。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。

手順 3:user-b RAM ユーザーが STS トークンを取得して Simple Log Service リソースにアクセスする

  1. AssumeRole API 操作を呼び出して、一時的な AccessKey ペアとセキュリティトークンを取得します。詳細については、「AssumeRole」をご参照ください。

    この操作は、次の方法で呼び出すことができます。

    STS SDK を使用して操作を呼び出します。詳細については、「STS SDK の概要」をご参照ください。

  2. Simple Log Service の API 操作を呼び出します。詳細については、「Simple Log Service SDK の概要」をご参照ください。

サンプルコード

Java 用 Simple Log Service SDK に基づいて、次のコードは、Alibaba Cloud アカウント B の user-b RAM ユーザーが STS トークンを使用して Alibaba Cloud アカウント A 内のプロジェクトにデータを書き込む方法の例を示しています。サンプルコード:

package com.aliyun.openservices.log.sample;

import java.util.Date;
import java.util.Vector;

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.PutLogsRequest;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;

public class StsSample {
	  // 現在、sts は "cn-hangzhou" のみをサポートしています
	  public static final String REGION_CN_HANGZHOU = "cn-hangzhou";
	  // 現在の sts api バージョン
	  public static final String STS_API_VERSION = "2015-04-01";
	  static AssumeRoleResponse assumeRole(String accessKeyId, String accessKeySecret,
	                                       String roleArn, String roleSessionName, String policy,
	                                       ProtocolType protocolType) throws ClientException {
	    try {
	      // OpenAPI を呼び出すための Alibaba Cloud Acs Client を構築します
	      IClientProfile profile = DefaultProfile.getProfile(REGION_CN_HANGZHOU, accessKeyId, accessKeySecret);
	      DefaultAcsClient client = new DefaultAcsClient(profile);
	      // AssumeRoleRequest オブジェクトを作成します
	      final AssumeRoleRequest request = new AssumeRoleRequest();
	      request.setVersion(STS_API_VERSION);
	      request.setMethod(MethodType.POST);
	      request.setProtocol(protocolType);
	      request.setRoleArn(roleArn);
	      request.setRoleSessionName(roleSessionName);
	      request.setPolicy(policy);
	      // リクエストを送信します
	      final AssumeRoleResponse response = client.getAcsResponse(request);
	      return response;
	    } catch (ClientException e) {
	      throw e;
	    }
	  }
	  public static void main(String[] args) {
	    // RAM ユーザー(サブアカウント)のみが AssumeRole インターフェースを呼び出すことができます
	    // Alibaba Cloud ルートアカウントの AccessKey は AssumeRole を呼び出すことができません
	    // RAM ウェブコンソール(https://ram.console.aliyun.com)でサブアカウントを作成し、このサブアカウントの AK を作成してください
	    String accessKeyId = "<subaccountaccesskey>";
	    String accessKeySecret = "<subaccountaccesssecret>";
	    // AssumeRole API パラメータ:RoleArn、RoleSessionName、Policy、および DurationSeconds
	    // RoleArn は RAM ウェブコンソールで取得できます
	    // https://ram.console.aliyun.com/#/role/detail/< specifid rolename>/info
	    String roleArn = "<ウェブコンソールで見つかった rolearn>";
	    // RoleSessionName は一時的なトークンです(主に監査に使用されます)
	    String roleSessionName = "bluemix-001";
	    String policy = "{\n" +
	            "    \"Version\": \"1\", \n" +
	            "    \"Statement\": [\n" +
	            "        {\n" +
	            "            \"Action\": \"log:PostLogStoreLogs\",\n" +
	            "            \"Resource\": \"*\",\n" +
	            "            \"Effect\": \"Allow\"\n" +
	            "        }\n" +
	            "    ]\n" +
	            "}";
	    System.out.println(policy);
	    // ここでは HTTPS のみをサポートしています
	    ProtocolType protocolType = ProtocolType.HTTPS;
	    AssumeRoleResponse response = new AssumeRoleResponse();
	    try {
	      response = assumeRole(accessKeyId, accessKeySecret,
	              roleArn, roleSessionName, policy, protocolType);
	      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());
	    } catch (ClientException e) {
	      System.out.println("トークンの取得に失敗しました。");
	      System.out.println("エラーコード: " + e.getErrCode());
	      System.out.println("エラーメッセージ: " + e.getErrMsg());
	    }
	    
	    // Simple Log Service パラメータ
	    // Simple Log Service エンドポイントドキュメント:https://www.alibabacloud.com/help/ja/sls/developer-reference/api-sls-2020-12-30-endpoint
	    String logServiceEndpoint = "cn-hangzhou.log.aliyuncs.com";
	    // プロジェクトリージョンは cn-hangzhou である必要があります
	    String project = "<log service project name>";
	    String logstore = "<log service logstore name>";
	    
	    // Simple Log Service クライアントオブジェクトを構築します
	    Client client = new Client(logServiceEndpoint, 
	    		response.getCredentials().getAccessKeyId(), 
	    		response.getCredentials().getAccessKeySecret());
	    // 注意:AK とセキュリティトークンは 1 時間で有効期限が切れます
	    // 有効期限が切れたら asumeRole インターフェースを呼び出す必要があります
	    client.SetSecurityToken(response.getCredentials().getSecurityToken());
	    Vector<LogItem> logGroup = new Vector<LogItem>();
	    LogItem logItem = new LogItem((int) (new Date().getTime() / 1000));
	    logItem.PushBack("StsSample", "データを送信する"); //日本語化
	    logGroup.add(logItem);
	    
	    PutLogsRequest req2 = new PutLogsRequest(project, logstore, "", "", logGroup);
	    try {
	    	client.PutLogs(req2);
	    } catch (LogException e) {
			System.out.println("データの送信に失敗しました。"); //日本語化
			System.out.println("エラーコード: " + e.GetErrorCode());
			System.out.println("エラーメッセージ: " + e.GetErrorMessage());
	    }
	  }
}