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>"
            ]
        }
    ]
}

(更新)

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

  2. 您可能会遇到 spark problematic interaction with IAM roles 的问题。请查看有关通过 s3n:// 模式访问 spark 的文档。否则,使用 s3a://

S3n 不支持 IAM 角色,而且 2.4 无论如何都是一个非常过时的版本。在 s3n 方面不像 2.5 那样有问题,但仍然不够完美。

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