AWS Lambda 中的 list_objects 方法不能直接用于跨账户操作。为了解决这个问题,可以使用 AWS 的对象复制功能。假设您需要从账户A读取账户B的存储桶中的对象列表,您可以在账户B中创建一个可在账户A访问的对象复制规则。然后,每当对象被加入账户B的存储桶时,会自动被复制到指定的位置。接着,通过AWS SDK中提供的 list_objects 方法,访问指定位置上的对象列表即可。下面是一个基于Python的代码示例:
import boto3
def lambda_handler(event, context):
source_bucket = 'source-bucket-name'
destination_bucket = 'destination-bucket-name'
# 创建对象复制规则使得存储桶在两个账户之间自动同步
s3 = boto3.resource('s3')
replication_config = {
"Role": "arn:aws:iam::123456789012:role/ReplicationRole",
"Rules": [
{
"Status": "Enabled",
"Priority": 1,
"Destination": {
"Bucket": "arn:aws:s3:::{0}".format(destination_bucket),
},
"SourceSelectionCriteria": {
"SseKmsEncryptedObjects": {
"Status": "Enabled"
}
}
}
]
}
bucket = s3.Bucket(source_bucket)
replication = bucket.Notification().create(
TopicConfigurations=[
{
'Id': 'replication',
'TopicArn': 'arn:aws:sns:us-east-1:123456789012:ReplicationTopic',
'Events': ['s3:ObjectCreated:*']
}
],
QueueConfigurations=[
],
LambdaFunctionConfigurations=[
],
ReplicationConfiguration=replication_config
)
# 使用list_objects方法,读取同步后的目标存储桶中的对象
s3_client = boto3.client('s3')
objects = []
truncated = True
while truncated:
response = s3_client.list_objects(Bucket=destination_bucket)
contents = response.get('Contents')
if not contents:
break
objects.extend(contents)
truncated = response.get('IsTruncated')
if truncated:
marker = response.get('NextMarker')
response = s3_client.list_objects(Bucket=destination_bucket, Marker=marker)
return objects