我正在AWS Linux服务器上使用python脚本,并在笔记本电脑上开发了一组并行的代码。我们有一个S3存储桶来存储CSV文件,然后使用其LOAD CSV方法将其上传到Neo4j,为此需要获得一个预签名URL以允许对S3 CVS文件的读取访问。
从笔记本电脑运行代码时,此方法效果很好。我还可以使用前缀URL从浏览器中打开CSV。但是,当我从AWS服务器运行python代码(相同的访问权限和秘密的访问值)时,该过程失败。错误是无法加载CSV。当我将预签名URL放入浏览器时,错误是签名不匹配。
为什么会这样?在AWS服务器上运行时,似乎对身份验证有不同的要求?
这是一些代码。 CSV已预先放置在S3存储桶中。首先使用URL占位符@@的Cypher LOAD 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")
下一个,前签代码。 Python s3.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
可能有一个简单的解决方法,但这使我难以理解。