在JupyterHub中,安装在具有IAM角色的EC2实例中,当我尝试使用以下代码访问该存储桶中的文件时,该角色允许访问特定的S3存储桶:
s3nRdd = spark.sparkContext.textFile("s3n://bucket/file")
我收到此错误:
IllegalArgumentException:u' AWS Access密钥ID和秘密访问密钥 必须指定为s3n的用户名或密码(分别) URL,或通过设置fs.s3n.awsAccessKeyId或 fs.s3n.awsSecretAccessKey属性(分别)。'
但是,当我在具有与该角色相同的策略的内核配置中导出AWS访问密钥ID和秘密访问密钥时,该文件的读取成功。
最佳做法是使用IAM角色,为什么EC2角色在这种情况下不起作用?
- update-- EC2 IAM角色具有以下两个策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1488892557621",
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::<bucket_name>",
"arn:aws:s3:::<bucket_name>/*"
]
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "ec2:*",
"Effect": "Allow",
"Resource": "*"
},
{
"Sid": "Stmt1480684159000",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"*"
]
}
]
}
另外,我使用的是hadoop版本2.4.0,它不支持s3a
协议,并且不能进行更新。
答案 0 :(得分:2)
您必须创建存储桶策略以允许从特定IAM角色进行访问。由于S3不信任角色,因此API只会后退并要求访问密钥。
只需在您的存储分区政策中添加这样的内容,替换所有自定义&lt;&gt;参数与您自己的值。
{
"Version": "2012-10-17",
"Id": "EC2IAMaccesss",
"Statement": [{
"Sid": "MyAppIAMRolesAccess",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::<acc_id>:role/<yourIAMroleName>"
]
},
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<yourbucket>/*",
"arn:aws:s3:::<yourbucket>"
]
}
]
}
(更新)
确保为EC2 IAM角色提供适当的策略,因为IAM角色非常强大,没有开箱即用的策略。您必须分配一个政策,例如要获得最小的S3访问权限,请将AWSS3ReadOnly策略添加到角色中。
您可能会遇到spark problematic interaction with IAM roles的问题。请通过s3n://
架构查看有关spark访问的文档。否则,请使用s3a://
答案 1 :(得分:2)
S3n不支持IAM角色,无论如何2.4是一个非常过时的版本。当涉及到s3n时,并不像2.5那样有问题,但仍然不够完美。
如果你想使用IAM角色,你将不得不切换到S3a,是的,对你而言,这意味着升级Hadoop。遗憾。