ECS インスタンス上で実行されるアプリケーションが他のクラウドリソースにアクセスする必要がある場合、アクセス認証情報を設定する必要があります。ECS インスタンスにインスタンス RAM ロールをアタッチすることで、インスタンスは自動的に一時的な認証情報を取得および更新できます。これにより、アクセスキーの漏洩を回避し、漏洩リスクを軽減できます。RAM ロールを使用することで、きめ細かなアクセス制御が可能になり、過剰な権限の割り当てを防ぐことができます。このトピックでは、アクセスキーなしで ECS インスタンス上の Simple Log Service (SLS) SDK を使用する方法について説明します。
-
インスタンス RAM ロールは、Alibaba Cloud サービスを信頼されたプリンシパルとして使用する RAM ロールの一種です。これにより、クラウドサービスがロールを引き受けて、サービス間アクセスを可能にします。RAM ロールの詳細については、「RAM ロールとは」をご参照ください。
-
Alibaba Cloud アクセスキーペアは、API を呼び出してクラウドリソースにアクセスするために使用されるセキュリティ認証情報です。アクセスキーペアを使用して、サーバー側のセキュリティ検証のために API リクエストに署名できます。アクセスキーペアの詳細については、「アクセスキーペア」をご参照ください。
-
SLS のカスタムポリシーの詳細については、「RAM カスタムポリシーの例」をご参照ください。
制限事項
-
この機能は、SLS SDK for Java および SLS SDK for Go でのみサポートされています。
-
ECS インスタンスは VPC 内にある必要があります。
-
1 つの ECS インスタンスにアタッチできる RAM ロールは 1 つのみです。
ステップ 1: インスタンス RAM ロールの作成とアタッチ
コンソール
-
RAM コンソールにログインし、Alibaba Cloud サービスをプリンシパルとして使用する RAM ロールを作成します。
[アイデンティティ > ロール] を選択し、ロールの作成 をクリックします。画面の指示に従ってロールを作成します。その際、以下のパラメーターに注意してください。その他のパラメーターは、必要に応じて設定してください。詳細については、「共通サービスロールの作成」をご参照ください。
-
信頼できるエンティティの種類: [Alibaba Cloud サービス] を選択します。
-
ロールタイプ には、[通常のサービスロール] を選択します。次に、「信頼できるサービス」ドロップダウンリストから [ECS] を選択します。
-
-
インスタンス RAM ロールに権限を付与します。
RAM ロールにシステムポリシーまたはカスタムポリシーをアタッチして、必要な権限を付与します。たとえば、SLS への読み取り専用アクセスを付与するには、AliyunLogReadOnlyAccess ポリシーをロールにアタッチします。
説明システムポリシー または カスタムポリシー を追加できます。 システムポリシーが要件を満たさない場合は、カスタムポリシーを作成できます。 詳細については、「カスタムポリシーの作成」をご参照ください。
-
インスタンス RAM ロールを ECS インスタンスにアタッチします。
-
ECS コンソールにログインします。
-
左側のナビゲーションペインで、 を選択します。
-
上部メニューで、対象インスタンスが属するリージョンとリソースグループを選択します。
-
目的の ECS インスタンスを見つけ、操作列で の順に選択します。
-
表示されるダイアログボックスで、作成したインスタンス RAM ロールを選択し、OK をクリックします。
-
API
-
インスタンス RAM ロールを作成および設定します。
-
CreateRole API を呼び出して、インスタンス RAM ロールを作成します。
AssumeRolePolicyDocument パラメータを次のポリシーに設定します:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" } -
(オプション) CreatePolicy API を呼び出して、許可ポリシーを作成します。
使用可能な許可ポリシーがある場合は、この手順をスキップできます。
PolicyDocumentパラメータを次のように設定します:{ "Statement": [ { "Action": [ "log:Get*", "log:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
-
-
AttachPolicyToRole API を呼び出して、許可ポリシーをインスタンス RAM ロールにアタッチします。
-
AttachInstanceRamRole API を呼び出して、インスタンス RAM ロールを ECS インスタンスにアタッチします。
ステップ 2: SLS SDK へのアクセス
Java
Java SDK
-
Maven プロジェクトで SLS SDK for Java を使用するには、pom.xml ファイルに次の依存関係を追加します。詳細については、「SLS SDK for Java」をご参照ください。
重要SLS SDK for Java の最小必須バージョンは 0.6.110 です。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log</artifactId> <version>0.6.110</version> </dependency> -
Clientクラスに、ステップ 1 で作成したインスタンス RAM ロールの名前を入力パラメータとして渡します。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()); } }
Java Producer
-
Maven プロジェクトで Aliyun Log Java Producer を使用するには、pom.xml ファイルに次の依存関係を追加します。詳細については、「Aliyun Log Java Producer」をご参照ください。
重要Aliyun Log Java Producer の最小必須バージョンは 0.3.22 です。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log-producer</artifactId> <version>0.3.22</version> </dependency> -
ログプロジェクトの設定で、
ProjectConfigパラメータに ステップ 1 で作成したインスタンス RAM ロールの名前を指定します。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; } }
Java Consumer
-
Maven プロジェクトで Aliyun Log Java Consumer を使用するには、pom.xml ファイルに次の依存関係を追加します。詳細については、「コンシューマーグループを使用したログの消費」をご参照ください。
重要Aliyun Log Java Consumer の最小必須バージョンは 0.6.47 です。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>loghub-client-lib</artifactId> <version>0.6.47</version> </dependency> -
コンシューマーの作成では、
LogHubConfigパラメータを ステップ 1 で作成したインスタンス RAM ロールの名前に設定します。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
アクセスキーなしで SLS SDK for Go にアクセスするには、SDK のバージョン 0.1.83 以降を使用する必要があります。SDK をアップグレードするには、「SDK のインストールまたはアップグレード」をご参照ください。
Go SDK
provider には、ステップ 1 で作成したインスタンス RAM ロールの名前を指定します。
package main
import (
"fmt"
sls "github.com/aliyun/aliyun-log-go-sdk"
)
func main() {
// SLS のエンドポイント。この例では中国 (成都) リージョンを使用しています。実際のエンドポイントに置き換えてください。
Endpoint := "cn-chengdu.log.aliyuncs.com"
// your-ecs-ram-role-name を作成した RAM ロールの名前に置き換えます。
provider := sls.NewEcsRamRoleCredentialsProvider("your-ecs-ram-role-name")
// SLS クライアントを作成します。
client := sls.CreateNormalInterfaceV2(Endpoint, provider)
resp, err := client.GetProject("your-project")
if err != nil {
panic(err)
}
fmt.Println(resp.Description)
}
Go Producer
ProducerConfig の設定で、provider パラメータを ステップ 1 で作成したインスタンス RAM ロールの名前に設定します。
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("Send completion")
if _, ok := <-ch; ok {
fmt.Println("Get the shutdown signal and start to shut down")
producerInstance.Close(60000)
}
}
Go Consumer
CredentialsProvider 入力パラメータには、ステップ 1 で作成したインスタンス RAM ロールの名前を渡します。
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", "get stop signal, start to stop consumer worker", "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
}
関連ドキュメント
-
セルフマネージドアプリケーションが Alibaba Cloud ECS インスタンス上にデプロイされており、Key Management Service (KMS) にアクセスする必要がある場合は、インスタンス RAM ロールを使用して KMS に安全にアクセスできます。
-
ECS インスタンスが特定のリソースアクセス権限を必要としなくなった場合は、RAM ロールから権限を取り消すことができます。
-
Alibaba Cloud OpenAPI を呼び出す際、コード内にアクセスキーペアをハードコーディングすると、コードリポジトリが適切に管理されていない場合にセキュリティリスクが生じます。詳細については、「認証情報を使用した Alibaba Cloud OpenAPI へのアクセス」をご参照ください。
> インスタンスの設定 > RAM ロールのアタッチ/デタッチ