作为测试的一部分,我正在尝试还原数据库。备份存在于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存储桶,有人可以指出我的错误之处。 我也将上述策略添加到现有角色中。那是否意味着由于我的实例配置文件(不一致的错误)而无法正常工作
如果我在任何地方出错,请帮助并纠正我。我正在寻找一种角色而非用户身份的解决方案。 预先感谢!
答案 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_KEY
,AWS_ACCESS_KEY_ID
和AWS_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中的文件)。