在JupyterHub中,安装在具有IAM角色的EC2实例中,当我尝试使用以下代码访问该桶中的文件时,该角色允许访问特定的S3桶:
s3nRdd = spark.sparkContext.textFile("s3n://bucket/file")
我知道这个错误:
IllegalArgumentException: U‘’AWS访问密钥ID和秘密访问密钥必须指定为s3n URL的用户名或密码,或者通过设置fs.s3n.awsAccessKeyId或fs.s3n.awsSecretAccessKey属性(分别)。
但是,当我在具有与该角色相同的策略的内核配置中导出AWS访问密钥id和秘密访问密钥时,该文件的读取将成功。
由于最佳实践是使用IAM角色,为什么EC2角色在这种情况下不能工作?
-更新
{
"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": [
"*"
]
}
]
}
另外,我使用的是Hadoop2.4.0版本,它不支持s3a
协议,更新也不是一种选择。
发布于 2017-03-13 03:46:12
S3n不支持IAM角色,而且2.4是一个非常过时的版本。当涉及到s3n时,比2.5更少,但仍然不够完美。
如果您想使用IAM角色,您将不得不切换到S3a,对您来说,这确实意味着升级Hadoop。抱歉的。
发布于 2017-03-09 05:04:09
您必须创建一个桶策略,以允许来自特定IAM角色的访问。因为S3不信任角色,所以API只会后退,请求访问密钥。
只需在桶策略中添加如下内容,将所有自定义<>参数替换为您自己的值。
{
"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>"
]
}
]
}
(更新)
s3n://
模式检查有关火花访问的文档。否则,使用s3a://
https://stackoverflow.com/questions/42684034
复制相似问题