首页 文章

EC1中的AWS IAM角色以及从JupyterHub访问S3

提问于
浏览
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角色有以下两个策略:

{
    "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 协议,更新不是一个选项 .

2 回答

  • 2

    S3n不支持IAM角色,无论如何2.4都是一个非常过时的版本 . 当谈到s3n时,并不像2.5那样有缺陷,但仍然不够完美 .

    如果你想使用IAM角色,你将不得不切换到S3a,是的,对你而言,这意味着升级Hadoop . 抱歉 .

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

    (更新)

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

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

相关问题