Amazon web services Amazon S3触发另一个帐户中的Lambda函数

Amazon web services Amazon S3触发另一个帐户中的Lambda函数,amazon-web-services,amazon-s3,aws-lambda,Amazon Web Services,Amazon S3,Aws Lambda,当任何对象进入帐户S3 bucket时,我想在帐户B中运行lambda 但我听说我们只能从同一帐户S3访问Lambda,对于跨帐户S3 Lambda访问,我必须在同一帐户内运行Lambda,并执行另一个触发器,该触发器运行另一帐户Lambda: S3(账户A)->Lambda(账户B)-不可能 S3(账户A)--->Lambda(账户A)--->Lambda(账户B)-可能 有人能帮我选择哪一个吗?如果是这样,如何操作?在新的S3控制台中,转到S3控制台并打开您的存储桶。单击属性选项卡->事件。

当任何对象进入帐户S3 bucket时,我想在帐户B中运行lambda

但我听说我们只能从同一帐户S3访问Lambda,对于跨帐户S3 Lambda访问,我必须在同一帐户内运行Lambda,并执行另一个触发器,该触发器运行另一帐户Lambda:

  • S3(账户A)->Lambda(账户B)-不可能
  • S3(账户A)--->Lambda(账户A)--->Lambda(账户B)-可能

  • 有人能帮我选择哪一个吗?如果是这样,如何操作?

    在新的S3控制台中,转到S3控制台并打开您的存储桶。单击属性选项卡->事件。您需要授予S3调用Lambda函数的权限。请参阅:

    这两个选项都应该是可能的。所以你可以选择第一个选项,这是最低限度的

    使用IAM中的跨帐户访问功能授予Lambda(帐户B)对S3(帐户A)的访问权限

    这是通过在帐户B中创建IAM角色来实现的,该角色被授予帐户a中存储桶的访问权限,并允许Lambda(在帐户B中)承担该角色

    有关更多详细信息,请参阅AWS提供的以下文档

    • [示例2:铲斗]

    我成功地将账户B中的AWS Lambda函数从上传到账户A中的Amazon S3存储桶中触发

    Account-A.S3-bucket -> Account-B.Lambda-function
    
    以下是我所做的:

    • 在帐户A中创建了亚马逊S3存储桶
    • 在帐户B中创建了Lambda函数
    • 通过向Lambda函数添加了一个允许S3 bucket对Lambda函数调用
      Lambda:InvokeFunction
    • 在S3 Bucket中添加了一个Bucket策略,以允许从任何地方访问
      GetObject
      (这应该被进一步锁定,但对于实验来说已经足够了)
    • 为S3存储桶上的
      ObjectCreate(All)
      配置了事件,通过其ARN引用Lambda函数
    • 上传了一个文件到账户-a.S3-bucket
    • 帐户-B.Lambda-功能已成功触发
    然后,我在另一个区域用桶重复了这个实验,结果失败了,我说:

    通知目标服务区域对于bucket location约束无效


    @John的解决方案可行,但我想在他的答案中添加一些步骤

    • S3存储桶和Lambda需要位于同一区域。例如,两者都应该在
      us-east-1
      区域中创建。不同区域会抛出如下错误:
    通知目标服务区域对于bucket location约束无效

    以下是我创建触发器所遵循的步骤:

    Account-A.S3-bucket -> Account-B.Lambda-function
    
  • 从终端切换到Lambda将驻留的Account-B的AWS配置文件
  • 运行以下命令,更改案例的参数:

    aws lambda添加权限\
    --区域{Account-B.Lambda区域,例如us-east-1}\
    --函数名{Account-B.Lambda name}\
    --语句id 1\
    --principal s3.amazonaws.com\
    --操作lambda:InvokeFunction\
    --源arn arn:aws:s3::{Account-A.s3 name}\
    --源帐户{account-A.account-id}\
    --档案{Account-B.profile-name}

  • 在这种情况下,您可能会得到语句id exists error、增量语句id并重新运行命令

  • 转到
    Account-A
    S3bucket和属性选项卡>下的事件
  • 选择添加通知
  • 添加以下字段:

    Name:ObjectCreation
    事件:ObjectCreate(全部)
    发送至:Lambda函数
    Lambda:添加Lambda函数ARN
    Lambda函数ARN:
    您的lambda arn


  • 注意:Lambda函数可能仍会显示错误,但S3存储桶中添加的新对象会触发Lambda和打印(事件)日志出现在Cloudwatch日志中。

    以下是如何以清晰的步骤执行此操作:

    我将(客户帐户)定义为包含S3资源的帐户,“服务帐户”定义为包含Lambda函数的帐户,该函数将访问S3资源

  • 在具有完全S3访问权限的客户帐户上创建假定角色
  • 在指向Lambda ARN的假定角色中创建信任策略
  • 将IAM策略附加到服务帐户上的Lambda执行角色-指向客户帐户/假定角色 (参考资料:)

  • 在客户帐户上的目标S3存储桶上创建对象通知事件,以通知服务帐户上的Lambda ARN。 (参考资料:)


  • {“Sid”:“InvokeLambda”,“Action”:[“lambda:InvokeFunction”],“Resource”:“arn:aws:lambda:us-east-1:AccountB ID:function_name”,“Effect”:“Allow”,“Principal”:{“aws”:“AccountB ID”}}我试图为帐户设置一个bucket,但不允许我得到错误{“Version”:“2012-10-17”,“语句”:{“效果”:“允许”,“操作”:“sts:AssumeRole”,“资源”:“arn:aws:iam::PRODUCTION-ACCOUNT-ID:role/UpdateAPP”}我是否需要将“假定角色策略”附加到帐户B中我的IAM角色?您是否会说此问题与该问题重复?如果是,则要做的事情是将此问题标记为重复问题,并提供到另一个问题的链接。这将使问题进入队列,以便更高级别的代表用户投票决定是否将一个问题作为一个问题关闭另一个的副本。如果不是,请帮助我理解为什么不是。对我来说,这看起来基本上是同一个问题。我添加了getobject策略,但仍然被拒绝访问。此bucket具有读取对象的加密策略。我必须指定加密要通过的任何内容吗?请澄清您的意思”是否有加密策略?您的意思是使用SSE-KMS对对象进行加密?另外,您在执行什么操作以接收拒绝访问消息(is)