在VPC中,我有两个子网,一个是具有EC2实例的公有子网,另一个是具有2个EC2实例的私有子网。所有3个EC2实例都具有相同的IAM角色来访问S3。
如果我登录并运行aws s3 ls
,公有子网中的EC2实例可以直接访问S3。但是,私有子网中的两个EC2实例都不能。可能是什么原因?
私有子网中的EC2使用接受来自整个VPC的流量的安全组。
公有子网中的EC2使用接受来自 Anywhere 的流量的安全组。
所有3个EC2实例使用相同的路由表,相同的NACL,使用相同的IAM角色,使用策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
如果我在私人子网中的EC2中手动创建凭据配置文件,则可以登录并访问“aws s3 ls”。
更新 私有子网的路由表确实有一个VPC端点。路由表是:
其中,#3表示EC2可以通过VPC端点访问S3。添加#2是因为ELB位于EC2实例的前面并且必须访问Internet。
另一个观察:如果我在私有子网中启用分配公共IP ,然后启动新的EC2实例,则此EC2实例可以访问S3。如果我在私有子网中禁用“分配公共IP”,然后启动新的EC2实例,则新的EC2实例无法访问S3。
顺便说一句,在运行terraform之前,我已经将区域设置为us-west-2:
[ec2-user@ip-XXXXX]$ echo $AWS_DEFAULT_PROFILE
abcdefg
[ec2-user@XXXXX]$ aws configure --profile abcdefg
AWS Access Key ID [****************TRM]:
AWS Secret Access Key [****************nt+]:
Default region name [us-west-2]:
Default output format [None]:
答案 0 :(得分:3)
当实例具有公共IP地址时,您的解决方案可以正常工作,但当不具有公共IP地址时,该解决方案无效,这表明该实例实际上位于公有子网中。
确实,查看“私有子网的路由表”,您可以包含以下行:
2. dest=0.0.0.0/0, target=iGW
这使子网成为公共子网,因为它指向Internet网关。
澄清:
因此,如果您确实希望私有子网属于私有子网,则应从路由表中删除上述条目。
接下来,您aws s3 ls
请求似乎没有被发送到VPC端点。这可能是因为您没有向路由表中列出的s3.us-west-2.amazonaws.com
发送流量。试试这个命令:
aws s3 ls --region us-west-2
这会将请求发送到将通过VPC端点路由的S3端点。您应该将所有S3命令定向到该区域,因为VPC端点仅指向配置它的区域。
答案 1 :(得分:2)
当您将EC2放置在私有子网,网络级别时,它无法访问S3(不是IAM策略的问题)。要允许从私有子网中的EC2实例对S3进行出站访问,您有以下选项。
在这两种方法中,如果您计划仅允许从私有子网中的EC2实例访问S3,请为S3配置VPC端点。