use*_*955 1 amazon-s3 amazon-ec2 amazon-web-services amazon-iam
在 VPC 中,我有两个子网,一个是带有一个 EC2 实例的公有子网,另一个是带有 2 个 EC2 实例的私有子网。所有 3 个 EC2 实例都具有相同的 IAM 角色来访问 S3。
如果我登录并运行,公有子网中的EC2实例可以直接访问S3 aws s3 ls。但是,私有子网中的两个 EC2 实例都不能。可能是什么原因?
私有子网中的 EC2 使用接受来自整个 VPC 的流量的安全组。
公共子网中的 EC2 使用接受来自Anywhere 的流量的安全组。
所有 3 个 EC2 实例使用相同的路由表、相同的 NACL、相同的 IAM 角色以及策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果我在私有子网的 EC2 中手动创建凭证配置文件,则它可以登录并访问“aws s3 ls”。
更新: 私有子网的路由表确实有一个 VPC 终端节点。路由表为:
其中,#3表示EC2可以通过VPC端点访问S3。添加 #2 是因为 ELB 位于 EC2 实例前面并且必须访问互联网。
另一个观察结果:如果我在私有子网中启用分配公共 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]:
Run Code Online (Sandbox Code Playgroud)
事实上,您的解决方案在实例具有公共 IP 地址时有效,但在没有公共 IP 地址时无效,这表明该实例实际上位于公共子网中。
事实上,查看“私有子网的路由表”,您可以添加以下行:
2. dest=0.0.0.0/0, target=iGW
Run Code Online (Sandbox Code Playgroud)
这使得子网成为公共子网,因为它指向 Internet 网关。
澄清:
因此,如果您确实希望私有子网成为私有子网,则应从私有子网的路由表中删除上述条目。
接下来,您的请求似乎aws s3 ls没有发送到 VPC 终端节点。这可能是因为您没有将流量发送到s3.us-west-2.amazonaws.com路由表中列出的地址。尝试这个命令:
aws s3 ls --region us-west-2
Run Code Online (Sandbox Code Playgroud)
这会将请求发送到 S3 端点,该端点将通过 VPC 端点进行路由。您应该将所有 S3 命令定向到该区域,因为 VPC 终端节点仅指向配置它的区域。
当您将 EC2 放置在私有子网、网络级别时,它无权访问 S3(不是 IAM 策略的问题)。要允许从私有子网中的 EC2 实例对 S3 进行出站访问,您有以下选项。
在这两种方法中,如果您计划仅允许从私有子网中的 EC2 实例访问 S3,请为 S3 配置 VPC 终端节点。
| 归档时间: |
|
| 查看次数: |
5579 次 |
| 最近记录: |