Alibaba Cloudアカウント (Alibaba CloudアカウントA) を使用してリソースアクセス管理 (RAM) ロールを作成し、別のAlibaba Cloudアカウント (Alibaba CloudアカウントB) を指定してRAMロールを引き受け、RAMロールにAlibaba CloudアカウントaのSimple Log Serviceリソースに対する特定の権限を付与できます。alibaba CloudアカウントBまたは指定されたRAMユーザーを使用してSecurity Token Service (STS) APIを呼び出し、一時的なセキュリティ資格情報を取得できます。 これらの資格情報には、AccessKey ID、AccessKeyシークレット、およびセキュリティトークンが含まれます。 これにより、RAMユーザーを使用してSimple Log Service API操作を呼び出し、Simple Log Serviceリソースにアクセスできます。
背景情報
ビジネスデータやアウトソーシングされたプロジェクトを分離するために、Alibaba CloudアカウントAのユーザーは、Alibaba CloudアカウントAのSimple Log Serviceリソースに対する特定の権限をAlibaba CloudアカウントBに付与したいと考えています。 次の権限が付与されます。
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操作を呼び出す権限があります。 詳細については、「」をご参照ください。概要
承認プロセス
Alibaba CloudアカウントAのユーザーは、RAMロールを作成し、このロールを引き受けるAlibaba CloudアカウントBを指定し、Alibaba CloudアカウントaのSimple Log Serviceリソースに対する指定された権限をAlibaba CloudアカウントBに付与します。
Alibaba CloudアカウントBのユーザーは、RAMユーザーB1を作成し、
AliyunSTSAssumeRoleAccess
システムポリシーをRAMユーザーB1にアタッチします。 このポリシーにより、RAMユーザーB1はSTSのAssumeRole APIを呼び出すことができます。RAM user B1のユーザーは、STSのAssumeRole APIを呼び出します。 これにより、RAMユーザーB1はSimple Log Service APIリクエストを開始し、Alibaba CloudアカウントAの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ロールを作成する方法について説明します。
Alibaba CloudアカウントAを使用して、RAMコンソールにログインします。
RAMロールを作成し、Alibaba CloudアカウントBを指定してRAMロールを引き受けます。
左側のナビゲーションウィンドウで、 .
ロールページをクリックします。ロールの作成.
ロールタイプの選択ステップでロールの作成ウィザードを選択します。Alibaba Cloudアカウントを信頼できるエンティティとして、次へ.
ロールの設定ステップで、RAMロール名およびメモパラメーターを設定します。 [信頼できるAlibaba Cloudアカウントの選択] パラメーターで [その他のAlibaba Cloudアカウント] を選択し、Alibaba CloudアカウントBのIDを入力し、[OK] をクリックします。
説明Alibaba CloudアカウントのIDを表示するには、コンソールの右上隅にあるプロフィール写真の上にポインターを移動します。
次の例は、上記の手順で作成されたRAMロールを示しています。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::<The ID of Alibaba Cloud Account B>:root" ] } } ], "Version": "1" }
ポリシーを作成します。
左側のナビゲーションウィンドウで、 .
ポリシーページをクリックします。ポリシーの作成.
[JSON] タブをクリックします。
[JSON] タブで、コードエディターの既存のスクリプトを次のいずれかのスクリプトに置き換えます。
Alibaba CloudアカウントAのユーザーは、Alibaba CloudアカウントBに権限を付与するポリシーを作成します。
次のポリシーは、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のすべてのプロジェクトとLogstoreに権限を付与します。特定のプロジェクトとLogstoreに権限を付与する場合は、ポリシーのResource要素に次のコードを含めます。
プロジェクトに権限を付与するには、
acs:log ::{ projectOwnerAliUid}:project/
を使用します。Logstoreに権限を付与するには、
acs:log ::{ projectOwnerAliUid}:project/{projectName}/logstore/{logstoreName}/
を使用します。
詳細については、「RAMユーザーが管理できるSimple Log Serviceリソース」をご参照ください。
[次へ] をクリックし、パラメーターを設定します。 下表にパラメーターを示します。
パラメーター
説明
名前
ポリシーの名前を入力します。
説明
ポリシーのコメントを入力します。
OK.
Alibaba CloudアカウントAを使用して、RAMロールに権限を付与します。
左側のナビゲーションウィンドウで、 .
ロールページで、作成したRAMロールを見つけて、権限付与[アクション] 列に表示されます。
ポリシーの選択[権限付与] ページのセクションで、カスタムポリシーで作成したポリシーをクリックします。3をクリックし、OK.
表示されるページで、完了.
ステップ2: Alibaba CloudアカウントBのユーザーがRAMユーザーB1を作成し、RAMユーザーB1に権限を付与する
Alibaba CloudアカウントBのユーザーは、RAMユーザーB1を作成し、AliyunSTSAssumeRoleAccess
システムポリシーをRAMユーザーB1にアタッチします。 これにより、RAMユーザーB1はSTSのAssumeRole APIを呼び出すことができます。
Alibaba CloudアカウントBを使用して、RAMコンソールにログインします。
左側のナビゲーションウィンドウで、 .
ユーザーページをクリックします。ユーザーの作成.
[ユーザーの作成] ページで、パラメーターを設定し、[OK] をクリックします。 下表にパラメーターを示します。
パラメーター
説明
ユーザーアカウント情報
[ログイン名] および [表示名] パラメーターを設定します。
アクセスモード
[コンソールアクセス] および [OpenAPIアクセス] を選択します。
[ユーザー] ページに戻ります。 [ユーザーログイン名 /表示名] 列で、作成したRAMユーザーを見つけ、[権限の追加] をクリックします。
[権限の追加] ページで、パラメーターを設定します。 [プリンシパル] フィールドは自動的に入力されます。 [ポリシーの選択] フィールドに [システムポリシー] を選択します。 [権限付与ポリシー名] 列で、[AliyunSTSAssumeRoleAccess] ポリシーをクリックし、[OK] をクリックします。
表示されるページで、完了.
ステップ3: RAM user B1のユーザーがSTSから一時的なセキュリティ資格情報を取得してSimple Log Serviceリソースにアクセスする
STSのAssumeRole APIを呼び出して、一時的なAccessKeyペアとセキュリティトークンを取得します。 詳細については、「AssumeRole」をご参照ください。
この操作は、次のメソッドを使用して呼び出すことができます。
STS SDKを使用して操作を呼び出します。 詳細については、「概要」をご参照ください。
Simple Log ServiceのAPI操作を呼び出します。 Simple Log Service SDKの詳細については、「Simple Log Service SDKの概要」をご参照ください。
サンプルコード
たとえば、RAMユーザーB1はSTSを使用してAlibaba Cloudアカウントaのプロジェクトにデータを書き込みます。Javaサンプルコードは次のとおりです。
このサンプルコードで使用されているSTS APIバージョンは、中国 (杭州) リージョンでのみ使用できます。
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 {
// Currently, STS only supports "cn-hangzhou".
public static final String REGION_CN_HANGZHOU = "cn-hangzhou";
// Current STS API version
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 {
// Construct Alibaba Cloud ACS Client to invoke OpenAPI.
IClientProfile profile = DefaultProfile.getProfile(REGION_CN_HANGZHOU, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
// Create AssumeRoleRequest object.
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);
// Send request.
final AssumeRoleResponse response = client.getAcsResponse(request);
return response;
} catch (ClientException e) {
throw e;
}
}
public static void main(String[] args) {
// Only RAM users can invoke the AssumeRole API.
// The AccessKeys of Alibaba Cloud accounts cannot invoke the AssumeRole API.
// Create a RAM user in the RAM console (https://ram.console.aliyun.com), and create an AccessKey pair for the RAM user.
String accessKeyId = "<subaccountaccesskey>";
String accessKeySecret = "<subaccountaccesssecret>";
// AssumeRole API parameter: RoleArn, RoleSessionName, Policy, and DurationSeconds.
// RoleArn can be retrieved in the RAM console.
// https://ram.console.aliyun.com/#/role/detail/<specified rolename>/info
String roleArn = "<rolearn found in web console>";
// RoleSessionName is a temporary token, mainly used for auditing.
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);
// Only HTTPS is supported here.
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("Failed to get a token.");
System.out.println("Error code: " + e.getErrCode());
System.out.println("Error message: " + e.getErrMsg());
}
// Simple Log Service parameters.
// Simple Log Service endpoint document: https://www.alibabacloud.com/help/en/sls/developer-reference/api-sls-2020-12-30-endpoint
String logServiceEndpoint = "cn-hangzhou.log.aliyuncs.com";
// Project region is cn-hangzhou
String project = "<log service project name>";
String logstore = "<log service logstore name>";
// Construct Simple Log Service client object.
Client client = new Client(logServiceEndpoint,
response.getCredentials().getAccessKeyId(),
response.getCredentials().getAccessKeySecret());
// Note: The AccessKey and security token will expire in 1 hour,
// so you must invoke the AssumeRole API when they expire.
client.SetSecurityToken(response.getCredentials().getSecurityToken());
Vector<LogItem> logGroup = new Vector<LogItem>();
LogItem logItem = new LogItem((int) (new Date().getTime() / 1000));
logItem.PushBack("StsSample", "Send Data");
logGroup.add(logItem);
PutLogsRequest req2 = new PutLogsRequest(project, logstore, "", "", logGroup);
try {
client.PutLogs(req2);
} catch (LogException e) {
System.out.println("Failed to send data.");
System.out.println("Error code: " + e.GetErrorCode());
System.out.println("Error message: " + e.GetErrorMessage());
}
}
}