3

在 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 角色在这种情况下不起作用?

--update-- 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": [
                "*"
            ]
        }
    ]
}

另外,我使用的 hadoop 版本 2.4.0 不支持s3a协议并且更新不是一个选项。

4

2 回答 2

2

您必须创建存储桶策略以允许来自特定 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>"
            ]
        }
    ]
}

(更新)

  1. 确保为 EC2 IAM 角色提供适当的策略,因为 IAM 角色非常强大,没有开箱即用的策略附加到它。您必须分配一个策略,例如对于最小 S3 访问,将 AWSS3ReadOnly 策略添加到角色。

  2. 您可能会遇到与 IAM 角色交互时出现问题的问题。s3n://请查看有关通过模式访问火花的文档。否则,使用s3a://

于 2017-03-09T13:04:09.887 回答
2

S3n 不支持 IAM 角色,而且 2.4 无论如何都是一个非常过时的版本。就 s3n 而言,它不像 2.5 那样有缺陷,但仍然不够完美。

如果您想使用 IAM 角色,您将不得不切换到 S3a,是的,对您而言,这确实意味着升级 Hadoop。对不起。

于 2017-03-13T11:46:12.713 回答