2017-08-01 79 views
1

我想在任何对象进入Account S3 S3存储桶时在帐户B中运行一个lambda。Amazon S3在另一个帐户中触发另一个Lambda函数

但是我听说我们可以从同一个账户S3访问LAMBDA只,跨帐户S3 LAMBDA访问我必须同一帐户中运行的Lambda和做它运行的另一个帐户LAMBDA另一个触发:

  1. S3 (帐户A) - > LAMBDA(帐户B) - 不可能
  2. S3(帐户A) - > LAMBDA(帐户A) - > LAMBDA(帐户B) - 可能

谁能帮我哪种选择是可能的?如果是这样如何?

回答

0

在新的S3控制台中,转到S3控制台并打开您的存储桶。点击属性选项卡 - >事件。您需要授予S3权限才能调用Lambda函数。请参考:configure Amazon s3 bucket to run Lambda function created in another account

+0

难道你不会说这个问题是这个问题的重复?如果是这样,要做的事情就是将这个问题标记为重复并提供到另一个的链接。这会让问题排在更高的代表用户的投票之上,以决定是否将一个问题作为另一个问题的副本来结束。如果没有,请帮我理解为什么不。这对我来说基本上是一样的问题。 –

0

两种选择都应该是可行的。所以你可以选择第一个选项,它是简约的。

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

这是通过在帐户B中创建一个IAM角色来实现的,该帐户被授予加入帐户A中的存储区并允许由Lambda(帐户B)承担。

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

+0

{ \t \t \t “SID”: “InvokeLambda”, \t \t \t “操作”:[ \t \t \t \t “拉姆达:InvokeFunction” \t \t \t], \t \t \t “资源”:“ARN :aws:lambda:us-east-1:AccountB-ID:function_name“, \t \t \t”Effect“:”Allow“, \t \t \t “校长”:{ \t \t \t \t “AWS”: “AccountB-ID” \t \t \t} \t \t} – sandeep

+1

我试图把上述政策的帐户一桶,但它没有让我感到收到错误 – sandeep

+0

{ “版本”: “2012年10月17日”, “声明”:{ “效果”: “允许”, “行动”: “STS:AssumeRole”, “资源”:“阿尔恩:aws:iam :: PRODUCTION-ACCOUNT-ID:role/UpdateAPP“ } } 我是否需要将Assume Role策略附加到帐户B中的IAM角色? – sandeep

2

我设法成功触发在账户A.在账户B中的AWS lambda函数从上传到一个Amazon S3桶

Account-A.S3-bucket -> Account-B.Lambda-function 

这是我做的:

  • 创建的亚马逊S3桶在帐户A
  • 创建的lambda函数在帐户B
  • 添加一个Resource-Based Policy for AWS Lambda到经由允许S3桶调用lambda:InvokeFunction上拉姆达的AWS Command-Line Interface (CLI) lambda函数功能
  • 向S3存储桶添加了一个存储桶策略以允许从任何地方访问GetObject(这应该进一步锁定,但足以用于实验)
  • 在S3桶构成的事件ObjectCreate (All)经由其ARN
  • 上传文件到帐户-A.S3斗
  • 账户-B引用lambda函数。拉姆达函数成功触发

然后我重复了桶实验在不同的区域,但是失败,他说:

通知目的地的服务区域是无效的水桶位置约束

+0

我无法将GetObject访问权限添加到存储桶中,出现错误 – sandeep

+0

我添加了getobject策略,但仍然拒绝访问。 这个存储桶有加密策略来读取对象我必须指定任何加密通过? – sandeep

+0

你能否澄清一下你的意思是“有加密策略”?你的意思是这些对象是用SSE-KMS加密的吗?另外,你在做什么接收到拒绝访问消息(它是否在Lambda函数中)?随意编辑您的问题以添加更多详细信息。 –

0

@ John's Solution的工作原理,但我想在他的答案中增加一些步骤。

  • S3桶和LAMBDA需要在同一个区域中。例如,两者都应在us-east-1区域创建。不同的地区会抛出如下的错误:

通知目的地的服务区域是无效的段位置约束

下面是我跟着创建触发器的步骤:

Account-A.S3-bucket -> Account-B.Lambda-function 
  1. 从终端切换到帐户B的AWS配置文件,其中Lambda将驻留
  2. 运行下面的命令,修改参数的情况下:

    aws lambda add-permission \ --region {Account-B.Lambda region Eg. us-east-1} \ --function-name {Account-B.Lambda name} \ --statement-id 1 \ --principal s3.amazonaws.com \ --action lambda:InvokeFunction \ --source-arn arn:aws:s3:::{Account-A.S3 name} \ --source-account {Account-A.account-id} \ --profile {Account-B.profile-name}

你可能会得到声明-ID在这种情况下再存在错误,增量声明-ID,并重新运行命令。

  1. 转到Account-AS3桶和下属性的标签>下活动
  2. 选择添加通知
  3. 添加以下字段:

    Name: ObjectCreation Events: ObjectCreate (All) Send to: Lambda function Lambda: Add Lambda function ARN Lambda function ARN: your-lambda-arn

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