Anonymous
Доступ S3 через EMR без сервера с использованием PySpark
Сообщение
Anonymous » 13 янв 2025, 14:40
Я пытаюсь получить доступ к корзине 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
1736768417
Anonymous
Я пытаюсь получить доступ к корзине S3 в учетной записи B из учетной записи A с помощью Python и PySpark из EMR Studio в бессерверной версии. Я могу получить доступ к данным с помощью Python через роль IAM для нескольких учетных записей, но получаю исключение AccessDeniedException при попытке прочитать их с помощью PySpark, используя тот же кластер. В чем может быть проблема? [b]Рабочий код Python:[/b] [code]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] ) ) [/code] [b]Код PySpark:[/b] [code]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() [/code] Подробнее здесь: [url]https://stackoverflow.com/questions/79352062/s3-access-via-emr-serverless-using-pyspark[/url]