Posted in: AWS EMR上搭建HBase环境
AWS EMR 使用Instance Profile 限制 S3 访问权限
AWS EMR 可以指定 EC2 instance profile
来限制 EMR 节点中的程序的权限.
注意: 这里说的是
EC2 instance profile
, 不是EMR role
, 这两个容易混淆. 但可以肯定的是:
- 如果想限制在 EMR 集群中的 EC2 节点上运行的程序的 AWS 相关资源的权限, 应该使用
EC2 instance profile
而今天遇到这样一个需求: 一个 EMR 集群需要仅仅开放对 hive 的 test
数据库的读写权限. 而 test
数据库的数据存储在 s3 上.
按照以往的经验, 直接写了一个 IAM policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws-cn:s3:::test-bucket/hive/test.db/*",
"arn:aws-cn:s3:::test-bucket/hive/test.db"
]
}
]
}
其中 s3://test-bucket/hive/test.db
就是 test
db 在 hive 中的 location. 上线测试, aws cli 访问 s3 一切正常. 但 hive 任务执行类似
CREATE TABLE test.test_table AS SELECT * FROM test.src_table;
就直接报错, 说 s3 访问失败. 到处检查无果, 最后通过报错信息中的 s3 Request ID 看出端倪: API 请求访问的 s3 路径居然是 s3://test-bucket/hive/test.db_$folder$
, 简直泪奔. 居然是 hive 在访问过程中创建了临时路径的缘故.
修改了 IAM policy file, 如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws-cn:s3:::test-bucket/hive/test.db/*",
"arn:aws-cn:s3:::test-bucket/hive/test.db",
"arn:aws-cn:s3:::test-bucket/hive/test.db_$folder$/*",
"arn:aws-cn:s3:::test-bucket/hive/test.db_$folder$"
]
}
]
}
执行 SQL 全部成功, 只不过今后相关的 policy file 都会变成这种乱七八糟的样子.
总结
- 限制 EMR 集群权限是非常必要的. 但由于 EMR 不支持在同一集群中实现不同用户对 s3 的权限控制, 只有通过开启不同的 EMR 集群来实现.
- 账户默认的
EMR_EC2_DefaultRole
权限是针对所有 s3 资源 开启了s3:*
的权限, 非常不建议使用 - AWS IAM 设计的非常好. 可以通过 policy 的组合实现复用.
— EOF —