当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda返回尝试从S3存储桶获取对象时被拒绝的权限

卫昊东
2023-03-14

我确实创建了一个lambda函数,当文件在S3存储桶中上传时,它应该将数据上传到DynamoDB。但是,当文件在存储桶中上传时,我在CloudWatch中得到一个“GetObject操作:权限拒绝”。lambda函数附加了一个IAM角色,并带有这些策略:Amazon onlambdaFullAccess、Amazon onS3FullAccess、Amazon onCloudWatchLogsFullAccess、Amazon onDynamoDBFullAccess。它lambda.amazonaws.com受信任的实体。存储桶没有附加任何策略。

 import boto3
 import json
 import urllib

 dynamodb = boto3.resource('dynamodb')
 table = dynamodb.Table('wireshark')
 s3 = boto3.client('s3')
 tests3 = boto3.resource(u's3')

 def lambda_handler(event, context):

     source_bucket = event['Records'][0]['s3']['bucket']['name']
     key = urllib.parse.quote_plus(event['Records'][0]['s3']['object']['key'])
    copy_source = {'Bucket':source_bucket , 'Key':key}
    print(event)
    print("Log stream name : ", context.log_stream_name)
    print("Log group name : ", context.log_group_name)
    print("Request Id:", context.aws_request_id)
    print("Mem. limit(MB): ", context.memory_limit_in_mb)

    #just print function
    print("Log stream name : ", context.log_stream_name)
    print("Log group name : ", context.log_group_name)
    print("Request Id:", context.aws_request_id)
    print("Mem. limit(MB): ", context.memory_limit_in_mb)

    try:
        print("Using waiter to waiting for object to persist thru s3 service")
        waiter = s3.get_waiter('object_exists')
        waiter.wait(Bucket=source_bucket, Key=key)
        print("Accessing the receied file and reading the same")
        bucket = tests3.Bucket(u'awslambdas3test2')
        obj = bucket.Object(key=key)
        response = obj.get()
        print("response from file object")
        print(response)

在Cloudwatch中:调用GetObject操作时发生错误(AccessDenied):拒绝访问。我已经通过了aws的“政策模拟器”。这个IAM角色应该能够从任何S3 bucket获取对象。谢谢你的帮助。

代码主要来自GitHub。

共有1个答案

夹谷俊远
2023-03-14

下面是一个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日志。这应该是一个很好的测试,可以确定该程序是使用您的代码还是具有权限。

 类似资料:
  • 有没有人遇到过这样的情况:当我对一个用户使用管理策略时,它可以工作,但当我使用内联策略时,它说访问被拒绝。我为IAM用户授予了对bucket读取访问权限,即它只能访问bucket。 我也试过这个

  • 可能是一个重复的问题,但似乎没有一个可用的解决方案有效。可能是 Github 自 2021 年 8 月 13 日起更改了对密码的支持。 我尝试了以下方法: 已检查用户名和密码。 创建了个人访问令牌。 重新检查了 .git/config 文件中的源网址。 错误消息:

  • 我目前在云存储上设置了图像。因为我需要通过Google Cloud Node.js客户端库来访问这些代码,所以上面的代码是我当前的设置。不幸的是,在运行此代码时,我得到以下错误: 如何初始化管理SDK:

  • 有趣的是,当我尝试它下载的sudo版本时,但是终端中不能识别。 我的节点是10.16。我的净现值是6.9。0 这是文件问题还是我的Mac?

  • 我在Lambda函数上收到来自S3 AWS服务的acccess denied错误。 这是代码: 这是CloudWatch上的错误: 这是堆栈错误: 没有关于S3的任何其他描述或信息,桶权限允许每个人、放置、列表和删除。 我可以做什么来访问S3桶? PS:在Lambda事件属性上,主体是正确的,并且具有管理特权。