从不同的AWS帐户访问S3存储桶

时间:2019-03-27 22:16:05

标签: amazon-web-services amazon-s3

作为测试的一部分,我正在尝试还原数据库。备份存在于prod s3帐户上。我的数据库在开发人员帐户中作为ec2实例运行。

谁能告诉我如何从开发者帐户访问prod s3。

步骤:  -我在产品帐户上创建了一个角色,并与开发帐户建立了可信赖的关系  -我为该角色添加了策略。

{

    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::prod"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::prod/*"
        }
    ]
}

在开发人员帐户上,我创建了一个角色并承担了政策

> {   "Version": "2012-10-17",   "Statement": [
>     {
>       "Effect": "Allow",
>       "Action": "sts:AssumeRole",
>       "Resource": "arn:aws:iam::xxxxxxxxx:role/prod-role"
>     }   ] }

但是我无法访问s3存储桶,有人可以指出我的错误之处。 我也将上述策略添加到现有角色中。那是否意味着由于我的实例配置文件(不一致的错误)而无法正常工作

如果我在任何地方出错,请帮助并纠正我。我正在寻找一种角色而非用户身份的解决方案。 预先感谢!

2 个答案:

答案 0 :(得分:1)

您需要从dev帐户承担生产帐户中的角色。调用sts:AssumeRole,然后使用返回的凭据访问存储桶。

您也可以添加存储桶策略,以允许开发者帐户从生产者帐户中读取。在这种情况下,您不需要在产品帐户中使用交叉帐户角色。

答案 1 :(得分:1)

因此,让我们来回顾一下:您想从开发者帐户访问产品桶。
有两种方法可以做到,方法1是您的方法,但是我建议方法2:
方法1 :使用角色。这就是您在上面描述的内容,但是,如果存储桶位于不同的帐户中,则您将无法同步存储桶,因为每次都需要导出不同的访问密钥。您很可能必须将文件从prod存储桶同步到本地fs,然后再从本地fs同步到dev存储桶。
如何执行此操作:
使用角色,在有权访问存储桶的生产帐户上创建角色。此角色的信任关系必须信任分配给ec2实例的dev帐户上的角色。将授予对生产桶的访问权限的策略附加到该角色。完成所有配置后,必须更新dev中的ec2实例角色,以允许您在生产中定义的sts:AssumeRole角色。在dev中的ec2实例上,您需要运行aws sts assume-role --role-arn <the role on prod> --role-session-name <a name to identify the session>。这将给您3个变量AWS_SECRET_ACCESS_KEYAWS_ACCESS_KEY_IDAWS_SESSION_TOKEN。在您的ec2实例上,运行set -a; AWS_SECRET_ACCESS_KEY=${secret_access_key}; AWS_ACCESS_KEY_ID=${access_key_id}; AWS_SESSION_TOKEN=${session_token}。导出这些变量后,您可以运行aws sts get-caller-identity,然后应返回显示您已经在生产中配置的角色。现在,您应该能够将文件同步到本地系统,完成后,取消设置我们设置为env变量的aws键,然后将文件从ec2实例复制到dev中的存储桶中。请注意,这里有两个步骤可以复制它们吗?可能会很烦人-请参阅方法2来避免这种情况:
方法2:更新产品桶策略以信任开发人员帐户-这意味着您可以从开发人员访问产品桶,并执行桶到桶同步/ cp操作。
我强烈建议您采用这种方法,因为这意味着您可以直接在存储桶之间进行复制,而不必同步到本地fs。
为此,您将需要更新生产环境中存储桶上的存储桶策略,以使其具有一个委托人区块,该委托人信任dev的AWS账户ID。例如,将您的产品存储桶策略更新为如下所示:

注意:授予s3:*是不好的,并且不建议授予对帐户概率的完全访问权限,因为具有s3权限的帐户上的任何人现在都可以访问该存储桶,但为简单起见,我将其保留在这里: >

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "Example permissions",
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::DEV_ACC_ID:root"
         },
         "Action": [
            "s3:*"
         ],
         "Resource": [
            "arn:aws:s3:::PROD_BUCKET_NAME",
            "arn:aws:s3:::PROD_BUCKET_NAME/*"
         ]
      }
   ]
}

完成此操作后,请在dev帐户上,将主帖子中的策略附加到dev ec2实例角色(授予s3访问权限的角色)。现在,当您连接到dev实例时,不必导出任何环境变量,只需运行aws s3 ls s3://prodbucket,它便会列出文件。 您可以使用aws s3 sync s3://prodbucket s3://devbucket --acl bucket-owner-full-control在两个存储桶之间同步文件,这应该将所有文件从prod复制到dev,最重要的是应该更新每个文件的ACL,以便开发者拥有它们(这意味着您具有完全访问权限到dev中的文件)。