EC2 中的 AWS IAM 角色以及从 JupyterHub 访问 S3
AWS IAM Role in EC2 and access to S3 from JupyterHub
在 JupyterHub 中,安装在具有 IAM 角色的 EC2 实例中,当我尝试使用此代码访问特定 S3 存储桶中的文件时,该角色允许访问该存储桶中的文件:
s3nRdd = spark.sparkContext.textFile("s3n://bucket/file")
我收到这个错误:
IllegalArgumentException: u'AWS Access Key ID and Secret Access Key
must be specified as the username or password (respectively) of a s3n
URL, or by setting the fs.s3n.awsAccessKeyId or
fs.s3n.awsSecretAccessKey properties (respectively).'
但是,当我在与该角色具有相同策略的内核配置中导出 AWS 访问密钥 ID 和秘密访问密钥时,该文件的读取成功。
由于最佳实践是使用 IAM 角色,为什么 EC2 角色在这种情况下不起作用?
--更新--
EC2 IAM 角色具有以下 2 个策略:
{
"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": [
"*"
]
}
]
}
此外,我正在使用不支持 s3a
协议的 hadoop 版本 2.4.0,无法更新。
您必须创建存储桶策略以允许来自特定 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>"
]
}
]
}
(更新)
确保为 EC2 IAM 角色提供适当的策略,因为 IAM 角色非常强大,开箱即用没有附加策略。您必须分配政策,例如对于最小的 S3 访问,将 AWSS3ReadOnly 策略添加到角色。
您可能会遇到 spark problematic interaction with IAM roles 的问题。请查看有关通过 s3n://
模式访问 spark 的文档。否则,使用 s3a://
S3n 不支持 IAM 角色,而且 2.4 无论如何都是一个非常过时的版本。在 s3n 方面不像 2.5 那样有问题,但仍然不够完美。
如果您想使用 IAM 角色,您将不得不切换到 S3a,是的,对您来说,这确实意味着升级 Hadoop。对不起。
在 JupyterHub 中,安装在具有 IAM 角色的 EC2 实例中,当我尝试使用此代码访问特定 S3 存储桶中的文件时,该角色允许访问该存储桶中的文件:
s3nRdd = spark.sparkContext.textFile("s3n://bucket/file")
我收到这个错误:
IllegalArgumentException: u'AWS Access Key ID and Secret Access Key must be specified as the username or password (respectively) of a s3n URL, or by setting the fs.s3n.awsAccessKeyId or fs.s3n.awsSecretAccessKey properties (respectively).'
但是,当我在与该角色具有相同策略的内核配置中导出 AWS 访问密钥 ID 和秘密访问密钥时,该文件的读取成功。
由于最佳实践是使用 IAM 角色,为什么 EC2 角色在这种情况下不起作用?
--更新-- EC2 IAM 角色具有以下 2 个策略:
{
"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": [
"*"
]
}
]
}
此外,我正在使用不支持 s3a
协议的 hadoop 版本 2.4.0,无法更新。
您必须创建存储桶策略以允许来自特定 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>"
]
}
]
}
(更新)
确保为 EC2 IAM 角色提供适当的策略,因为 IAM 角色非常强大,开箱即用没有附加策略。您必须分配政策,例如对于最小的 S3 访问,将 AWSS3ReadOnly 策略添加到角色。
您可能会遇到 spark problematic interaction with IAM roles 的问题。请查看有关通过
s3n://
模式访问 spark 的文档。否则,使用s3a://
S3n 不支持 IAM 角色,而且 2.4 无论如何都是一个非常过时的版本。在 s3n 方面不像 2.5 那样有问题,但仍然不够完美。
如果您想使用 IAM 角色,您将不得不切换到 S3a,是的,对您来说,这确实意味着升级 Hadoop。对不起。