AWS预设计条件下Neo4j荷载CSV

2024-06-16 11:37:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在AWS Linux服务器上使用python脚本,并在笔记本电脑上开发了一组并行代码。我们有一个S3 bucket来存放CSV文件,然后使用其LOAD CSV方法将这些文件上载到Neo4j。这样做需要获得一个预签名URL,允许对S3 CVS文件进行读取访问

当从我的笔记本电脑上运行代码时,这种方法效果很好。我还可以使用预签名URL从浏览器打开CSV。但是,当我从AWS服务器运行python代码(相同的访问和机密访问值)时,该过程失败。错误是无法加载CSV。将预签名URL放入浏览器时,错误是签名不匹配

为什么会这样?在AWS服务器上运行时,对身份验证似乎有不同的要求

下面是一些代码。CSV预先定位在S3存储桶中。首先,使用URL占位符@进行Cypher加载CSV查询,该占位符将被预签名URL替换:

 CQ = "LOAD CSV WITH HEADERS FROM '@@' AS line FIELDTERMINATOR '|' create(k:Kit{KitName:toString(line.Kit),fullname:toString(line.fullname),email:toString(line.email)}) return k"
CQ=Neo4jLib.PreSignAdd(CQ,"kits.csv")
Neo4jLib.CypherBoltQuery(CQ,"none")  

接下来是预签名代码。pythons3.generate_presigned_url不接受区域,因此解决方法是将其放入url;这是通过笔记本电脑实现的

    def PreSignAdd(Q,FN):
   s3 = boto3.client('s3', aws_access_key_id=AWS.AWSAccessKey,aws_secret_access_key=AWS.AWSSecretKey)
   response = s3.generate_presigned_url('get_object', Params={'Bucket': AWS.AWSBucketName,'Key':"import/" + FN},ExpiresIn=3600)  #10 min
   response=response.replace("s3.amazonaws","s3.us-west-2.amazonaws")
   Q =Q.replace("@@",response)
   return Q    

很可能有一个简单的解决办法,但我想不通


Tags: 文件csv方法代码服务器awsurls3