使用boto3通过aws Lambda拒绝访问

时间:2015-11-06 14:28:58

标签: amazon-web-services amazon-s3 amazon-iam aws-lambda boto3

我使用由

构成的数据处理管道

S3 + SNS + Lambda

因为S3无法从其存储区域发送通知,所以我利用SNS向其他地区的Lambda发送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

当我运行保存和测试时,我收到以下错误

    {
  "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.)

似乎我没有很好地制定政策。

6 个答案:

答案 0 :(得分:13)

我有类似的问题,我通过将适当的政策附加到我的用户来解决它。

IAM - >用户 - >用户名 - >权限 - >附上政策。

另外,请确保添加正确的访问密钥和秘密访问密钥,您可以使用AmazonCLI执行此操作。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

添加到Amri的答案,如果你的存储桶是私有的并且你有访问它的凭据,你可以使用boto3.client:

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'

答案 3 :(得分:3)

Omuthu的答案实际上正确地确定了我的问题,但它没有提供解决方案所以我认为我这样做。

当您在IAM中设置权限时,您可能会做出类似这样的事情:

import { of } from 'rxjs/create';

不幸的是,这不正确。您需要将对象权限应用于存储桶中的对象。所以它必须看起来像这样:

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

注意第二个ARN,最后是{ "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/*" ] } ] }

答案 4 :(得分:1)

我有类似的问题,区别在于存储桶已使用KMS密钥加密。

修复: IAM->加密密钥-> YOUR_AWS_KMS_KEY->您的策略或帐户

答案 5 :(得分:0)

在我的情况下-我正在运行的Lambda具有角色blahblahRole,而这个blahblahRole没有对S3存储桶的许可。