AWS EMR 可以指定 EC2 instance profile
來限制 EMR 節(jié)點(diǎn)中的程序的權(quán)限.
注意: 這里說的是
EC2 instance profile
, 不是EMR role
, 這兩個容易混淆. 但可以肯定的是:
- 如果想限制在 EMR 集群中的 EC2 節(jié)點(diǎn)上運(yùn)行的程序的 AWS 相關(guān)資源的權(quán)限, 應(yīng)該使用
EC2 instance profile
EC2 instance profile
而今天遇到這樣一個需求: 一個 EMR 集群需要僅僅開放對 hive 的 test
數(shù)據(jù)庫的讀寫權(quán)限. 而 test
數(shù)據(jù)庫的數(shù)據(jù)存儲在 s3 上.
按照以往的經(jīng)驗(yàn), 直接寫了一個 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 任務(wù)執(zhí)行類似
CREATE TABLE test.test_table AS SELECT * FROM test.src_table;
就直接報(bào)錯, 說 s3 訪問失敗. 到處檢查無果, 最后通過報(bào)錯信息中的 s3 Request ID 看出端倪: API 請求訪問的 s3 路徑居然是 s3://test-bucket/hive/test.db_$folder$
, 簡直淚奔. 居然是 hive 在訪問過程中創(chuàng)建了臨時路徑的緣故.
修改了 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$"
]
}
]
}
執(zhí)行 SQL 全部成功, 只不過今后相關(guān)的 policy file 都會變成這種亂七八糟的樣子.
總結(jié)
- 限制 EMR 集群權(quán)限是非常必要的. 但由于 EMR 不支持在同一集群中實(shí)現(xiàn)不同用戶對 s3 的權(quán)限控制, 只有通過開啟不同的 EMR 集群來實(shí)現(xiàn).
- 賬戶默認(rèn)的
EMR_EC2_DefaultRole
權(quán)限是針對所有 s3 資源 開啟了s3:*
的權(quán)限, 非常不建議使用 - AWS IAM 設(shè)計(jì)的非常好. 可以通過 policy 的組合實(shí)現(xiàn)復(fù)用.
-- EOF --