我正在为本地开发创建胶水,遵循提到的here概念。我使用localstack
沿着glue spark using Jupyter lab
。正如您在屏幕下方看到的那样,从我的spark jupyter实验室,我可以连接到localstack s3,它的bucket和contents。docker run -it -v ${PWD}/local_path_to_workspace/:/home/glue_user/workspace/jupyter_workspace/ -e AWS_ACCESS_KEY_ID=dummyaccess -e AWS_SECRET_ACCESS_KEY=dummysecret -e AWS_REGION=eu-west-1 -e DISABLE_SSL=true -e ENDPOINT_URL="http://localstack-glue:4566" --rm -p 4040:4040 -p 18080:18080 -p 8998:8998 -p 8888:8888 --name glue_jupyter_lab amazon/aws-glue-libs:glue_libs_3.0.0_image_01 /home/glue_user/jupyter/jupyter_start.sh
启动jupyter实验室。
但是,如果我使用以下命令访问jupyter lab中localstack s3 bucket:
from pyspark import SparkContext
from awsglue.context import GlueContext
glueContext = GlueContext(SparkContext.getOrCreate())
inputDF = glueContext.create_dynamic_frame_from_options(connection_type = "s3", connection_options = {"paths": ["s3://glue-localstack-bucket-person/persons.json"]}, format = "json")
我收到拒绝访问错误。
An error occurred while calling o73.getDynamicFrame.
: java.nio.file.AccessDeniedException: s3://glue-localstack-bucket-person/persons.json: getFileStatus on s3://glue-localstack-bucket-person/persons.json: com.amazonaws.services.s3.model.AmazonS3Exception: Forbidden (Service: Amazon S3; Status Code: 403; Error Code: 403 Forbidden; Request ID: WGKYX9DAMXQF1P20; S3 Extended Request ID: Kvpk7Ri77fkrtmzeTCZv+VGoD1dfHUgbXdihVfXxTWlXLIb/vfU+y11jZPiFMGol2F+6sXqGUmw=; Proxy: null), S3 Extended Request ID: Kvpk7Ri77fkrtmzeTCZv+VGoD1dfHUgbXdihVfXxTWlXLIb/vfU+y11jZPiFMGol2F+6sXqGUmw=:403 Forbidden
因此,我的问题是如何更改会话配置,以便使用虚拟访问密钥和密钥引用本地堆栈端点?
1条答案
按热度按时间qxsslcnc1#
这里的突破性时刻是发现
ENDPOINT_URL
环境变量对GlueContext
类内部的机制没有任何影响。也就是说将
ENDPOINT_URL
更改为http://localstack-glue:4566
并不能阻止create_dynamic_frame_from_options
方法尝试访问公共Internet上名为glue-localstack-bucket-person
的存储桶。我相信您看到的403是因为您正在尝试访问真实S3网络上名为glue-localstack-bucket-person
的真实的存储桶-您可能没有访问权限。即使你拥有bucket并且可以访问,你的AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
的虚拟值也会把你锁在外面。需要修改的参数是
fs.s3a.endpoint
,位于hadoop配置的深处。您可以使用类似于此的helper函数为本地Glue设置创建正确的配置:这个函数取代了对
SparkContext.getOrCreate()
的调用。你可以这样使用它:应该可以了
在LinkedIn上的全部功劳归于Raj:https://www.linkedin.com/pulse/development-testing-etl-pipelines-aws-locally-kamal-k/