我确实创建了一个lambda函数,该函数应该在S3存储桶中上传文件时将数据上传到DynamoDB中。但是,当在存储桶中上传文件时,我在CloudWatch中得到了“ GetObject操作:权限被拒绝”。 lambda函数具有一个带有以下策略的IAM角色:AmazonlambdaFullAccess,AmazonS3FullAccess,AmazonCloudWatchLogsFullAccess,AmazonDynamoDBFullAccess。它具有lambda.amazonaws.com作为受信任实体。 该存储桶未附加任何政策。
Dataset<Row> filtered = null;
filtered = ds1.select(ds1.col("id"),ds1.col("lastmodified"))
.withColumn("lastModif_mapped", functions.unix_timestamp(ds1.col("lastmodified"), "yyyy-MM-dd HH:mm:ss.SSS").cast("timestamp")).alias("lastModif_mapped");
在Cloudwatch中:调用GetObject操作时发生错误(AccessDenied):访问被拒绝。 我经历过aws的“政策模拟器”。这个IAM角色应该能够从任何S3存储桶中获取GetObject。 谢谢您的帮助。
代码大多来自GitHub。
答案 0 :(得分:1)
这是一个AWS Lambda函数,它将打印文件内容:
import boto3
import os
def lambda_handler(event, context):
s3_client = boto3.client('s3')
# For each record
for record in event['Records']:
# Get Bucket and Key
bucket = record['s3']['bucket']['name']
key = record['s3']['object']['key']
# Print the bucket & key to the logs
print(bucket, key)
# Download object
local_filename = '/tmp/' + key
s3_client.download_file(bucket, key, local_filename)
# Print contents to log (just to demonstrate concept)
for line in open(local_filename):
print(line)
# Delete file when done, to clear space for future execution
os.remove(local_filename)
在存储桶上创建一个Amazon S3事件以触发此Lambda函数,它将把文件名和文件内容打印到CloudWatch Logs。确定该程序是使用您的代码还是使用许可,这应该是一个很好的测试。