Simple Log Service 以外の Alibaba Cloud サービスのリソースにアクセスするには、Elastic Compute Service(ECS)インスタンス、または ECS インスタンスにデプロイされているアプリケーションに必要なアクセス認証情報が必要です。Alibaba Cloud サービスは、アクセス認証情報を使用して、ECS インスタンスまたはアプリケーションの ID と権限を認証します。インスタンス RAM ロールを ECS インスタンスにアタッチできます。ECS インスタンスと、ECS インスタンスにデプロイされているアプリケーションは、インスタンス内から一時的なアクセス認証情報を自動的に取得して更新できます。このようにして、ECS インスタンスとアプリケーションは、AccessKey ペアを公開することなく、Simple Log Service 以外の Alibaba Cloud サービスのリソースにアクセスできます。これにより、AccessKey ペアの漏洩のリスクが軽減され、リソースへのアクセス権限を RAM ロールベースで詳細に管理できるため、過剰な権限が付与されるのを防ぐことができます。このトピックでは、AccessKey ペアを使用せずに ECS インスタンス上の Simple Log Service SDK にアクセスする方法について説明します。
インスタンス RAM ロールとは、信頼できるエンティティが Alibaba Cloud サービスである RAM ロールの一種です。このタイプの RAM ロールは、Alibaba Cloud サービス間でアクセス権を付与するために使用され、Alibaba Cloud サービスによってアタッチできます。RAM ロールの詳細については、「RAM ロールとは」をご参照ください。
Alibaba Cloud AccessKey ペアは、API オペレーションを呼び出すことによって Alibaba Cloud リソースにアクセスするために使用できる安全な ID 認証情報です。AccessKey ペアを使用して API リクエストに署名し、セキュリティ認証を通過させることができます。AccessKey ペアの詳細については、「AccessKey ペア」をご参照ください。
Simple Log Service のカスタムポリシーの詳細については、「カスタムポリシーを使用して RAM ユーザーに権限を付与する例」をご参照ください。
制限事項
AccessKey ペアを使用せずに ECS インスタンスでアクセスできるのは、Java 用 Simple Log Service SDK または Go 用 Simple Log Service SDK のみです。
インスタンス RAM ロールをアタッチする ECS インスタンスは、仮想プライベートクラウド(VPC)内に存在する必要があります。
1 つの ECS インスタンスにアタッチできるインスタンス RAM ロールは 1 つだけです。
ステップ 1:インスタンス RAM ロールを作成し、ECS インスタンスにアタッチする
コンソール を使用する
RAM コンソール にログインして、信頼できるエンティティが Alibaba Cloud サービスである RAM ロールを作成します。
左側のナビゲーションウィンドウで、[ID > ロール] を選択します。[ロール] ページで、[ロールの作成] をクリックします。[ロールの作成] ページで、次のパラメーターを特定の値に設定し、ビジネス要件に基づいて他のパラメーターを設定します。パラメーター設定の詳細については、「標準サービスロールを作成する」をご参照ください。
プリンシパルタイプ:[クラウドサービス] を選択します。
プリンシパル名: [elastic Compute Service] [/ ECS] を選択します。
インスタンス RAM ロールに権限を付与します。
インスタンス RAM ロールにシステムポリシーまたは作成したカスタムポリシーをアタッチして、特定のリソースにアクセスまたは管理するための権限をインスタンス RAM ロールに付与します。たとえば、AliyunLogReadOnlyAccess ポリシーを使用して、Simple Log Service からデータを読み取る権限を付与できます。
説明インスタンス RAM ロールには、[システムポリシー] または [カスタムポリシー] をアタッチできます。システムポリシーがビジネス要件を満たしていない場合は、カスタムポリシーを作成できます。詳細については、「カスタムポリシーを作成する」をご参照ください。
インスタンス RAM ロールを ECS インスタンスにアタッチします。
ECS コンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。
ページの左上隅で、ターゲットリソースが配置されているリソースグループとリージョンを選択します。

インスタンス RAM ロールをアタッチする ECS インスタンスを見つけ、[アクション] 列で を選択します。
[RAM ロールの割り当て/割り当て解除] ダイアログボックスで、[RAM ロール] ドロップダウンリストから作成したインスタンス RAM ロールを選択し、[確認] をクリックします。
API オペレーションを使用する
インスタンス RAM ロールを作成して設定します。
CreateRole オペレーションを呼び出して、インスタンス RAM ロールを作成します。
AssumeRolePolicyDocument パラメーターを次のポリシーに設定します。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }オプション。CreatePolicy オペレーションを呼び出して、ポリシーを作成します。
インスタンス RAM ロールにアタッチできるポリシーがすでにある場合は、この手順をスキップします。
PolicyDocumentパラメーターを次のポリシーに設定します。{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
AttachPolicyToRole オペレーションを呼び出して、ポリシーをインスタンス RAM ロールにアタッチします。
AttachInstanceRamRole オペレーションを呼び出して、インスタンス RAM ロールを ECS インスタンスにアタッチします。
ステップ 2:Simple Log Service SDK にアクセスする
Java
Java 用 Simple Log Service SDK
Maven プロジェクトで Java 用 Simple Log Service SDK を使用するには、pom.xml ファイルに関連する依存関係を追加するだけです。詳細については、「Java 用 Simple Log Service SDK の概要」をご参照ください。
重要SDK のバージョンが 0.6.110 以降であることを確認してください。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log</artifactId> <version>0.6.110</version> </dependency>Clientクラスに作成されたインスタンス RAM ロールを指定します。詳細については、「ステップ 1:インスタンス RAM ロールを作成し、ECS インスタンスにアタッチする」をご参照ください。import com.aliyun.openservices.log.exception.LogException; import com.aliyun.openservices.log.response.GetProjectResponse; public class Main { public static void main(String[] args) throws LogException { // RoleName パラメーターを作成されたインスタンス RAM ロールに設定します。 Client client = new Client("cn-hangzhou.log.aliyuncs.com", "RoleName"); GetProjectResponse resp = client.GetProject("your-project"); System.out.println(resp.GetProjectDescription()); } }
Aliyun Log Java Producer
Maven プロジェクトで Aliyun Log Java Producer を使用するには、pom.xml ファイルに関連する依存関係を追加するだけです。詳細については、「Aliyun Log Java Producer」をご参照ください。
重要Producer のバージョンが 0.3.22 以降であることを確認してください。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log-producer</artifactId> <version>0.3.22</version> </dependency>プロジェクト設定 の
ProjectConfigパラメーターに作成されたインスタンス RAM ロールを指定します。詳細については、「ステップ 1:インスタンス RAM ロールを作成し、ECS インスタンスにアタッチする」をご参照ください。import com.aliyun.openservices.aliyun.log.producer.*; import com.aliyun.openservices.aliyun.log.producer.errors.ProducerException; import com.aliyun.openservices.log.common.LogItem; import com.aliyun.openservices.log.common.auth.CredentialsProvider; import com.aliyun.openservices.log.common.auth.ECSRoleCredentialsProvider; public class ExampleUsage { public static void main(String[] args) throws ProducerException, InterruptedException { String endpoint = "cn-hangzhou.log.aliyuncs.com"; String project = "your-project"; String logStore = "your-logstore"; // ProducerConfig パラメーターを設定します。 Config producerConfig = new ProducerConfig(); // Producer を作成します。 Producer producer = new LogProducer(new ProducerConfig()); // your-ecs-ram-role-name を作成されたインスタンス RAM ロールに置き換えます。 CredentialsProvider provider = new ECSRoleCredentialsProvider("your-ecs-ram-role-name"); // プロジェクトを設定します。 ProjectConfig projectConfig = new ProjectConfig(project, endpoint, provider, null); producer.putProjectConfig(projectConfig); // ログを送信します producer.send(project, logStore, buildLogItem()); producer.send(project, logStore, null, null, buildLogItem()); producer.send(project, logStore, "", "", buildLogItem()); producer.close(); } public static LogItem buildLogItem() { LogItem logItem = new LogItem(); logItem.PushBack("k1", "v1"); logItem.PushBack("k2", "v2"); return logItem; } }
Aliyun Log Java Consumer
Maven プロジェクトで Aliyun Log Java Consumer を使用するには、pom.xml ファイルに関連する依存関係を追加するだけです。詳細については、「コンシューマーグループを使用してログを消費する」をご参照ください。
重要Consumer のバージョンが 0.6.47 以降であることを確認してください。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>loghub-client-lib</artifactId> <version>0.6.47</version> </dependency>コンシューマーを作成する ために、
LogHubConfigパラメーターに作成されたインスタンス RAM ロールを指定します。詳細については、「ステップ 1:インスタンス RAM ロールを作成し、ECS インスタンスにアタッチする」をご参照ください。import com.aliyun.openservices.log.common.auth.ECSRoleCredentialsProvider; import com.aliyun.openservices.log.common.auth.CredentialsProvider; import com.aliyun.openservices.loghub.client.ClientWorker; import com.aliyun.openservices.loghub.client.config.LogHubConfig; import com.aliyun.openservices.loghub.client.exceptions.LogHubClientWorkerException; public class Main { private static String Endpoint = "cn-hangzhou.log.aliyuncs.com"; private static String Project = "your-project"; private static String Logstore = "your-logstore"; private static String ConsumerGroup = "consumerGroupX"; public static void main(String[] args) throws LogHubClientWorkerException, InterruptedException { // your-ecs-ram-role-name を作成されたインスタンス RAM ロールに置き換えます。 CredentialsProvider provider = new ECSRoleCredentialsProvider("your-ecs-ram-role-name"); LogHubConfig config = new LogHubConfig(ConsumerGroup, "consumer_1", Endpoint, Project, Logstore, provider, LogHubConfig.ConsumePosition.BEGIN_CURSOR); config.setMaxFetchLogGroupSize(1000); ClientWorker worker = new ClientWorker(new SampleLogHubProcessorFactory(), config); Thread thread = new Thread(worker); thread.start(); Thread.sleep(60 * 60 * 1000); worker.shutdown(); Thread.sleep(30 * 1000); } }
Go
Go 用 Simple Log Service SDK のバージョンが 0.1.83 以降であることを確認してください。Go 用 Simple Log Service SDK のアップグレード方法の詳細については、「Go 用 Simple Log Service SDK をインストールまたはアップグレードする」をご参照ください。
Go 用 Simple Log Service
provider パラメーターに作成されたインスタンス RAM ロールを指定します。詳細については、「ステップ 1:インスタンス RAM ロールを作成し、ECS インスタンスにアタッチする」をご参照ください。
package main
import (
"fmt"
sls "github.com/aliyun/aliyun-log-go-sdk"
)
func main() {
// Simple Log Service エンドポイント。この例では、中国 (成都) リージョンの Simple Log Service エンドポイントが使用されています。パラメーター値を実際のエンドポイントに置き換えます。
Endpoint := "cn-chengdu.log.aliyuncs.com"
// your-ecs-ram-role-name を作成されたインスタンス RAM ロールに置き換えます。
provider := sls.NewEcsRamRoleCredentialsProvider("your-ecs-ram-role-name")
// Simple Log Service クライアントを作成します。
client := sls.CreateNormalInterfaceV2(Endpoint, provider)
resp, err := client.GetProject("your-project")
if err != nil {
panic(err)
}
fmt.Println(resp.Description)
}Aliyun Log Go Producer
ProducerConfig 設定の provider パラメーターに作成されたインスタンス RAM ロールを指定します。詳細については、「ステップ 1:インスタンス RAM ロールを作成し、ECS インスタンスにアタッチする」をご参照ください。
package main
import (
"fmt"
"os"
"os/signal"
"sync"
"time"
sls "github.com/aliyun/aliyun-log-go-sdk"
"github.com/aliyun/aliyun-log-go-sdk/producer"
"github.com/gogo/protobuf/proto"
)
func main() {
producerConfig := producer.GetDefaultProducerConfig()
producerConfig.Endpoint = "cn-hangzhou.log.aliyuncs.com"
// your-ecs-ram-role-name を作成されたインスタンス RAM ロールに置き換えます。
provider := sls.NewEcsRamRoleCredentialsProvider("your-ecs-ram-role-name")
producerConfig.CredentialsProvider = provider
producerInstance := producer.InitProducer(producerConfig)
ch := make(chan os.Signal)
signal.Notify(ch, os.Kill, os.Interrupt)
producerInstance.Start()
var m sync.WaitGroup
for i := 0; i < 10; i++ {
m.Add(1)
go func() {
defer m.Done()
for i := 0; i < 1000; i++ {
log := producer.GenerateLog(uint32(time.Now().Unix()), map[string]string{"content": "test", "content2": fmt.Sprintf("%v", i)})
err := producerInstance.SendLog("log-project", "log-store", "topic", "127.0.0.1", log)
if err != nil {
fmt.Println(err)
}
}
}()
}
m.Wait()
fmt.Println("送信完了")
if _, ok := <-ch; ok {
fmt.Println("シャットダウンシグナルを受信し、シャットダウンを開始します")
producerInstance.Close(60000)
}
}Aliyun Log Go Consumer
CredentialsProvider パラメーターに作成されたインスタンス RAM ロールを指定します。詳細については、「ステップ 1:インスタンス RAM ロールを作成し、ECS インスタンスにアタッチする」をご参照ください。
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
sls "github.com/aliyun/aliyun-log-go-sdk"
consumerLibrary "github.com/aliyun/aliyun-log-go-sdk/consumer"
"github.com/go-kit/kit/log/level"
)
func main() {
option := consumerLibrary.LogHubConfig{
Endpoint: "cn-hangzhou.log.aliyuncs.com",
// your-ecs-ram-role-name を作成されたインスタンス RAM ロールに置き換えます。
CredentialsProvider: sls.NewEcsRamRoleCredentialsProvider("your-ecs-ram-role-name"),
Project: "your-project",
Logstore: "your-logstore",
ConsumerGroupName: "your-consumer-group",
ConsumerName: "your-consumer-group-consumer-1",
CursorPosition: consumerLibrary.END_CURSOR,
}
consumerWorker := consumerLibrary.InitConsumerWorkerWithCheckpointTracker(option, process)
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
consumerWorker.Start()
if _, ok := <-ch; ok {
level.Info(consumerWorker.Logger).Log("msg", "停止シグナルを受信し、コンシューマーワーカーの停止を開始します", "consumer worker name", option.ConsumerName)
consumerWorker.StopAndWait()
}
}
// データ消費ロジック。
func process(shardId int, logGroupList *sls.LogGroupList, checkpointTracker consumerLibrary.CheckPointTracker) (string, error) {
fmt.Println(shardId, logGroupList)
checkpointTracker.SaveCheckPoint(false)
return "", nil
}
関連情報
セルフマネージドアプリケーションが ECS インスタンスにデプロイされている場合は、インスタンス RAM ロールを ECS インスタンスにアタッチし、インスタンス RAM ロールを使用してインスタンスから Key Management Service(KMS)にアクセスできます。詳細については、「ECS インスタンスにアタッチされたインスタンス RAM ロールを使用して KMS に安全にアクセスする」をご参照ください。
ECS インスタンスが特定の権限を必要としなくなった場合は、インスタンスにアタッチされているインスタンス RAM ロールから権限を取り消すことができます。詳細については、「RAM ロールから権限を取り消す」をご参照ください。
Alibaba Cloud の API オペレーションを呼び出すために使用するコードにプレーンテキストの AccessKey ペアをハードコードすると、コードリポジトリの権限管理が不適切なために AccessKey ペアが漏洩する可能性があります。Alibaba Cloud の API オペレーションを呼び出すには、ハードコードされた AccessKey ペアではなくアクセス認証情報を使用することをお勧めします。詳細については、「アクセス認証情報を使用して API オペレーションを呼び出すためのベストプラクティス」および「アクセス資格情報を使用してAPI操作を呼び出すためのベストプラクティス」をご参照ください。
> [インスタンス設定] > [RAM ロールの割り当て/割り当て解除]