Amazon web services 无法为AWS中的Lambda函数设置S3触发器
我一直在互联网上寻找解决方案。我一直在尝试设置一个AWS Lambda函数,以便在每次将文件上传到特定的S3存储桶时向SNS发送消息。此时,我已经完成了函数设置,并且可以成功地调用它。但是,当我尝试将函数连接到S3时,我收到一个错误,说明调用PutBucketNotification操作时发生错误(InvalidArgument):无法验证以下目标配置。根据,我应该能够添加允许S3调用Lambda函数的权限,如下所示:Amazon web services 无法为AWS中的Lambda函数设置S3触发器,amazon-web-services,amazon-s3,aws-lambda,Amazon Web Services,Amazon S3,Aws Lambda,我一直在互联网上寻找解决方案。我一直在尝试设置一个AWS Lambda函数,以便在每次将文件上传到特定的S3存储桶时向SNS发送消息。此时,我已经完成了函数设置,并且可以成功地调用它。但是,当我尝试将函数连接到S3时,我收到一个错误,说明调用PutBucketNotification操作时发生错误(InvalidArgument):无法验证以下目标配置。根据,我应该能够添加允许S3调用Lambda函数的权限,如下所示: aws lambda add-permission \ --func
aws lambda add-permission \
--function-name my-file-upload \
--principal s3.amazonaws.com \
--statement-id AcceptFromImport \
--action "lambda:InvokeFunction" \
--source-arn arn:aws:s3:::file-import \
--source-account my_account_id
我这样做了,并注意到与Lambda函数相关联的策略已更新,似乎是正确的。但是,错误仍然存在。我看过一个类似的问题,但这里没有一个解决方案有效
执行角色ARN:ARN:aws:iam::我的账户\u id:Role/lambda上传流
执行角色(lambda上载流)信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
执行角色策略(我的文件上载):
Lambda函数ARN:ARN:aws:Lambda:ap-northeast-1:my_账户\u id:function:my文件上传
Lambda函数角色文档
{
"roleName": "lambda-upload-stream",
"policies": [
{
"name": "my-file-upload",
"id": "AWS_ACCESS_KEY_ID",
"type": "managed",
"arn": "arn:aws:iam::my_account_id:policy/my-file-upload",
"document": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AccessObject",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::file-import/*"
},
{
"Sid": "SendUpdate",
"Effect": "Allow",
"Action": "sns:Publish",
"Resource": "arn:aws:sns:ap-northeast-1:my_account_id:comm-in"
}
]
}
}
],
"resources": {
"s3": {
"service": {
"name": "Amazon S3",
"icon": "data:image/svg+xml;base64,very_long_base64_string1"
},
"statements": [
{
"resource": "arn:aws:s3:::file-import/*",
"service": "s3",
"effect": "Allow",
"action": "s3:GetObject",
"source": {
"index": "AccessObject",
"policyName": "my-file-upload",
"policyType": "managed"
}
}
]
},
"sns": {
"service": {
"name": "Amazon SNS",
"icon": "data:image/svg+xml;base64,very_long_base64_string2"
},
"statements": [
{
"resource": "arn:aws:sns:ap-northeast-1:my_account_id:comm-in",
"service": "sns",
"effect": "Allow",
"action": "sns:Publish",
"source": {
"index": "SendUpdate",
"policyName": "my-file-upload",
"policyType": "managed"
}
}
]
}
},
"trustedEntities": [
"lambda.amazonaws.com"
]
}
Lambda函数资源策略:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:ap-northeast-1:my_account_id:function:my-file-upload",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "my_account_id"
},
"ArnLike": {
"AWS:SourceArn": "arn:aws:s3:::file-import"
}
}
}
]
}
我的问题是:我在这里做错了什么?我如何修复它?您需要创建的东西被称为“基于资源的策略”,是由aws lambda add permission创建的 基于资源的策略授予S3调用lambda的权限。这是lambda本身的属性,不属于lambda的IAM角色(lambda的IAM角色控制lambda可以做什么,基于资源的策略控制谁可以对lambda做什么。您可以在aws控制台的UI中查看此资源,方法是转到lambda,单击“权限”并向下滚动到“基于资源的策略”。您要注意的关键字是
lambda:InvokeFunction
,它允许其他事物调用您的lambda,包括其他AWS帐户和您帐户上的其他AWS服务(如s3)
也就是说,您运行的命令应该已经创建了此策略。您是否确保在运行该命令时用您的实际帐户id替换my\u account\u id
此外,请确保将
--source arn arn:aws:s3:::file import
替换为bucket的实际arn(我假设您必须使用不同的名称创建一个bucket,因为s3 bucket必须具有全局唯一的名称,file import
几乎肯定已经使用了)我发现了问题所在。我最初的命令是:
aws s3api put-bucket-notification --bucket azure-erp-import \
--notification-configuration "CloudFunctionConfiguration={Id=file-uploaded,Events=[],Event=s3:ObjectCreated:*,CloudFunction=arn:aws:lambda:ap-northeast-1:my_account_id:function:my-file-upload,InvocationRole=arn:aws:iam::my_account_id:role/lambda-upload-stream}"
此操作失败,因为
arn:aws:iam::my_account\u id:role/lambda upload stream
角色无权调用lambda函数上的lambda:invokeffunction
。删除此值修复了错误。为什么有三个角色?这三个角色用于三个不同的函数?什么是“角色文档”"?它来自何处?它的IAM角色或策略无效。@在AWS控制台上查找Lambda函数时,我得到的是角色文档中的Marcin,转到权限并单击角色文档
啊,对不起,我忘了将其包含在问题中。它确实存在。至于您的其他部分,是的,我使用我的帐户ID a运行了添加权限S3 bucket的实际ARN。嗯,这很奇怪,我觉得文档看起来很好。我认为当您从自己的帐户使用S3 bucket时,“account equals”条件可能是不必要的。我想下一步将是再次检查您是否无意中在我的某个地方为您的bucket/function/account id留下了占位符字符串n因为我在资源策略中省略了lambda ARN中可能的版本或别名,所以您会对这些命令产生反感吗?
aws s3api put-bucket-notification --bucket azure-erp-import \
--notification-configuration "CloudFunctionConfiguration={Id=file-uploaded,Events=[],Event=s3:ObjectCreated:*,CloudFunction=arn:aws:lambda:ap-northeast-1:my_account_id:function:my-file-upload,InvocationRole=arn:aws:iam::my_account_id:role/lambda-upload-stream}"