我已经在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角色在这里发挥作用吗?
答案 0 :(得分:1)
您的情况是:
Bucket-A
中有一个Amazon S3 Account-A
User-A
中有一个IAM用户(Account-A
)Account-B
中运行的Amazon EC2实例Bucket-A
假设实例能够访问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终端节点连接。