2017-08-01 35 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日誌中。

相關問題