當ECS執行個體或部署在ECS執行個體上的應用需要訪問其他雲資源時,必須配置訪問憑證,阿里雲服務會通過訪問憑證驗證您的身份資訊和存取權限。執行個體RAM角色允許您將一個角色關聯到ECS執行個體,實現在執行個體內部自動擷取並重新整理臨時訪問憑證,無需直接暴露AccessKey,減少密鑰泄露的風險。同時,也可藉助RAM角色精細化控制資源存取權限,避免許可權資源過度分派。本文介紹在ECS中無需AccessKey直接存取Log ServiceSDK的操作步驟。
使用限制
步驟一:建立ECS執行個體RAM角色並授予給ECS
通過控制台建立和授予
登入RAM控制台,建立執行個體RAM角色。
建立可信實體為阿里雲服務的RAM角色。
選擇身份管理 > 角色,單擊建立角色,按照介面提示完成角色建立。注意以下參數(其他參數按需填寫,可參見建立普通服務角色):
可信實體類型:選擇阿里雲服務。
角色類型:選擇普通服務角色。
受信服務:選擇雲端服務器。
為已建立的執行個體RAM角色授權。
將系統策略或已建立的自訂權限原則授權給RAM使用者,使其擁有相關的資源訪問或操作許可權。例如,給角色賦予Log Service的唯讀許可權(AliyunLogReadOnlyAccess)。
說明支援添加系統策略或自訂策略。若系統策略不滿足您的需求,可建立自訂策略。具體操作,請參見建立自訂權限原則。
授予執行個體RAM角色給ECS執行個體。
登入ECS管理主控台。
在左側導覽列,選擇 。
在頁面左側頂部,選擇目標資源所在的資源群組和地區。
找到要操作的ECS執行個體,選擇
。在對話方塊中,選擇建立好的執行個體RAM角色,單擊確定。
通過API建立和授予
建立並配置執行個體RAM角色
調用CreateRole介面建立執行個體RAM角色。
按如下原則設定參數AssumeRolePolicyDocument:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
(可選)調用CreatePolicy介面建立權限原則。
如果您已有可用權限原則,可跳過該步驟。
PolicyDocument
(權限原則)需按如下設定:{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
調用AttachPolicyToRole介面為執行個體RAM角色授權。
調用AttachInstanceRamRole介面將RAM角色授予ECS執行個體。
步驟二:訪問Log ServiceSDK
Java
Java SDK
在Maven工程中使用Log ServiceJava SDK,只需在pom.xml中加入相應依賴。更多資訊,請參見Java SDK。
重要Java SDK最低版本號碼為0.6.110。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log</artifactId> <version>0.6.110</version> </dependency>
Client
類入參取消AccessKey,傳入步驟一建立的執行個體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工程中使用Log ServiceAliyun Log Java Producer,只需在pom.xml中加入相應依賴。更多資訊,請參見Aliyun Log Java Producer。
重要Java Producer最低版本號碼為0.3.22。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log-producer</artifactId> <version>0.3.22</version> </dependency>
配置記錄項目中
ProjectConfig
入參取消AccessKey,傳入步驟一建立的執行個體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); // send logs 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工程中使用Log ServiceAliyun LOG Java Consumer,只需在pom.xml中加入相應依賴。更多資訊,請參見通過消費組消費資料。
重要Java Consumer最低版本號碼為0.6.47。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>loghub-client-lib</artifactId> <version>0.6.47</version> </dependency>
建立消費者
LogHubConfig
入參取消AccessKey,傳入步驟一建立的執行個體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
無AccessKey訪問Log ServiceGo SDK,Go SDK最低版本號碼為 0.1.83。升級Go SDK,請參見安裝或升級SDK。
Go SDK
provider
入參傳入步驟一建立的執行個體RAM角色名稱。
package main
import (
"fmt"
sls "github.com/aliyun/aliyun-log-go-sdk"
)
func main() {
// Log Service的服務入口。此處以杭州為例,其它地區請根據實際情況填寫。
Endpoint := "cn-chengdu.log.aliyuncs.com"
// 這裡將 your-ecs-ram-role-name 替換成上面建立的 ram 角色名稱
provider := sls.NewEcsRamRoleCredentialsProvider("your-ecs-ram-role-name")
// 建立Log ServiceClient。
client := sls.CreateNormalInterfaceV2(Endpoint, provider)
resp, err := client.GetProject("your-project")
if err != nil {
panic(err)
}
fmt.Println(resp.Description)
}
Go Producer
配置ProducerConfig中provider
入參傳入步驟一建立的執行個體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
入參傳入步驟一建立的執行個體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
}
相關文檔
當您的自建應用部署在阿里雲ECS伺服器上,且需要訪問KMS應用時,可以使用ECS執行個體RAM角色訪問KMS。具體操作,請參見使用ECS執行個體RAM角色安全訪問KMS。
當ECS不需要某些資源存取權限時,可以通過移除執行個體RAM角色的許可權來實現。具體操作,請參見為RAM角色移除許可權。
訪問阿里雲OpenAPI時,如果在代碼中寫入程式碼明文AK,容易因代碼倉庫許可權管理不當造成AK泄露,建議您通過非AccessKey硬式編碼方式編程,使用訪問憑證訪問阿里雲OpenAPI,可參見使用訪問憑據訪問阿里雲OpenAPI最佳實務和憑據的安全使用方式情節。