AWS 资源身份验证
StarRocks 支持使用三种身份验证方法与 AWS 资源集成:基于实例配置文件的身份验证、基于承担角色的身份验证和基于 IAM 用户的身份验证。本主题介绍如何使用这些身份验证方法配置 AWS 凭证。
身份验证方法
基于实例配置文件的身份验证
基于实例配置文件的身份验证方法允许您的 StarRocks 集群继承 EC2 实例的实例配置文件中指定的权限,该集群在 EC2 实例上运行。从理论上讲,任何可以登录到集群的集群用户都可以根据您配置的 AWS IAM 策略对您的 AWS 资源执行允许的操作。此用例的典型场景是,您不需要集群中多个集群用户之间的任何 AWS 资源访问控制。这种身份验证方法意味着同一集群内不需要隔离。
但是,这种身份验证方法仍然可以被视为集群级别的安全访问控制解决方案,因为可以登录到集群的任何人都由集群管理员控制。
基于 Assume Role 的身份验证
与基于实例配置文件的身份验证不同,基于承担角色的身份验证方法支持承担 AWS IAM 角色以获取对您的 AWS 资源的访问权限。有关详细信息,请参见承担角色。
基于 IAM 用户的身份验证
基于 IAM 用户的身份验证方法支持使用 IAM 用户凭证来获取对您的 AWS 资源的访问权限。有关详细信息,请参见IAM 用户。
准备工作
首先,找到与运行 StarRocks 集群的 EC2 实例关联的 IAM 角色(在本主题中以后称为 EC2 实例角色),并获取该角色的 ARN。您将需要 EC2 实例角色进行基于实例配置文件的身份验证,并且需要 EC2 实例角色及其 ARN 进行基于承担角色的身份验证。
下一步,根据您要访问的 AWS 资源的类型以及 StarRocks 中的特定操作场景创建 IAM 策略。AWS IAM 中的策略声明对特定 AWS 资源的一组权限。创建策略后,您需要将其附加到 IAM 角色或用户。这样,IAM 角色或用户将被分配策略中声明的权限以访问指定的 AWS 资源。
注意
要进行这些准备,您必须具有登录到AWS IAM 控制台并编辑 IAM 用户和角色的权限。
对于您需要访问特定 AWS 资源的 IAM 策略,请参见以下部分
基于实例配置文件的身份验证的准备工作
将IAM 策略附加到 EC2 实例角色,以便访问所需的 AWS 资源。
基于承担角色的身份验证的准备工作
创建 IAM 角色并将其附加到策略
根据您要访问的 AWS 资源,创建一个或多个 IAM 角色。请参见创建 IAM 角色。然后,将IAM 策略附加到您创建的 IAM 角色,以便访问所需的 AWS 资源。
例如,您希望 StarRocks 集群访问 AWS S3 和 AWS Glue。在这种情况下,您可以选择创建一个 IAM 角色(例如,s3_assumed_role
),并将访问 AWS S3 的策略和访问 AWS Glue 的策略都附加到该角色。或者,您可以选择创建两个不同的 IAM 角色(例如,s3_assumed_role
和 glue_assumed_role
),并将这些策略分别附加到两个不同的角色(即,将访问 AWS S3 的策略附加到 s3_assumed_role
,并将访问 AWS Glue 的策略附加到 glue_assumed_role
)。
您创建的 IAM 角色将由 StarRocks 集群的 EC2 实例角色承担,以访问指定的 AWS 资源。
本节假设您只创建了一个承担角色 s3_assumed_role
,并且已经将访问 AWS S3 的策略和访问 AWS Glue 的策略都添加到了该角色。
配置信任关系
按如下方式配置您的承担角色
-
登录到AWS IAM 控制台。
-
在左侧导航窗格中,选择访问管理 > 角色。
-
找到承担角色 (
s3_assumed_role
) 并单击其名称。 -
在角色的详细信息页面上,单击信任关系选项卡,然后在信任关系选项卡上,单击编辑信任策略。
-
在编辑信任策略页面上,删除现有的 JSON 策略文档,并粘贴以下 IAM 策略,其中您必须将
<cluster_EC2_iam_role_ARN>
替换为您上面获得的 EC2 实例角色的 ARN。然后,单击更新策略。{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "<cluster_EC2_iam_role_ARN>"
},
"Action": "sts:AssumeRole"
}
]
}
如果您已经创建了不同的承担角色来访问不同的 AWS 资源,您需要重复上述步骤来配置您的其他承担角色。例如,您已经创建了 s3_assumed_role
和 glue_assumed_role
分别用于访问 AWS S3 和 AWS Glue。在这种情况下,您需要重复上述步骤来配置 glue_assumed_role
。
按如下方式配置您的 EC2 实例角色
-
登录到AWS IAM 控制台。
-
在左侧导航窗格中,选择访问管理 > 角色。
-
找到 EC2 实例角色并单击其名称。
-
在角色的详细信息页面的权限策略部分中,单击添加权限并选择创建内联策略。
-
在指定权限步骤中,单击 JSON 选项卡,删除现有的 JSON 策略文档,并粘贴以下 IAM 策略,其中您必须将
<s3_assumed_role_ARN>
替换为承担角色s3_assumed_role
的 ARN。然后,单击审查策略。{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["sts:AssumeRole"],
"Resource": [
"<s3_assumed_role_ARN>"
]
}
]
}如果您已经创建了不同的承担角色来访问不同的 AWS 资源,您需要在上述 IAM 策略的 Resource 元素中填写所有这些承担角色的 ARN,并用逗号 (,) 分隔它们。例如,您已经创建了
s3_assumed_role
和glue_assumed_role
分别用于访问 AWS S3 和 AWS Glue。在这种情况下,您需要使用以下格式在 Resource 元素中填写s3_assumed_role
的 ARN 和glue_assumed_role
的 ARN:"<s3_assumed_role_ARN>","<glue_assumed_role_ARN>"
。 -
在审查策略步骤中,输入策略名称并单击创建策略。
基于 IAM 用户的身份验证的准备工作
创建一个 IAM 用户。请参见在您的 AWS 账户中创建 IAM 用户。
然后,将IAM 策略附加到您创建的 IAM 用户,以便访问所需的 AWS 资源。
身份验证方法之间的比较
下图提供了 StarRocks 中基于实例配置文件的身份验证、基于承担角色的身份验证和基于 IAM 用户的身份验证的机制差异的总体解释。
与 AWS 资源建立连接
访问 AWS S3 的身份验证参数
在 StarRocks 需要与 AWS S3 集成的各种场景中,例如,当您创建外部目录或文件外部表时,或者当您从 AWS S3 摄取、备份或还原数据时,请按如下方式配置访问 AWS S3 的身份验证参数
- 对于基于实例配置文件的身份验证,请将
aws.s3.use_instance_profile
设置为true
。 - 对于基于承担角色的身份验证,请将
aws.s3.use_instance_profile
设置为true
并将aws.s3.iam_role_arn
配置为您用于访问 AWS S3 的承担角色的 ARN(例如,您上面创建的承担角色s3_assumed_role
的 ARN)。 - 对于基于 IAM 用户的身份验证,请将
aws.s3.use_instance_profile
设置为false
并将aws.s3.access_key
和aws.s3.secret_key
配置为您的 AWS IAM 用户的访问密钥和密钥。
下表描述了参数。
参数 | 必需 | 描述 |
---|---|---|
aws.s3.use_instance_profile | 是 | 指定是否启用基于实例配置文件的身份验证方法和基于 Assume Role 的身份验证方法。有效值:true 和 false 。默认值:false 。 |
aws.s3.iam_role_arn | 否 | 具有对您的 AWS S3 存储桶权限的 IAM 角色的 ARN。如果您使用基于 Assume Role 的身份验证方法访问 AWS S3,则必须指定此参数。 |
aws.s3.access_key | 否 | 您的 IAM 用户的访问密钥。如果您使用基于 IAM 用户的身份验证方法访问 AWS S3,则必须指定此参数。 |
aws.s3.secret_key | 否 | 您的 IAM 用户的密钥。如果您使用基于 IAM 用户的身份验证方法访问 AWS S3,则必须指定此参数。 |
访问 AWS Glue 的身份验证参数
在 StarRocks 需要与 AWS Glue 集成的各种场景中,例如,当您创建外部目录时,请按如下方式配置访问 AWS Glue 的身份验证参数
- 对于基于实例配置文件的身份验证,请将
aws.glue.use_instance_profile
设置为true
。 - 对于基于承担角色的身份验证,请将
aws.glue.use_instance_profile
设置为true
并将aws.glue.iam_role_arn
配置为您用于访问 AWS Glue 的承担角色的 ARN(例如,您上面创建的承担角色glue_assumed_role
的 ARN)。 - 对于基于 IAM 用户的身份验证,请将
aws.glue.use_instance_profile
设置为false
并将aws.glue.access_key
和aws.glue.secret_key
配置为您的 AWS IAM 用户的访问密钥和密钥。
下表描述了参数。
参数 | 必需 | 描述 |
---|---|---|
aws.glue.use_instance_profile | 是 | 指定是否启用基于实例配置文件的身份验证方法和基于 Assume Role 的身份验证。有效值:true 和 false 。默认值:false 。 |
aws.glue.iam_role_arn | 否 | 具有对您的 AWS Glue Data Catalog 权限的 IAM 角色的 ARN。如果您使用基于 Assume Role 的身份验证方法访问 AWS Glue,则必须指定此参数。 |
aws.glue.access_key | 否 | 您的 AWS IAM 用户的访问密钥。如果您使用基于 IAM 用户的身份验证方法访问 AWS Glue,则必须指定此参数。 |
aws.glue.secret_key | 否 | 您的 AWS IAM 用户的密钥。如果您使用基于 IAM 用户的身份验证方法访问 AWS Glue,则必须指定此参数。 |
集成示例
外部目录
在您的 StarRocks 集群中创建外部目录意味着与目标数据湖系统建立集成,该系统由两个关键组件组成
- 文件存储(如 AWS S3)以存储表文件
- 元数据存储(如 Hive 元数据存储或 AWS Glue)以存储表文件的元数据和位置
StarRocks 支持以下类型的目录
以下示例根据您使用的元数据存储类型创建一个名为 hive_catalog_hms
或 hive_catalog_glue
的 Hive 目录,以查询您的 Hive 集群中的数据。有关详细的语法和参数,请参见Hive 目录。
基于实例配置文件的身份验证
-
如果您在 Hive 集群中使用 Hive 元数据存储,请运行如下命令
CREATE EXTERNAL CATALOG hive_catalog_hms
PROPERTIES
(
"type" = "hive",
"aws.s3.use_instance_profile" = "true",
"aws.s3.region" = "us-west-2",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
); -
如果您在 Amazon EMR Hive 集群中使用 AWS Glue,请运行如下命令
CREATE EXTERNAL CATALOG hive_catalog_glue
PROPERTIES
(
"type" = "hive",
"aws.s3.use_instance_profile" = "true",
"aws.s3.region" = "us-west-2",
"hive.metastore.type" = "glue",
"aws.glue.use_instance_profile" = "true",
"aws.glue.region" = "us-west-2"
);
基于承担角色的身份验证
-
如果您在 Hive 集群中使用 Hive 元数据存储,请运行如下命令
CREATE EXTERNAL CATALOG hive_catalog_hms
PROPERTIES
(
"type" = "hive",
"aws.s3.use_instance_profile" = "true",
"aws.s3.iam_role_arn" = "arn:aws:iam::081976408565:role/s3_assumed_role",
"aws.s3.region" = "us-west-2",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
); -
如果您在 Amazon EMR Hive 集群中使用 AWS Glue,请运行如下命令
CREATE EXTERNAL CATALOG hive_catalog_glue
PROPERTIES
(
"type" = "hive",
"aws.s3.use_instance_profile" = "true",
"aws.s3.iam_role_arn" = "arn:aws:iam::081976408565:role/s3_assumed_role",
"aws.s3.region" = "us-west-2",
"hive.metastore.type" = "glue",
"aws.glue.use_instance_profile" = "true",
"aws.glue.iam_role_arn" = "arn:aws:iam::081976408565:role/glue_assumed_role",
"aws.glue.region" = "us-west-2"
);
基于 IAM 用户的身份验证
-
如果您在 Hive 集群中使用 Hive 元数据存储,请运行如下命令
CREATE EXTERNAL CATALOG hive_catalog_hms
PROPERTIES
(
"type" = "hive",
"aws.s3.use_instance_profile" = "false",
"aws.s3.access_key" = "<iam_user_access_key>",
"aws.s3.secret_key" = "<iam_user_access_key>",
"aws.s3.region" = "us-west-2",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
); -
如果您在 Amazon EMR Hive 集群中使用 AWS Glue,请运行如下命令
CREATE EXTERNAL CATALOG hive_catalog_glue
PROPERTIES
(
"type" = "hive",
"aws.s3.use_instance_profile" = "false",
"aws.s3.access_key" = "<iam_user_access_key>",
"aws.s3.secret_key" = "<iam_user_secret_key>",
"aws.s3.region" = "us-west-2",
"hive.metastore.type" = "glue",
"aws.glue.use_instance_profile" = "false",
"aws.glue.access_key" = "<iam_user_access_key>",
"aws.glue.secret_key" = "<iam_user_secret_key>",
"aws.glue.region" = "us-west-2"
);
文件外部表
文件外部表必须在您的内部目录(名为 default_catalog
)中创建。
以下示例在现有数据库(名为 test_s3_db
)上创建一个名为 file_table
的文件外部表。有关详细的语法和参数,请参见文件外部表。
基于实例配置文件的身份验证
运行如下命令
CREATE EXTERNAL TABLE test_s3_db.file_table
(
id varchar(65500),
attributes map<varchar(100), varchar(2000)>
)
ENGINE=FILE
PROPERTIES
(
"path" = "s3://starrocks-test/",
"format" = "ORC",
"aws.s3.use_instance_profile" = "true",
"aws.s3.region" = "us-west-2"
);
基于承担角色的身份验证
运行如下命令
CREATE EXTERNAL TABLE test_s3_db.file_table
(
id varchar(65500),
attributes map<varchar(100), varchar(2000)>
)
ENGINE=FILE
PROPERTIES
(
"path" = "s3://starrocks-test/",
"format" = "ORC",
"aws.s3.use_instance_profile" = "true",
"aws.s3.iam_role_arn" = "arn:aws:iam::081976408565:role/s3_assumed_role",
"aws.s3.region" = "us-west-2"
);
基于 IAM 用户的身份验证
运行如下命令
CREATE EXTERNAL TABLE test_s3_db.file_table
(
id varchar(65500),
attributes map<varchar(100), varchar(2000)>
)
ENGINE=FILE
PROPERTIES
(
"path" = "s3://starrocks-test/",
"format" = "ORC",
"aws.s3.use_instance_profile" = "false",
"aws.s3.access_key" = "<iam_user_access_key>",
"aws.s3.secret_key" = "<iam_user_secret_key>",
"aws.s3.region" = "us-west-2"
);
数据导入
您可以使用 LOAD LABEL 从 AWS S3 加载数据。
以下示例将存储在 s3a://test-bucket/test_brokerload_ingestion
路径中的所有 Parquet 数据文件加载到现有数据库(名为 test_s3_db
)中的 test_ingestion_2
表中。有关详细的语法和参数,请参见BROKER LOAD。
基于实例配置文件的身份验证
运行如下命令
LOAD LABEL test_s3_db.test_credential_instanceprofile_7
(
DATA INFILE("s3a://test-bucket/test_brokerload_ingestion/*")
INTO TABLE test_ingestion_2
FORMAT AS "parquet"
)
WITH BROKER
(
"aws.s3.use_instance_profile" = "true",
"aws.s3.region" = "us-west-1"
)
PROPERTIES
(
"timeout" = "1200"
);
基于承担角色的身份验证
运行如下命令
LOAD LABEL test_s3_db.test_credential_instanceprofile_7
(
DATA INFILE("s3a://test-bucket/test_brokerload_ingestion/*")
INTO TABLE test_ingestion_2
FORMAT AS "parquet"
)
WITH BROKER
(
"aws.s3.use_instance_profile" = "true",
"aws.s3.iam_role_arn" = "arn:aws:iam::081976408565:role/s3_assumed_role",
"aws.s3.region" = "us-west-1"
)
PROPERTIES
(
"timeout" = "1200"
);
基于 IAM 用户的身份验证
运行如下命令
LOAD LABEL test_s3_db.test_credential_instanceprofile_7
(
DATA INFILE("s3a://test-bucket/test_brokerload_ingestion/*")
INTO TABLE test_ingestion_2
FORMAT AS "parquet"
)
WITH BROKER
(
"aws.s3.use_instance_profile" = "false",
"aws.s3.access_key" = "<iam_user_access_key>",
"aws.s3.secret_key" = "<iam_user_secret_key>",
"aws.s3.region" = "us-west-1"
)
PROPERTIES
(
"timeout" = "1200"
);