我在网上到处找解决办法。根据本教程,我一直在尝试设置一个AWS Lambda函数,以便在每次将文件上传到特定的S3 bucket时向SNS发送一条消息。此时,我已经设置了函数,并且可以成功地调用它。但是,当我尝试将函数连接到S3时,我得到一个错误,说明调用PutBucketNotification操作时发生错误(InvalidArgument):无法验证以下目标配置
。根据本文,我应该能够添加一个允许S3调用Lambda函数的权限,如下所示:
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::my_account_id:Role/lambda-upload-stream
执行角色(lambda-upload-stream)信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
执行角色策略(my-file-upload):
{
"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"
}
]
}
Lambda函数arn:arn:aws:Lambda:ap-northeast-1:my_account_id:function:my-file-upload
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 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_id:role/lambda-upload-stream
角色没有权限对lambda函数调用lambda:invokefunction
。删除此值修复了错误。
您需要创建的东西称为“基于资源的策略”,它应该由AWS lambda add-permission
创建。
基于资源的策略授予S3调用lambda的权限。这是lambda本身的一个属性,不是lambda的IAM角色的一部分(lambda的IAM角色控制lambda可以做什么,基于资源的策略控制谁可以对lambda做什么。您可以在aws控制台的UI中查看此资源,方法是转到lambda,单击“权限”并向下滚动到“基于资源的策略”。您要注意的关键字是lambda:invokeFunction
,它允许其他东西调用您的lambda,包括其他aws帐户和您帐户上的其他aws服务(如s3)。
话虽如此,您运行的命令应该已经创建了此策略。运行该命令时,是否确保将my_account_id
替换为实际帐户id?
此外,请确保将--source-arn ARN:aws:s3:::file-import
替换为存储桶的实际ARN(我假设您必须创建一个具有不同名称的存储桶,因为s3存储桶必须具有全局唯一的名称,并且file-import
几乎肯定已经使用了)
我正在使用AWS Lambda函数(用python编写)在对象上传到预设S3 bucket时发送电子邮件。该对象通过AWS PHP SDK上传到S3 bucket中,并使用多部分上传。每当我测试我的代码(在Lambda代码编辑器页面中)时,它似乎工作得很好,我只收到一封电子邮件。 但是当对象通过PHPSDK上传时,Lambda函数运行两次并发送两封电子邮件,两者都具有不同的消息ID。我尝试了不同的
我可以从AWS SDK创建lambda函数: 但是我如何指定这个函数应该在S3上传时触发呢?
问题内容: 我在AWS中有一个Node 4.3 Lambda函数。我希望能够将文本文件写入S3,并阅读了许多有关如何与S3集成的教程。但是,所有这些都涉及在写入S3之后如何调用Lambda函数。 如何使用节点从Lambda在S3中创建文本文件?这可能吗?亚马逊的文件似乎没有涵盖它。 问题答案: 是的,绝对有可能! 通过选择或更新执行lambda的IAM角色,确保为Lambda函数提供对目标s3存储
我正在尝试使用AWS Lambda/S3构建一个服务,该服务将用户电子邮件作为输入,并输出带有PDF附件的响应电子邮件。我发送给用户的最终PDF是通过将我之前根据输入电子邮件生成的两种PDF合并在一起生成的。架构的完整图见下图。 建筑示意图 我遇到的问题与合并PDF Lambda函数有关,该函数接收类型1和类型2 PDF并生成类型3 PDF。一旦一组完整的类型1和2 PDF准备就绪并在S3中等待,
我实现了AWS Eventbridge规则和Lambda函数的基本组合作为其目标。假设该规则基于所有AWS自动缩放事件创建一个事件,并调用Lambda。当触发现有ASG的缩放操作时,此操作效果良好,但当创建具有相同前缀的新ASG时,规则不会做出反应。旧ASG名称:test-ASG-lc-123新ASG名称:test-ASG-lc-124 甚至可以使用通配符吗?