我使用由
构成的数据处理管道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.)
似乎我没有很好地制定政策。
答案 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)
当您在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存储桶的许可。