使用Direct Connect对AWS账户进行跨账户访问

时间:2020-01-31 20:05:25

标签: amazon-web-services amazon-s3 amazon-iam amazon-vpc

我已经在AWS上工作了很多年,但是我对某些高级网络概念并不十分了解。

因此,我们有多个AWS账户。他们都没有公共互联网访问权限,但是我们使用Direct Connect进行本地到AWS的连接。

我的帐户A中有一个S3存储桶。 我在帐户A中创建了一个IAM用户以及一个访问/密钥,并授予了该IAM用户s3:PutObject到S3存储桶的权限。

我编写了一个简单的Python脚本,以从本地列出此存储桶中的对象,按预期运行。

然后我在帐户B中运行的EC2实例上执行相同的Python脚本,我得到“ botocore.exceptions.ClientError:调用ListObjects操作时发生错误(AccessDenied):访问被拒绝”。

我是否需要为帐户B中的S3创建VPC端点?跨帐户IAM角色在这里发挥作用吗?

1 个答案:

答案 0 :(得分:1)

您的情况是:

  • 您在Bucket-A中有一个Amazon S3 Account-A
  • 您在User-A中有一个IAM用户(Account-A
  • 您有一个Account-B中运行的Amazon EC2实例
  • 您希望从该EC2实例访问Bucket-A
  • 看来您还可以让EC2实例访问Amazon S3终端节点以进行API调用

假设实例能够访问Amazon S3(由于错误消息涉及权限(这可能来自S3),因此看来是正确的),有两种方法可以进行身份​​验证以访问Bucket-A

选项1:使用帐户A中的IAM用户

从EC2实例到Bucket-A的呼叫时,请使用在Bucket-A中创建的IAM凭据。该请求来自Account-B中的Amazon EC2实例并不重要。实际上,Amazon S3甚至都不知道。 API调用可以来自Internet上的任何地方(包括您的家用计算机或移动电话)。重要的是拨打电话时提供的一组凭据。

如果您使用AWS Command-Line Interface (CLI)进行呼叫,则可以使用User-A(或任何名称)将aws configure --profile user_a凭据另存为配置文件,然后从Account-A中的IAM用户。然后,使用aws s3 ls --profile user_a访问Amazon S3。使用这样的配置文件,您可以在凭据之间切换。

选项2:使用存储桶策略

Amazon S3还可以在存储桶上指定存储桶策略,从而可以授予对该存储桶的访问权限。因此,如果EC2实例正在使用来自Account-B的凭据,则可以添加存储桶策略,以授予来自这些Account-B凭据的访问权限。

假设Amazon EC2实例是通过名为role-b的IAM角色启动的,那么您可以使用这样的存储桶策略:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<Account-B>:role/role-b"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-a/*"
        }
    ]
}

免责声明::以上所有条件均假设您在VPC终端节点/ Amazon S3接入点上没有任何奇怪的策略,或者VPC正在与Amazon S3终端节点连接。