2017-08-21 30 views
1

背景:S3跨帳戶的訪問:在閱讀自己的水桶一個對象,由另一個帳戶書面

我有兩個賬號AB。帳戶A擁有一個存儲桶my-bucket。我已經給賬戶B訪問這個桶 - 賬戶B可以從這個桶中讀取對象並將其寫入對象。這是按預期工作的。

但是,帳戶A只能讀取它自己寫入的my-bucket中的那些對象。雖然它可以列出帳戶B寫入的那些對象,但它不能讀取這些對象。

以下是當我嘗試使用AWS CLI以A的AWS配置從my-bucket下載所有對象時所看到的內容。

download: s3://my-bucket/PN1492646400000.csv to tp/PN1492646400000.csv 
download: s3://my-bucket/PN1491264000000.csv to tp/PN1491264000000.csv 
download: s3://my-bucket/PN1493942400000.csv to tp/PN1493942400000.csv 
download failed: s3://my-bucket/PN1503346865232.csv to tp/PN1503346865232.csv An error occurred (AccessDenied) when calling the GetObject operation: Access Denied 
download: s3://my-bucket/PN1495389670000.csv to tp/PN1495389670000.csv 
download: s3://my-bucket/PN1496685403000.csv to tp/PN1496685403000.csv 
download: s3://my-bucket/PN1497945130000.csv to tp/PN1497945130000.csv 
download: s3://my-bucket/PN1500508800000.csv to tp/PN1500508800000.csv 

正如人們所看到的,我可以下載所有的文件,但PN1503346865232.csv(這是使用Java方法putObject寫帳戶B)。

我試過到目前爲止:

我特地到以下兩個問題:

  1. Amazon S3 file 'Access Denied' exception in Cross-Account:一個評論的要求做了putObject與acl,但沒有指定什麼acl
  2. S3: User cannot access object in his own s3 bucket if created by another user:這說明停止帳戶B將對象放入my-bucket而不給予所有權訪問權限。 只是把這個約束幫助我獲得完整的訪問權限嗎?

這是我在將對象放入java代碼時嘗試放置ACL的方式。

AccessControlList acl = new AccessControlList(); 
acl.grantPermission(new CanonicalGrantee(S3_BUCKET_OWNER_ID), Permission.FullControl); 
PutObjectRequest putObjectRequest = new PutObjectRequest(S3_BUCKET, remoteCleanedPrismFilename, fileStream, null) 
         .withAccessControlList(acl); 
s3Client.putObject(putObjectRequest); 

它拋出異常的說法:com.amazonaws.services.s3.model.AmazonS3Exception: Invalid id

問題:

  1. 我不知道我怎麼得到這個ID。它不是aws帳號ID,即10-12位數字嗎?
  2. 即使我找到了這個ID,是否會給這個ACL一樣的bucket-owner-full- control

回答

1

這篇文章有這麼多的意見,但沒有一個單一的答案!

爲了幫助他人,我發佈了一些我從研究中發現的解決方法。在這些變通辦法之後,賬戶A能夠訪問由賬戶B創建的對象。

在帳戶B中運行的java代碼中,我明確將ACL設置爲要創建的對象。

AccessControlList acl = new AccessControlList(); 
acl.grantPermission(new CanonicalGrantee(S3_BUCKET_OWNER_ID), Permission.FullControl); 
PutObjectRequest putObjectRequest = new PutObjectRequest(S3_BUCKET, remoteCleanedPrismFilename, fileStream, null) 
         .withAccessControlList(acl); 
s3Client.putObject(putObjectRequest); 

S3_BUCKET_OWNER_ID這裏是帳戶A的規範的ID。請注意,這不是我們所知道的AWS賬號ID,我不知道一個更好的方式,來發現這一點,比下面

aws s3api get-object-acl --bucket my-bucket --key PN1491264000000.csv --output text --profile accountA 

這仍然是不按我的,我相信一個完美的解決方案存在更好的東西。一旦我找到更好的東西,我會編輯這個答案。

編輯:

典型剷鬥所有者的ID可以發現更優雅如下:

String s3BucketOwnerId = s3Client.getBucketAcl(S3_BUCKET).getOwner().getId(); 
相關問題