在相同位置重命名 S3 对象以移除 Glue 书签

缺口

我有一个特定的用例,我想以特定的前缀将对象上传到 S3。该前缀处已经存在一个文件,我想用这个新文件替换该文件。我正在使用 boto3 来做同样的事情,但出现以下错误。存储桶版本控制已关闭,因此我希望在这种情况下覆盖文件。但是,我收到以下错误。

{
  "errorMessage": "An error occurred (InvalidRequest) when calling the CopyObject operation: This copy request is illegal because it is trying to copy an object to itself without changing the object's metadata, storage class, website redirect location or encryption attributes.",
  "errorType": "ClientError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 25, in lambda_handler\n    s3.Object(bucket,product_key).copy_from(CopySource=bucket + '/' + product_key)\n",
    "  File \"/var/runtime/boto3/resources/factory.py\", line 520, in do_action\n    response = action(self, *args, **kwargs)\n",
    "  File \"/var/runtime/boto3/resources/action.py\", line 83, in __call__\n    response = getattr(parent.meta.client, operation_name)(*args, **params)\n",
    "  File \"/var/runtime/botocore/client.py\", line 386, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
    "  File \"/var/runtime/botocore/client.py\", line 705, in _make_api_call\n    raise error_class(parsed_response, operation_name)\n"
  ]
}

这是我到目前为止所尝试的。

import boto3
import tempfile
import os
import tempfile


print('Loading function')
s3 = boto3.resource('s3')
glue = boto3.client('glue')

bucket='my-bucket'
bucket_prefix='my-prefix'

def lambda_handler(_event, _context):
    
    my_bucket = s3.Bucket(bucket)
    # Code to find the object name. There is going to be only one file. 
    for object_summary in my_bucket.objects.filter(Prefix=bucket_prefix):
        product_key= object_summary.key
        print(product_key)
    
    #Using product_key variable I am trying to copy the same file name to the same location, which is when I get an error.
    s3.Object(bucket,product_key).copy_from(CopySource=bucket + '/' + product_key)
    # Maybe the following line is not required
    s3.Object(bucket,bucket_prefix).delete()

我有一个非常具体的原因在同一位置复制同一个文件。AWS GLue 将其添加为书签后不会选择相同的文件。我再次复制文件我希望 Glue 书签将被删除,并且 Glue 作业会将其视为一个新文件。

我并不太关注这个名字。如果你能帮我修改上面的代码以生成一个同样有效的前缀级别的新文件。但是这里总是必须有一个文件。将此文件视为已从关系数据库购买到 S3 的产品的静态列表。

谢谢

约翰·罗滕斯坦

使用作业书签跟踪已处理数据 - AWS Glue

对于 Amazon S3 输入源,AWS Glue 作业书签会检查对象的上次修改时间,以验证哪些对象需要重新处理。如果您的输入源数据自上次运行作业以来已被修改,则在您再次运行作业时会重新处理这些文件。

所以,看来你的理论可行!

但是,正如错误消息所述,“在不更改对象的元数据、存储类别、网站重定向位置或加密属性的情况下”,不允许将 S3 对象复制到自身。

因此,您可以添加一些元数据作为复制过程的一部分,它会成功。例如:

    s3.Object(bucket,product_key).copy_from(CopySource=bucket + '/' + product_key, Metadata={'foo': 'bar'})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

AWS Glue 抓取动态 S3 路径位置

AWS Glue:为什么当我编辑脚本时,它还会在 S3 存储桶中创建一个“my_script.temp”对象?移除是否安全?

Mercurial:重命名书签

启用 KMS 加密后,无法使用 Glue 作业将数据/对象放入 S3 存储桶

Boto3 / S3:使用copy_object重命名对象

如何倒带Glue Spark ETL作业上的作业书签?

重命名Word 2010中的书签

通过aws-sdk模块重命名s3对象的node.js

Unity3D:根据当前位置生成对象-放在相同位置的画布上

如何使用Glue读取多个S3存储桶?

使用Glue从AWS RDS到S3的管道

使用Glue将数据从RDS移至S3

添加并命名书签jprofiler

在相同位置输出具有相同值的对象

从 S3 解压缩文件并将其写回 S3 的 AWS Glue 作业

在书签中执行jQuery而不返回对象

pyWriteDynamicFrame:无法识别的方案 null;预期的 s3、s3n 或 s3a [Glue to Redshift]

as3检查是否从舞台上移除了对象

如何移除放置在 AR 屏幕上的 3d 对象

通过 Athena 和/或 Glue 将 S3 数据 ETLing 到 CSV

如何使用 Apache Kafka、Amazon Glue 和 Amazon S3 创建数据湖?

适用于Mongo的AWS Glue S3中的Parquet文件

AWS Glue 數據從 S3 轉移到 Redshift

AWS Glue 增量爬取 S3 上不断到达的数据

存储在S3中的AWS Glue Crawlers和大型表

使用 AWS Glue 從 S3 讀取動態 DataTpes

AWS Glue-如何从S3抓取Kinesis Firehose输出文件夹

在AWS Glue作业中写入S3时是否可以指定SSE:KMS密钥ID?

AWS Glue S3目标-创建20个文件的分区