当使用Proton操作对象存储时,需要配置执行操作的IAM身份信息,以及确保执行的用户或者角色具备相应的权限,否则会遇到权限不足等问题。Proton支持多种方式配置身份信息,下面进行简单说明。
Proton支持通过环境变量,配置文件,EMR ECS内部服务等方式设置操作对象存储的IAM身份信息。用户可以根据自己的业务场景从下面几个选项中选择适合自己业务场景的方式。
在core-site.xml
文件配置以下参数
<configuraiton> <property> <name>fs.tos.credentials.provider</name> <value>io.proton.common.object.tos.auth.EnvironmentCredentialsProvider</value> </property> </configuraiton>
环境变量 | 是否必须 |
---|---|
TOS_ACCESS_KEY_ID | 是 |
TOS_SECRET_ACCESS_KEY | 是 |
TOS_SESSION_TOKEN | 否 |
在core-site.xml
文件配置以下参数,该模式下,支持为不同的Bucket配置专属的身份信息,Proton在读取身份信息时,会优先检查对应Bucket是否存在对应的身份信息,其次再检查全局配置信息。
<configuraiton> <property> <name>fs.tos.credentials.provider</name> <value>io.proton.common.object.tos.auth.SimpleCredentialsProvider</value> </property> <!--全局配置 --> <property> <name>fs.tos.access-key-id</name> <value>xxxxxxxxxxxxxx</value> </property> <property> <name>fs.tos.secret-access-key</name> <value>xxxxx</value> </property> <!-- 可选项 --> <property> <name>fs.tos.session-token</name> <value>xxxxx</value> </property> <!-- Bucket级别的配置 --> <property> <name>fs.tos.bucket.bucketA.access-key-id</name> <value>xxxxxxxxxxxxxx</value> </property> <property> <name>fs.tos.bucket.bucketA.secret-access-key</name> <value>xxxxx</value> </property> <property> <name>fs.tos.bucket.bucketA.session-token</name> <value>xxxxx</value> </property> </configuraiton>
在core-site.xml
文件配置以下参数。该模式下,支持为不同的Bucket配置专属的身份信息,Proton在读取身份信息时,会优先检查对应Bucket是否存在对应的身份信息,其次再检查全局配置信息。
<configuraiton> <property> <name>fs.tos.credentials.provider</name> <value>io.proton.common.object.tos.auth.FileCredentialsProvider</value> </property> <property> <name>fs.tos.credentials.file.path</name> <value>/xxxxxxx/xxx.xml</value> </property> <!-- 文件内容刷新时间 --> <property> <name>fs.tos.credentials.file.refresh.interval</name> <value>5000</value> </property> </configuraiton>
自定义XML文件的内容
<configuraiton> <property> <name>fs.tos.access-key-id</name> <value>xxxxxxxxxxxxxx</value> </property> <property> <name>fs.tos.secret-access-key</name> <value>xxxxx</value> </property> <!-- 可选项 --> <property> <name>fs.tos.session-token</name> <value>xxxxx</value> </property> <!-- Bucket级别的配置 --> <property> <name>fs.tos.bucket.您的bucket.access-key-id</name> <value>xxxxxxxxxxxxxx</value> </property> <property> <name>fs.tos.bucket.您的bucket.secret-access-key</name> <value>xxxxx</value> </property> <property> <name>fs.tos.bucket.您的bucket.session-token</name> <value>xxxxx</value> </property> </configuraiton>
当运行环境为火山EMR时,可以在core-site.xml
文件中配置以下参数,EMR集群会使用ECS角色(比如VEECSforEMRRole)访问TOS。EMR开箱模式下,使用该认证方式,需要保证对应的ECS角色具备操作TOS数据的权限。
<configuraiton> <property> <name>fs.tos.credentials.provider</name> <value>io.proton.common.object.tos.auth.IAMInstanceCredentialsProvider</value> </property> </configuraiton>
Proton在操作TOS时,会涉及到以下Action,使用时需要根据业务情况对执行的IAM身份进行授权,具体内容可以参考TOS IAM策略概述。
Action | HDFS使用场景 | 是否必须 |
---|---|---|
HeadBucket | 获取Bucket信息,比如Bucket类型 | 是 |
ListBucket | list目录/文件 | 否 |
GetObjectTagging | 设置Attribute相关信息 | |
PutObjectTagging | ||
DeleteObjectTagging | ||
GetFileStatus | GetFileStatus场景 | |
HeadObject | ||
GetSymlink | ||
GetSymlink | ||
GetObject | 读取文件内容 | |
PutObject | 写文件,创建目录 | |
AppendObject | ||
CreateMultipartUpload | ||
UploadPart | ||
CompleteMultipartUpload | ||
AbortMultipartUpload | ||
ListMultipartUploadParts | ||
RenameObject | Rename目录,Rename文件 | |
CopyObject | ||
UploadPartCopy | ||
DeleteObject | 删除目录,删除文件 | |
DeleteObjects | ||
SetObjectMeta | 设置目录/文件元数据,比如ACL,group,owner,time等 | |
RestoreObject | Proton CLI恢复冷存数据 |
test
的所有权限{ "Statement": [ { "Effect": "Allow", "Action": [ "tos:*" ], "Resource": [ "trn:tos:::test", "trn:tos:::test/*" ] } ] }
test
的只读权限{ "Statement": [ { "Effect": "Allow", "Action": [ "tos:Head*", "tos:List*", "tos:Get*", ], "Resource": [ "trn:tos:::test", "trn:tos:::test/*" ] } ] }
test
内abc
目录及其子目录的所有权限{ "Statement": [ { "Effect": "Allow", "Action": [ "tos:*" ], "Resource": [ "trn:tos:::test/abc", "trn:tos:::test/abc/*" ] } ] }
test
内除了abc
目录以外的所有权限{ "Statement": [ { "Effect": "Allow", "Action": [ "tos:*" ], "Resource": [ "trn:tos:::test", "trn:tos:::test/*" ] }, { "Effect": "Deny", "Action": [ "tos:*" ], "Resource": [ "trn:tos:::test/abc", "trn:tos:::test/abc/*" ] } ] }