我们有以下情况: AWS账户A(应用程序)将数据从应用程序写入账户B(数据湖)拥有的S3存储桶。帐户C(报告)中的分析师希望获取数据并在其上构建报告和仪表板。
帐户A可以使用--acl bucket-owner-full-control
将数据写入数据湖,以允许帐户B访问。但是帐户C仍然无法查看和处理数据。
一个(我们看来很糟糕)解决方案是将数据复制到与帐户B相同的位置(覆盖),有效地取得流程中数据的所有权并消除问题。我们不想要它,因为......丑陋
我们尝试在不同的帐户中担任角色,但它并不适用于我们所有的基础架构。例如。通过CLI或控制台进行S3访问是可以的,但在帐户C中使用EMR则不行。此外,我们还有内部部署基础架构(本地任务管理器),这种机制不是一种选择。
维护所有帐户和用户的IAM角色需要付出太多努力。我们的目标是实现自动解决方案,而不是每次添加新用户或帐户时都必须采取行动。
你有什么建议吗?
答案 0 :(得分:1)
您可以通过以下文档进行操作,
https://metacpan.org/pod/wallflower
步骤:
例如,您可以创建S3读者,S3作家并根据它分配权限。
示例假设SAML的角色:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Federated": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:saml-provider/ExampleOrgSSOProvider"},
"Action": "sts:AssumeRoleWithSAML",
"Condition": {"StringEquals": {
"saml:edupersonorgdn": "ExampleOrg",
"saml:aud": "https://signin.aws.amazon.com/saml"
}}
}]
}
希望它有所帮助。
答案 1 :(得分:1)
一种不错的方法是使用存储桶策略,通过提供帐户ARN作为委托人来授予对外部帐户(帐户C)的读取权限。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Grant read access to reporting account",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::insertReportingAccountIdHere:root"
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:GetObject",
"s3:GetObjectAcl"
],
"Resource": [
"arn:aws:s3:::yourdatalakebucket",
"arn:aws:s3:::yourdatalakebucket/*"
]
}
]
}
这使报告帐户可以为其自己的用户管理存储区上的(ListBucket,gGtObject)权限,这意味着您现在可以在帐户C上创建IAM策略,并具有从指定数据湖存储区中获取数据的权限:>
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow reading files from the data lake",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:GetObject",
"s3:GetObjectAcl"
],
"Resource": [
"arn:aws:s3:::yourdatalakebucket",
"arn:aws:s3:::yourdatalakebucket/*"
]
}
]
}
然后,此策略可以附加到所需的任何Account C IAM角色或用户组。例如,您可以将其附加到标准的Developer或Analyst角色上,以授予对大型用户的访问权限,也可以将其附加到服务角色,以使特定服务访问存储桶。
答案 2 :(得分:0)
在我们的案例中,我们使用DataLake帐户(B)中的角色(用于写入(WriterRole)和读取(ReaderRole)访问)解决了该问题。从帐户A写入DataLake时,您的编写者会假设帐户B中的“ WriterRole”具有所需的权限。从帐户C进行读取时,您假定使用“ ReaderRole”。 关于EMR阅读的问题,我们通过使用IAM角色阅读(https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-emrfs-iam-roles.html)的EMRFS解决了