Доступ S3 через EMR без сервера с использованием PySparkPython

Программы на Python
Ответить
Anonymous
 Доступ S3 через EMR без сервера с использованием PySpark

Сообщение Anonymous »

Я пытаюсь получить доступ к корзине S3 в учетной записи B из учетной записи A с помощью Python и PySpark из EMR Studio в бессерверной версии. Я могу получить доступ к данным с помощью Python через роль IAM для нескольких учетных записей, но получаю исключение AccessDeniedException при попытке прочитать их с помощью PySpark, используя тот же кластер. В чем может быть проблема?
Рабочий код Python:

Код: Выделить всё

import boto3
import s3fs
import pandas as pd

role_arn = "arn:aws:iam::accountB:role/access-role"
client = boto3.client('sts', region_name='ap-south-1')
response = client.assume_role(RoleArn=role_arn, RoleSessionName="TEST_SESSION")
credentials = response['Credentials']

boto3_session = boto3.Session(
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'])

# Define the S3 bucket details
bucket_name = 'accountBBucket'  # Replace with your bucket name

s = s3fs.S3FileSystem(anon=False,
key=credentials['AccessKeyId'],
secret=credentials['SecretAccessKey'],
token=credentials['SessionToken'])
pd.read_parquet(
s.open(
s.ls('s3://accountBBucket/20241108.parquet')[0]
)
)
Код PySpark:

Код: Выделить всё

import boto3
from pyspark.sql import SparkSession

# Assume the role
client = boto3.client('sts')
response = client.assume_role(
RoleArn="arn:aws:iam::accountB:role/access-role",
RoleSessionName="SessionName"
)

credentials = response['Credentials']

# Create Spark session
spark = SparkSession.builder \
.appName("S3Access") \
.config("spark.hadoop.fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider") \
.config("spark.hadoop.fs.s3a.access.key", credentials['AccessKeyId']) \
.config("spark.hadoop.fs.s3a.secret.key", credentials['SecretAccessKey']) \
.config("spark.hadoop.fs.s3a.session.token", credentials['SessionToken']) \
.config("spark.hadoop.fs.s3a.endpoint", "https://s3.ap-south-1.amazonaws.com") \
.config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
.getOrCreate()

# Read data from S3
df = spark.read.format('parquet').load("s3a://accountBBucket/20241108.parquet")
df.show()


Подробнее здесь: https://stackoverflow.com/questions/793 ... ng-pyspark
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»