En JupyterHub, instalado en una instancia EC2 con un rol de IAM que permite el acceso a un depósito S3 específico cuando intento acceder a un archivo en ese depósito con este código:
s3nRdd = spark.sparkContext.textFile("s3n://bucket/file")me sale este error:
IllegalArgumentException: u'AWS Access Key ID y Secret Access Key deben especificarse como nombre de usuario o contraseña (respectivamente) de una URL s3n, o configurando las propiedades fs.s3n.awsAccessKeyId o fs.s3n.awsSecretAccessKey (respectivamente).'
Sin embargo, cuando exporto la identificación de la clave de acceso de AWS y la clave de acceso secreta en la configuración del kernel que tiene la misma política que ese rol, la lectura de ese archivo se realiza correctamente.
Dado que la mejor práctica es utilizar roles de IAM, ¿por qué el rol de EC2 no funciona en esta situación?
--update-- El rol EC2 IAM tiene estas 2 políticas:
{ "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": [ "*" ] } ] } Además, estoy usando la versión 2.4.0 de Hadoop, que no es compatible con el protocolo s3a y la actualización no es una opción.
Debe crear una política de depósito para permitir el acceso desde determinados roles de IAM. Dado que S3 no confía en los roles, la API simplemente retrocede y solicita la clave de acceso.
Simplemente agregue algo como esto en su política de depósito, reemplace todos los parámetros <> personalizados con sus propios valores.
{ "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>" ] } ] }(actualizaciones)
Asegúrese de proporcionar la política adecuada a los roles de IAM de EC2, ya que los roles de IAM son muy potentes, no se adjunta ninguna política de fábrica. Debe asignar una política, por ejemplo, para un acceso mínimo a S3, agregue la política AWSS3ReadOnly a los roles.
Es posible que encuentre problemas de interacción problemática de chispa con roles de IAM . Consulte la documentación sobre el acceso a Spark a través del esquema s3n:// . De lo contrario, utilice s3a://
S3n no es compatible con los roles de IAM y, de todos modos, la 2.4 es una versión muy desactualizada. No tiene tantos errores como 2.5 cuando se trata de s3n, pero sigue siendo menos que perfecto.
Si desea utilizar roles de IAM, tendrá que cambiar a S3a, y sí, para usted, eso significa actualizar Hadoop. perdón.