AWS Lambda返回拒绝尝试从S3存储桶访问GetObject的权限

时间:2019-02-14 12:22:12

标签: python amazon-web-services amazon-s3 aws-lambda

我确实创建了一个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

1 个答案:

答案 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。确定该程序是使用您的代码还是使用许可,这应该是一个很好的测试。