Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 通过aws Lambda使用boto3拒绝访问_Amazon Web Services_Amazon S3_Amazon Iam_Aws Lambda_Boto3 - Fatal编程技术网

Amazon web services 通过aws Lambda使用boto3拒绝访问

Amazon web services 通过aws Lambda使用boto3拒绝访问,amazon-web-services,amazon-s3,amazon-iam,aws-lambda,boto3,Amazon Web Services,Amazon S3,Amazon Iam,Aws Lambda,Boto3,我使用由 S3+SNS+Lambda 因为S3不能将通知发送到其存储区域之外,所以我使用SNS将S3通知发送到其他区域的Lambda 用 from __future__ import print_function import boto3 def lambda_handler (event, context): input_file_bucket = event["Records"][0]["s3"]["bucket"]["name"] input_file_key = ev

我使用由

S3+SNS+Lambda

因为S3不能将通知发送到其存储区域之外,所以我使用SNS将S3通知发送到其他区域的Lambda

from __future__ import print_function
import boto3


def lambda_handler (event, context):
    input_file_bucket = event["Records"][0]["s3"]["bucket"]["name"]
    input_file_key = event["Records"][0]["s3"]["object"]["key"]

    input_file_name = input_file_bucket+"/"+input_file_key

    s3=boto3.resource("s3")
    obj = s3.Object(bucket_name=input_file_bucket, key=input_file_key)
    response = obj.get()

    return event #echo first key valuesdf
当我运行save和test时,我得到了以下错误

    {
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      20,
      "lambda_handler",
      "response = obj.get()"
    ],
    [
      "/var/runtime/boto3/resources/factory.py",
      394,
      "do_action",
      "response = action(self, *args, **kwargs)"
    ],
    [
      "/var/runtime/boto3/resources/action.py",
      77,
      "__call__",
      "response = getattr(parent.meta.client, operation_name)(**params)"
    ],
    [
      "/var/runtime/botocore/client.py",
      310,
      "_api_call",
      "return self._make_api_call(operation_name, kwargs)"
    ],
    [
      "/var/runtime/botocore/client.py",
      395,
      "_make_api_call",
      "raise ClientError(parsed_response, operation_name)"
    ]
  ],
  "errorType": "ClientError",
  "errorMessage": "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied"
}
我将lambda角色配置为

full S3 access
在我的目标桶上设置桶策略

everyone can do anything(list, delete, etc.)

似乎我没有很好地设置策略。

您正在寻找的特定S3对象可能具有有限的权限

  • S3对象级别的读取权限被拒绝
  • 附加到lambda的角色没有获取/读取S3对象的权限
  • 如果使用S3 bucket策略授予访问权限,请验证是否提供了读取权限

  • 我有一个类似的问题,我通过给我的用户附加适当的策略来解决它

    IAM->用户->用户名->权限->附加策略


    另外,请确保您添加了正确的访问密钥和机密访问密钥,您可以使用AmazonCLI进行添加。

    添加到Amri的答案中,如果您的存储桶是私有的,并且您有访问它的凭据,您可以使用boto3。客户端:

    import boto3
    s3 = boto3.client('s3',aws_access_key_id='ACCESS_KEY',aws_secret_access_key='SECRET_KEY')
    response = s3.get_object(Bucket='BUCKET', Key='KEY')
    
    *对于这个文件:s3://bucket/a/b/c/some.text,bucket是“bucket”,Key是“a/b/c/some.text”

    ---编辑---


    例如,您可以轻松地更改脚本以接受键作为环境变量,这样它们就不会硬编码。为了简单起见,我把它放在这里

    Omuthu的回答实际上正确地识别了我的问题,但它没有提供解决方案,所以我想我应该这样做

    在IAM中设置权限时,您可能会做出如下操作:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:DeleteObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::test"
                ]
            }
        ]
    }
    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::test"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:DeleteObject"
                ],
                "Resource": [
                    "arn:aws:s3:::test/*"
                ]
            }
        ]
    }
    
    不幸的是,这是不对的。您需要将对象权限应用于bucket中的对象。所以它必须是这样的:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:DeleteObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::test"
                ]
            }
        ]
    }
    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::test"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:DeleteObject"
                ],
                "Resource": [
                    "arn:aws:s3:::test/*"
                ]
            }
        ]
    }
    

    请注意,第二个ARN末尾带有
    /*

    我也有类似的问题,不同之处在于存储桶是用KMS密钥加密的

    固定为:
    IAM->Encryption keys->YOUR_AWS_KMS_KEY->到您的策略或帐户

    在我的情况下-我正在运行的Lambda有一个角色
    blahblahRole
    ,而这个
    blahblahRole
    没有对S3 bucket的权限

    这是相当模糊的。你能指出如何解决这个问题吗?有两种可能。S3对象级别的读取权限被拒绝2。附加到lambda的角色没有获取/读取S3对象的权限。我帮助将
    S3:GetObject
    添加到策略中。我必须编写一个bucket策略来授予访问权限。我不得不在bucket策略中添加:`{“Version”:“2012-10-17”,“Statement”:[{“Sid”:“Allow All”,“Effect”:“Allow”,“Principal”:{“AWS”:[“arn:AWS:iam:::user/”]},“Action”:[“s3:GetObject”,“s3:PutObject”,“s3:PutObjectAcl”],“Resource”:“arn:aws:s3::::/*”}}`还值得指出的是,aws s3返回不存在的对象的访问被拒绝,以便不显示对象是否存在……这在Lambda函数中是个坏主意。没有理由硬编码键。@tedder42有时是有道理的。假设您需要在具有不同权限的存储桶之间进行复制。嘿,我在哪里可以看到这些设置?我在任何地方都找不到它…s3:ListBucket是创建bucketI所必需的。我有s3*权限,但仍然得到了错误。