このトピックでは、Simple Log Serviceのクエリおよび分析結果のページとダッシュボードページを他のユーザーと共有する方法、およびSimple Log Serviceコンソールページをサードパーティシステムに埋め込む方法について説明します。 これにより、ユーザーはパスワードフリーおよびログオンフリーモードでログを表示できます。 共有ページのURLは、パスワードフリーURLおよびログオンフリーURLと呼ばれます。
背景情報
チケットは、短期間有効なトークンです。 チケットは、パスワードなしでログオンなしのURLを生成するために使用されます。 パスワード不要でログイン不要なURLを取得すると、ユーザーはAlibaba Cloudアカウントを使用してSimple log Serviceコンソールにログインすることなく、指定されたクエリおよび分析ページまたはダッシュボードページに直接アクセスできます。
手順:
RAM (Resource Access Management) ユーザーに必要な権限を付与します。
Simple Log ServiceコンソールページのURLを取得します。
CreateTicket
操作を呼び出して、チケット
を取得します。
ticket
とSimple Log ServiceコンソールページのURLに基づいて、パスワードなしおよびログインなしのURLを生成します。
警告 パスワードなしおよびログオンなしのURLの場合、ランディングページで実行できる操作は、Simple Log ServiceでのCreateTicket
操作の呼び出し元の権限によって異なります。 Alibaba Cloudアカウントを使用してCreateTicket操作を呼び出すときに発生するデータセキュリティリスクを軽減するために、RAMユーザーを使用してCreateTicket
操作を呼び出し、最小権限の原則に基づいてRAMユーザーに権限を付与することを推奨します。 詳細については、「手順1: RAMユーザーに必要な権限を付与する」をご参照ください。
パスワードなしでログオンなしのURLを生成する
手順1: RAMユーザーに必要な権限を付与する
Alibaba Cloudアカウントを使用している場合は、この手順をスキップして手順2に進みます。
RAMユーザーの作成
プロジェクトやLogstoreなどのリソースに対する権限と、CreateTicket操作を呼び出すための権限をRAMユーザーに付与します。
特定のリソースに権限を付与する方法の詳細については、「カスタムポリシーを使用してRAMユーザーに権限を付与する例」をご参照ください。
CreateTicket操作を呼び出す権限を付与する方法の詳細については、「RAMユーザーへの権限の付与」および「カスタムポリシーの作成」をご参照ください。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "log:CreateTicket",
"Resource": "acs:log:*:*:ticket/*"
}
]
}
手順2: Simple Log ServiceコンソールページのURLを取得する
クエリと分析ページ:
https://sls.console.aliyun.com/lognext/project/<Project name>/logsearch/<Logstore name>?slsRegion=<Region where the project resides>&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
プロジェクト名の詳細については、「プロジェクトの管理」をご参照ください。 Logstore名の詳細については、「Logstoreの管理」をご参照ください。 プロジェクトでサポートされているリージョンの詳細については、[エンドポイント] の [リージョンID] 列をご参照ください。
検索ページ
https://sls.console.aliyun.com/lognext/project/<Project name>/logsearch/<Logstore name>?slsRegion=<Region where the project resides>&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
ダッシュボードページ
重要 ダッシュボードIDは、ダッシュボードページのURLにのみ表示されます。 IDはダッシュボードに表示される名前ではありません。 Simple Log Serviceコンソールでダッシュボードページをパスワードフリーモードで共有できます。 詳細については、「ダッシュボードまたはグラフをパスワードなしで共有する」をご参照ください。
https://sls.console.aliyun.com/lognext/project/<Project name>/dashboard/<Dashboard ID>?slsRegion=<Region where the project resides>&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
ステップ3: チケットの取得
重要 CreateTicket操作を呼び出してチケットを取得する場合は、中国 (上海) またはシンガポールリージョンのSimple Log Serviceエンドポイントを使用する必要があります。 チケットを取得すると、地域に関係なくチケットを使用できます。
チケットは1回だけ使用できます。 デフォルトの有効期間は1日で、最大有効期間は30日です。 チケットを動的に取得する方法の詳細については、システムはどのようにチケットを動的に取得しますか?
ステップ4: パスワードなしでログオンなしのURLを生成
ステップ3で取得したチケットと、ステップ2で取得したSimple Log ServiceコンソールページのURLを連結して、パスワード不要およびログイン不要のURLを生成します。
https://sls.console.aliyun.com/lognext/project/<Project name>/dashboard/<Dashboard ID>?slsRegion=<Region where the project resides>&sls_ticket=eyJ***************.eyJ******************.KUT****************&isShare=true&hideTopbar=true&hideSidebar=true&ignoreTabLocalStorage=true
パスワードなしおよびログオンなしのURLをテストします。 ブラウザのアドレスバーにURLを入力して、URLをテストできます。 Simple Log Serviceコンソールページにアクセスできる場合、URLは有効です。
警告 ブラウザで初めてパスワード不要およびログオン不要のURLにアクセスするときに、そのURLをテストできます。 テストが完了すると、チケットは無効になります。 新しいチケットを取得するには、再度CreateTicket操作を呼び出す必要があります。
パスワードなしでログオンなしのURLをファイルにコピーし、ファイルを転送することを推奨します。 パスワードなしでログオンなしのURLをサードパーティのソフトウェアに直接送信すると、ソフトウェアがURLを読み取った後にURLが無効になることがあります。
よくある質問
URLの有効期間を組み込みコンソールページに拡張するにはどうすればよいですか。
詳細については、「URLの有効期間を組み込みコンソールページに拡張する」をご参照ください。
チケットはどのように動的に生成されますか?
Simple Log Serviceコンソールページをサードパーティシステムに埋め込む場合は、アプリケーションでCreateTicket
操作を動的に呼び出して、定期的にチケットを取得する必要があります。 RAMユーザーのAccessKeyペアを使用してCreateTicket操作を呼び出す場合、手順は簡単ですが、セキュリティ上のリスクが高くなります。 CreateTicket操作を呼び出すには、Security Token Service (STS) トークンを持つRAMロールを使用することをお勧めします。 これにより、セキュリティリスクが軽減されます。
RAMユーザーを作成し、信頼できるエンティティがAlibaba CloudアカウントであるRAMロールを作成します。
RAMユーザーにAliyunSTSAssumeRoleAccess権限を付与します。 CreateTicket操作を呼び出す権限と、Simple Log Serviceに関連する権限をRAMロールに付与します。 詳細については、「RAMロールへの権限の付与」および「カスタムポリシーを使用してRAMユーザーに権限を付与する例」をご参照ください。
RAMロールを使用してCreateTicket操作を呼び出します。
RAMユーザーを使用してAssumeRole操作を呼び出し、STSトークンとAccessKeyペアを取得します。 AccessKey ペアは、AccessKey ID と AccessKey Secret で構成されます。 AccessKeyIdパラメーターとAccessKeySecretパラメーターは、AccessKey IDとAccessKey secretを指定します。 SecurityTokenパラメーターは、STSトークンを指定します。
RAMユーザーを使用して、SecurityToken、AccessKeySecret、およびAccessKeyIdパラメーターに基づいてRAMロールを引き受けます。 次に、CreateTicket操作を呼び出してチケットを取得します。
SDK サンプル
Java
Maven依存関係を追加します。
Javaプロジェクトのルートディレクトリにあるpom.xmlファイルを開き、次のコードを追加します。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>sls20201230</artifactId>
<version>5.2.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.3.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-console</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-util</artifactId>
<version>0.2.21</version>
</dependency>
チケットを取得するためのコードを作成します。
import com.aliyun.tea.*;
public class Sample {
/**
* Use your AccessKey ID and AccessKey secret to initialize a client.
* @return Client
* @throws Exception
*/
public static com.aliyun.sls20201230.Client createClient() throws Exception {
// If the project code is leaked, the AccessKey pair may be leaked and the security of all resources within your account may be compromised. The following sample code is provided only for reference.
// We recommend that you use STS tokens, which provide higher security.
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is configured.
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is configured.
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// For more information about endpoints, see https://api.aliyun.com/product/Sls.
config.endpoint = "cn-shanghai.log.aliyuncs.com";
return new com.aliyun.sls20201230.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.sls20201230.Client client = Sample.createClient();
com.aliyun.sls20201230.models.CreateTicketRequest createTicketRequest = new com.aliyun.sls20201230.models.CreateTicketRequest();
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
java.util.Map<String, String> headers = new java.util.HashMap<>();
try {
com.aliyun.sls20201230.models.CreateTicketResponse resp = client.createTicketWithOptions(createTicketRequest, headers, runtime);
com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(resp));
} catch (TeaException error) {
// Handle exceptions with caution in your actual business scenario and do not ignore exceptions in your project. In this example, error messages are printed for reference only.
// Display an error message.
System.out.println(error.getMessage());
// Display information for troubleshooting.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// Handle exceptions with caution in your actual business scenario and do not ignore exceptions in your project. In this example, error messages are printed for reference only.
// Display an error message.
System.out.println(error.getMessage());
// Display information for troubleshooting.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
Python
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import os
import sys
from typing import List
from alibabacloud_sls20201230.client import Client as Sls20201230Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_sls20201230 import models as sls_20201230_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> Sls20201230Client:
"""
Use your AccessKey ID and AccessKey secret to initialize a client.
@return: Client
@throws Exception
"""
# If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your account may be compromised. The following sample code is provided only for reference.
# We recommend that you use STS tokens, which provide higher security. For more information about authentication methods, see https://help.aliyun.com/document_detail/378659.html.
config = open_api_models.Config(
# Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is configured. ,
access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
# Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is configured. ,
access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
# Required. Make sure that the STS token is configured.
security_token=os.environ['ALIBABA_CLOUD_Token']
)
# For more information about endpoints, see https://api.aliyun.com/product/Sls.
config.endpoint = f'cn-shanghai.log.aliyuncs.com'
return Sls20201230Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
client = Sample.create_client()
create_ticket_request = sls_20201230_models.CreateTicketRequest(
expiration_time=300
)
runtime = util_models.RuntimeOptions()
headers = {}
try:
# If you copy and run the sample code, add code to display the API call results.
client.create_ticket_with_options(create_ticket_request, headers, runtime)
except Exception as error:
# Handle exceptions with caution in your actual business scenario and do not ignore exceptions in your project. In this example, error messages are printed for reference only.
# Display an error message.
print(error.message)
# Display information for troubleshooting.
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
@staticmethod
async def main_async(
args: List[str],
) -> None:
client = Sample.create_client()
create_ticket_request = sls_20201230_models.CreateTicketRequest(
expiration_time=300
)
runtime = util_models.RuntimeOptions()
headers = {}
try:
# If you copy and run the sample code, add code to display the API call results.
await client.create_ticket_with_options_async(create_ticket_request, headers, runtime)
except Exception as error:
# Handle exceptions with caution in your actual business scenario and do not ignore exceptions in your project. In this example, error messages are printed for reference only.
# Display an error message.
print(error.message)
# Display information for troubleshooting.
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
if __name__ == '__main__':
Sample.main(sys.argv[1:])
取得したチケットに基づいて、パスワードなしおよびログオンなしのURLを生成し、さまざまな操作を許可します。
Simple Log Service SDKを使用してCreateTicket操作を呼び出すと、InvalidMethodエラーが報告されます。 これはなぜですか。
CreateTicket操作を呼び出すには、中国 (上海) またはシンガポールリージョンのSimple Log Serviceエンドポイントを使用する必要があります。 ただし、チケットを取得した後は、地域に関係なくチケットを使用できます。
チケットの制限は何ですか?
チケットのデフォルトの有効期間は1日で、最大有効期間は30日です。
チケットを使用して、同じブラウザまたはホストでのみURLにアクセスできます。 たとえば、チケットを使用してブラウザaのパスワードなしでログオンなしのURLにアクセスした場合、チケットの有効期間が終了する前にURLに継続的にアクセスできます。 ただし、チケットを使用してブラウザBのURLにアクセスすることはできません。
チケットの総数は無制限です。 CreateTicket操作は、アカウントごとに1秒あたり最大10回呼び出すことができます。
サードパーティのクッキーの制限は何ですか?
サードパーティのCookieを使用することなく、コンソールページを埋め込み、ログデータを共有できます。 詳細については、「コンソールページの埋め込みとログデータの共有 (新バージョン) 」をご参照ください。
埋め込みページの読み込み速度はどのくらいですか?
Simple Log Serviceは、コンソールページの埋め込みやログデータの共有に使用できる機能の新旧バージョンを提供します。 新しいバージョンを使用すると、埋め込みページをより速く読み込むことができます。 詳細については、「コンソールページの埋め込みとログデータの共有 (新バージョン) 」をご参照ください。
同じ操作権限をサポートする複数の埋め込みページを開きたい場合はどうすればよいですか?
チケットを取得し、同じブラウザで埋め込みページを更新できます。 チケットの有効期限が切れた場合は、新しいチケットを入手し、すべてのページで有効期限が切れたチケットを新しいチケットに置き換えます。
異なるブラウザまたはコンピュータは異なるユーザとみなされる。 チケットは1回だけ使用できます。 別のブラウザまたはコンピュータを使用している場合、同じチケットを使用することはできず、次のエラーメッセージが返されます。
{"code":"TicketUnavailable","message":"There are no more tickets available.","requestId":"xxxxxx","success":false}
異なる操作権限をサポートする複数の埋め込みページを開きたい場合はどうすればよいですか?
異なる権限に関連付けられた複数のチケットを取得できます。 ただし、この場合は、最後のチケットを使用する埋め込みページのみを更新できます。 これは、システムが現在のユーザーの資格情報として1つのcookieのみを記録し、記録されたcookieに基づいてのみページを更新するためです。 記録されたクッキーは最後のチケットに対応する。
ページを更新しない場合、Cookieは必要ありません。 ページを切り替えて、異なるページで異なる操作を実行できます。
最後のチケットを使用していない埋め込みページを更新すると、次のエラーメッセージが返されます。
{"code":"TicketUnavailable","message":"There are no more tickets available.","requestId":"xxxxxx","success":false}